一、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));}