一、ollama部署deepseek模型
1、Ollama 是一个开源的本地大语言模型运行框架,专为在本地机器上便捷部署和运行大型语言模型(LLM)而设计。
Ollama 教程:从 0 到 1 全面指南 教程【全文两万字保姆级详细讲解】 -CSDN博客
1.下载ollama
Download Ollama on Linux
但是一般都下载不成功,因为服务器是国外的服务器。(需要翻墙)
2.安装ollama部署工具
gec@PC-20240429TQJF:003-deepseek服务器与cjson解析$ sudo tar -xvf ollama-linux-amd64.tgz -C / #解压部署工具到根目录
gec@PC-20240429TQJF:003-deepseek服务器与cjson解析$ ollama serve
3.下载deepseek 模型
deepseek-r1:1.5b #使用最小的模型测试即可,若不满足,可再升级。
ollama run deepseek-r1:1.5b
⚠️注意:下载模型前必须运行ollama服务器
下载界面如下👇
4.开启远程通信功能
#开启监听所有网卡
echo 'export OLLAMA_HOST="0.0.0.0"' >> ~/.bashrc
echo 'export OLLAMA_ORIGINS="*"' >> ~/.bashrc#重启加载脚本
source ~/.bashrc#重启服务器
ollama serve提示:修改端口使用下述语句
ollama serve --port 8080提示:启动gpu加速
ollama serve --gpu
测试远程远程服务器是否开启

二、ollama API接口使用
ollama/docs/api.md at main · ollama/ollama · GitHub ⭐官方手册
API 参考文档 -- Ollama 中文文档|Ollama官方文档 中文文档
普通流式请求
curl http://localhost:11434/api/generate -d '{"model": "llama3.2", 👈请求模型"prompt": "Why is the sky blue?"
}'
包体参数说明
model: (required) the model name 请求的模型
prompt: the prompt to generate a response for 问题修改为请求deepseek模型
curl http://localhost:11434/api/generate -d '{"model": "deepseek-r1:1.5b", 👈请求模型"prompt": "为什么天空是蓝色的?" 👈请求的问题
}'-----------------------非流式请求-------------------------------
curl http://localhost:11434/api/generate -d '{"model": "deepseek-r1:1.5b","prompt": "如何提升篮球技术","stream": false 👈关闭流式输出
}'----------以json数据返回-------------
curl http://localhost:11434/api/generate -d '{"model": "deepseek-r1:1.5b","prompt": "What color is the sky at different times of the day? Respond using JSON","format": "json", 👈json格式"stream": false
}'
在线API接口 首次调用 API | DeepSeek API Docs
三、HTTP_C请求模型
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>#define PORT 11434 // http服务器端口号
#define SERVER_IP "192.168.63.1" // http服务器IP地址
#define BUFFER_SIZE 4096 * 10int main(int argc, char const *argv[])
{if (argc != 2){printf("Usage: %s <prompt>\n", argv[0]);return 1;}int sock = 0;struct sockaddr_in serv_addr;char buffer[BUFFER_SIZE] = {0};// 1.创建 socketif ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0){printf("\n Socket creation error \n");return -1;}serv_addr.sin_family = AF_INET;serv_addr.sin_port = htons(PORT); // 设置端口号serv_addr.sin_addr.s_addr = inet_addr(SERVER_IP); // 设置IP地址// 2.连接到服务器if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0){printf("\nConnection Failed \n");return -1;}/*使用命令请求curl http://192.168.63.1:11434/api/generate -d '{"model": "deepseek-r1:1.5b","prompt": "如何提升篮球技术","stream": false 👈关闭流式输出}'*/// 构造 HTTP 请求体(关闭流式响应)char request_body[1024] = {0};snprintf(request_body, 1024, "{\"model\": \"deepseek-r1:1.5b\", \"prompt\": \"%s\", \"stream\": false}", argv[1]);// 请求头char request_headers[256] = {0};snprintf(request_headers, sizeof(request_headers),"POST /api/generate HTTP/1.1\r\n""Host: 192.168.128.196:11434\r\n""Content-Type: application/json\r\n""Content-Length: %zu\r\n""\r\n",strlen(request_body));// 请求协议char request[4096] = {0};snprintf(request, sizeof(request), "%s%s", request_headers, request_body);// 发送请求send(sock, request, strlen(request), 0);printf("Request sent:\n%s\n", request);while (1){// 接收响应int valread = read(sock, buffer, BUFFER_SIZE);if (valread > 0){printf("Response:\n%s\n", buffer);}else{printf("Failed to receive response.\n");}}// 关闭 socketclose(sock);return 0;
}
四、⭐json 数据解析
1、json基本概念
JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation)
JSON 是轻量级的文本数据交换格式JSON 独立于语言:JSON 使用 Javascript语法来描述数据对象,
但是 JSON 仍然独立于语言和平台。JSON 解析器和 JSON 库支持许多不同的编程语言。
目前非常多的动态(PHP,JSP,.NET)编程语言都支持 JSON ,JSON 具有自我描述性,更易理解json的基本概念:
对象:由一对花括号,括起来的数据就是一个对象 { } ,一个对象中包含,key与value。
键/值: json数据中每一个key(键)对应一个value(值)。
数组:由中括号[],括起来的数据就是数组 ,例如:[1,2,3,4,5]; 👉 {"name":"小明"} ,这就是一个json数据,该对象中包含一个key和一个value
👉 {"name":"小明", "age":18,"phone":"1314666"} ,这就是一个json数据,有3个key对应3个value 对象中可以继续包含对象
{"name": "张三","age": 30,"address": {"street": "中山路","city": "北京","postalCode": "100000"}
}
先看最外层只有 3 个key和3个value
{"name": "张三","age": 30,"address": Object{...}
}
再看内层,内层中也是3个key和3个value
{"street": "中山路","city": "北京","postalCode": "100000"
}
JSON在线解析格式化验证 - JSON.cn
2、json 数据解析
1.下载json库
GitHub - DaveGamble/cJSON: Ultralightweight JSON parser in ANSI C
2.json源码的使用
3json 函数接口
/*返回json版本信息*/
const char* cJSON_Version(void);//把字符串数据转换为json对象
cJSON * cJSON_Parse(const char *value); //⭐
value:需要转换的字符串数据
返回值:成功 json对象 失败 NULL //通过key获取value
cJSON *cJSON_GetObjectItem(const cJSON * const object, const char * const string); //⭐
object:json对象
string:key(键)
返回值:成功 value(值) 失败 NULL /* Check item type and return its value */
char * cJSON_GetStringValue(const cJSON * const item); //把value转换为字符串 //⭐
double cJSON_GetNumberValue(const cJSON * const item); //把value转换为整形值 //⭐//获取当前数组元素的个数
int cJSON_GetArraySize(const cJSON *array); //⭐//获取数组下标对应元素
cJSON * cJSON_GetArrayItem(const cJSON *array, int index); //⭐
例子;
#include <stdio.h>
// 添加json解析头文件
#include "cJSON.h"int main()
{// 调用json接口const char *ver = cJSON_Version();printf("ver=%s\n", ver);char str1[] = "{""\"person\": {""\"name\": \"小明\",""\"age\": 25,""\"city\": \"北京\",""\"contact\": {""\"email\": \"xiaoming@example.com\",""\"phone\": \"123-456-7890\"""},""\"education\": {""\"degree\": \"Bachelor\",""\"major\": \"Computer Science\",""\"university\": \"Tsinghua University\"""},""\"residence\": {""\"address\": \"北京市朝阳区\",""\"type\": \"公寓\",""\"owned\": false""}""}""}";//外层1个key,第二层有6个key// 通过key来获取value//将字符串转换为置json对象cJSON *str1_obj = cJSON_Parse(str1);//第一层,通过key提取出来的是一个对象cJSON *small_obj = cJSON_GetObjectItem(str1_obj, "person");//第二层,cJSON *value = cJSON_GetObjectItem(small_obj, "name");printf("name=%s\n", cJSON_GetStringValue(value));cJSON *value1 = cJSON_GetObjectItem(small_obj, "age");printf("age=%.2f\n", cJSON_GetNumberValue(value1));cJSON *value2 = cJSON_GetObjectItem(small_obj, "city");printf("city=%s\n", cJSON_GetStringValue(value2));// 第三层cJSON *small_obj1 = cJSON_GetObjectItem(small_obj, "contact");cJSON *value3 = cJSON_GetObjectItem(small_obj1, "email");printf("email=%s\n", cJSON_GetStringValue(value3));cJSON *value4 = cJSON_GetObjectItem(small_obj1, "phone");printf("phone=%s\n", cJSON_GetStringValue(value4));cJSON *small_obj2 = cJSON_GetObjectItem(small_obj, "education");cJSON *value5 = cJSON_GetObjectItem(small_obj2, "degree");printf("degree=%s\n", cJSON_GetStringValue(value5));cJSON *value6 = cJSON_GetObjectItem(small_obj2, "major");printf("major=%s\n", cJSON_GetStringValue(value6));cJSON *value7 = cJSON_GetObjectItem(small_obj2, "university");printf("university=%s\n", cJSON_GetStringValue(value7));cJSON *small_obj3 = cJSON_GetObjectItem(small_obj, "residence");cJSON *value8 = cJSON_GetObjectItem(small_obj3, "address");printf("address=%s\n", cJSON_GetStringValue(value8));cJSON *value9 = cJSON_GetObjectItem(small_obj3, "type");printf("type=%s\n", cJSON_GetStringValue(value9));cJSON *value10 = cJSON_GetObjectItem(small_obj3, "owned");printf("owned=%s\n", cJSON_GetStringValue(value10));}