詳解如何在.NET代碼中使用本地部署的Deepseek語(yǔ)言模型
本篇咱們來(lái)聊一聊怎么在 .NET 代碼中使用本地部署的 Deepseek 語(yǔ)言模型。大伙伴們不必要緊張,很簡(jiǎn)單的,你不需要學(xué)習(xí)新知識(shí),只要你知道 .NET 如何訪問(wèn) HTTP 和 JSON 的序列化相關(guān)就夠了。
先說(shuō)說(shuō)如何弄本地模型,有伙伴會(huì)問(wèn):直接用在線的不好?其實(shí),本地部署更實(shí)用,也更符合安全要求。其實(shí),AI 真正用于生產(chǎn)環(huán)境反而不需要那么“強(qiáng)大”,能有行業(yè)化定制模型會(huì)更好,這樣在專業(yè)領(lǐng)域的預(yù)測(cè)算法更準(zhǔn)確;只有用于娛樂(lè)產(chǎn)業(yè)才需要“面面俱到”。
網(wǎng)上關(guān)于本地化部署的教程太多了,所以老周只是簡(jiǎn)單描述一下。而且,老周也相信大伙伴們的能力,連代碼都會(huì)寫了,怎么會(huì)搞不定這些活兒呢?
1、安裝 Ollama,官網(wǎng):Ollama。各位注意,這年頭下載軟件一定要看清楚是不是官網(wǎng),現(xiàn)在國(guó)內(nèi)很多冒充官網(wǎng)騙錢的,所以,看好域名很重要(比如,OBS、VS Code 等也有很多假域名)。Ollama 就是專門用于調(diào)用 LLM 的工具,它會(huì)啟動(dòng)本地服務(wù)器(Web),通過(guò) Web API 方式交互。該工具是跨平臺(tái)的,使用 C 和 Go 語(yǔ)言開發(fā),性能上不用擔(dān)心,它不是用某腳本語(yǔ)言開發(fā)的。這個(gè)下載后直接安裝就完事了,無(wú)難度。
2、先不急著下載模型,看看你的 C 盤空間夠不夠下載模型,不夠的話,請(qǐng)配置一下 OLLAMA_MODELS 環(huán)境變量,指向你要存放模型的目錄。這個(gè)都會(huì)配置了,不用老周說(shuō)了吧,基于用戶和基于機(jī)器的環(huán)境變量都可以。
Ollama 默認(rèn)啟動(dòng) Web 服務(wù)器的本地地址是 http://127.0.0.1:11434,如果端口有沖突,可以用 OLLAMA_HOST 環(huán)境變量自己配置一下。沒(méi)其他要求,就按默認(rèn)就行了,不用配置。配置時(shí)要寫上完整的 HTTP 地址,如 http://192.168.1.15:8819。這個(gè)你看看源代碼就知道為什么要寫完整 URL 了。
func Host() *url.URL { defaultPort := "11434" s := strings.TrimSpace(Var("OLLAMA_HOST")) scheme, hostport, ok := strings.Cut(s, "://") switch { case !ok: scheme, hostport = "http", s case scheme == "http": defaultPort = "80" case scheme == "https": defaultPort = "443" } hostport, path, _ := strings.Cut(hostport, "/") host, port, err := net.SplitHostPort(hostport) if err != nil { host, port = "127.0.0.1", defaultPort if ip := net.ParseIP(strings.Trim(hostport, "[]")); ip != nil { host = ip.String() } else if hostport != "" { host = hostport } } if n, err := strconv.ParseInt(port, 10, 32); err != nil || n > 65535 || n < 0 { slog.Warn("invalid port, using default", "port", port, "default", defaultPort) port = defaultPort } return &url.URL{ Scheme: scheme, Host: net.JoinHostPort(host, port), Path: path, } }
3、第一次啟動(dòng)大語(yǔ)言模型需要下載,在 Ollama 官網(wǎng)進(jìn)入“Models”頁(yè)面,你基本不用找了,現(xiàn)在最熱門的就是它了。
點(diǎn)擊模型鏈接,進(jìn)入詳細(xì)頁(yè)。下拉列表能看到模型大小,視你的 CPU 或 GPU 配置來(lái)選吧。
老周的機(jī)器 CPU 是 i5-11400F,跑 8B 問(wèn)題不大(顯卡是 4G 顯存),回答問(wèn)題一般要二三十秒,能接受。如果你不確定,可以從 7B 開始測(cè)試。頁(yè)面向下滾動(dòng)會(huì)告訴你命令行怎么用,比如,要下載7B的模型,執(zhí)行命令 ollama run deepseek-r1:7b。
模型名稱后面有個(gè)冒號(hào),之后是模型的大小。執(zhí)行后就是坐和等待。下載時(shí)間取決于網(wǎng)速和運(yùn)氣。
4、下載完后,你就可以問(wèn) Deepseek 問(wèn)題了,輸入問(wèn)題,回車就行了。你關(guān)閉了控制臺(tái),手動(dòng)啟動(dòng)的方法就是上面下載模型的命令(只想下載,不運(yùn)行,可以將 run 替換為 pull),ollama run XXXX:7B,但這次它不會(huì)再下載了,而是直接啟動(dòng)。
好了,準(zhǔn)備工作結(jié)束,下面正片開始。
和調(diào)用一般 Web API 一樣,HTTP 協(xié)議,JSON 格式。要和模型交互,會(huì)用到兩個(gè)API。
1、單次對(duì)話(你問(wèn),它回答,類似搜索,這種較常用)。
POST /api/generate
要提交的JSON一般只需要三個(gè)參數(shù)(其他你可以看文檔,其實(shí)有些參數(shù)老周也沒(méi)看懂):
model:LLM 模型的名稱,畢竟 Ollama 可以下載多種模型,所以要指定模型,如 deepseek-r1:7b;
prompt:你要問(wèn)它的問(wèn)題,比如“何不食肉糜?”;
stream:是否啟用流式傳輸。如果是 false,你發(fā)出請(qǐng)求后,要等到所有回答內(nèi)容生成后,一次性返回。如果是 true,可以分塊返回,不必等到全部生成你就可以讀了。
返回的 JSON 對(duì)象中,response 字段就是 LLM 回答你的內(nèi)容,如果是流式返回,最后一段回復(fù)的 done 字段會(huì)為 true,其他片段為 false。
2、聊天模式
POST /api/chat
請(qǐng)求的 JSON 常用的字段和上面單次對(duì)話一樣,但 prompt 字段換成 messages 字段。此字段是數(shù)組類型,包含多個(gè)對(duì)象,代表聊天記錄。其中,role 代表角色,你是 user,AI是 assistant。content 代表聊天消息內(nèi)容。在調(diào)用時(shí),可以把前面的聊天記錄放進(jìn) messages 數(shù)組。
{ "model": "deepseek-r1:32b", "stream": false, "messages": [ { "role": "user", "content": "你好啊" }, { "role": "assistant", "content": "我不好" }, { "role": "user", "content": "為什么不好?" } ] }
返回的 JOSN 對(duì)象中,message 字段就是新的聊天記錄(一般是 AI 回復(fù)你的)。
好了,知識(shí)就介紹到這兒,下面咱們要實(shí)際操作了。先聲明一下:Ollama API 的調(diào)用是有專門的 Nuget 包的,都封裝好的,你不需要自己干活。不過(guò),為了讓大伙伴們好理解,老周下面的演示暫不使用 Nuget 包。
先來(lái)個(gè)簡(jiǎn)單的,關(guān)閉流模式。
internal class Program { // 請(qǐng)求URL const string BS_URL = "http://127.0.0.1:11434"; // API路徑 const string API_GEN = "/api/generate"; static async Task Main(string[] args) { using HttpClient client = new(); // 設(shè)置基址 client.BaseAddress = new Uri(BS_URL); // 請(qǐng)求數(shù)據(jù) string senddata = """ { "model": "deepseek-r1:8b", "prompt": "黃河有多長(zhǎng)?", "stream": false } """; StringContent content = new(senddata, Encoding.UTF8, new MediaTypeHeaderValue("application/json")); HttpRequestMessage msg = new HttpRequestMessage() { Method = HttpMethod.Post, Content = content }; // 設(shè)置相對(duì)的URL即可 msg.RequestUri = new Uri(API_GEN, UriKind.Relative); // 發(fā)送請(qǐng)求,并讀取響應(yīng)消息 HttpResponseMessage respmsg = await client.SendAsync(msg); if (respmsg.IsSuccessStatusCode) { string json_back = await respmsg.Content.ReadAsStringAsync(); Console.WriteLine("-------------- 返回的JSON ----------------\n"); Console.WriteLine(json_back); } } }
代碼運(yùn)行后,需要等待一段時(shí)間。請(qǐng)求返回后,將得到以下 JSON:
{ "model": "deepseek-r1:8b", "created_at": "2025-02-23T05:12:46.9156624Z", "response": "\u003cthink\u003e\n嗯,用戶問(wèn)“黃河有多長(zhǎng)?”首先,我得回想一下黃河的基本信息。黃河是中國(guó)的一條重要河流,發(fā)源于青藏高原,流經(jīng)華北平原,注入渤海灣。\n\n接下來(lái), 我需要確定黃河的長(zhǎng)度。我記得它被稱為“九曲黃河”,這可能是因?yàn)樗泻芏鄰澢暮拥馈8鶕?jù)我所知道的資料,黃河的總長(zhǎng)大約在5463公里左右。不過(guò),這個(gè)數(shù)字好像有點(diǎn)問(wèn)題,因?yàn)橛行┵Y料會(huì)提到水系更長(zhǎng)的情況,比如包括支流在內(nèi)。\n\n另外,我還需要考慮用戶為什么會(huì)問(wèn)這個(gè)問(wèn)題。也許他們是在做研究、寫作業(yè),或者只是出于好奇。我應(yīng)該確認(rèn)一下數(shù)據(jù)的準(zhǔn)確性,避免誤導(dǎo)用戶。如果有時(shí)間的話,最好核實(shí)一下最新的資料,但目前我只能依據(jù)已有的信息回答。\n\n在解釋時(shí),我會(huì)提到黃河的重要性,比如它對(duì)中國(guó)歷史、文化的影響,以及作為水資源的重要性。這不僅能滿足用戶的基本問(wèn)題,還能提供更多背景信息,讓回答更豐富。\n\n最后,考慮到用戶可能需要進(jìn)一步了解,可以建議他們查閱最新的地理資料或相關(guān)文獻(xiàn),以確保得到準(zhǔn)確的數(shù)據(jù)和詳細(xì)的信息。\n\u003c/think\u003e\n\n黃河的長(zhǎng)度約為5,463公里(3,455英里),它是中國(guó)最長(zhǎng)的河流之一,從青藏高原的瑪旁雍措開始,經(jīng)過(guò)九曲,最終注入渤海灣。", "done": true, "done_reason": "stop", "context": [...], "total_duration": 46687936200, "load_duration": 6910762400, "prompt_eval_count": 9, "prompt_eval_duration": 1643000000, "eval_count": 347, "eval_duration": 38128000000 }
其中,response 字段就是模型所回答的內(nèi)容。done: true 表示所有回復(fù)已完成。
當(dāng)流模式關(guān)閉時(shí),響應(yīng)消息是一次性返回的。下面咱們開啟流模式,看會(huì)發(fā)生什么。
internal class Program { // 請(qǐng)求URL const string BS_URL = "http://127.0.0.1:11434"; // API路徑 const string API_GEN = "/api/generate"; static async Task Main(string[] args) { using HttpClient client = new(); // 設(shè)置基址 client.BaseAddress = new Uri(BS_URL); // 請(qǐng)求數(shù)據(jù) string senddata = """ { "model": "deepseek-r1:8b", "prompt": "人為什么不能有兩個(gè)頭?", <strong>"stream": true</strong> } """; StringContent content = new(senddata, Encoding.UTF8, new MediaTypeHeaderValue("application/json")); HttpRequestMessage msg = new HttpRequestMessage() { Method = HttpMethod.Post, Content = content }; // 設(shè)置相對(duì)的URL即可 msg.RequestUri = new Uri(API_GEN, UriKind.Relative); // 發(fā)送請(qǐng)求,并讀取響應(yīng)消息 HttpResponseMessage respmsg = await client.SendAsync(msg, <strong>HttpCompletionOption.ResponseHeadersRead</strong>); if (respmsg.IsSuccessStatusCode) { <strong>StreamReader reader </strong><strong>= new(await respmsg.Content.ReadAsStreamAsync()); </strong> string? line; while( (line = <strong>reader.ReadLine()</strong>) != null ) { Console.WriteLine(line); } } } }
使用流模式后,有幾個(gè)地方要改:
1、POST 的內(nèi)容中,stream 字段要設(shè)置為 true;
2、調(diào)用 HttpClient.SendAsync 方法時(shí),要指定 HttpCompletionOption 枚舉值 ResponseHeadersRead,它表示:客戶端不需要等到所有響應(yīng)都完成,只要讀到 Header 就可以返回;
3、以流的方式讀取,所以為了方便一行一行地讀,需要?jiǎng)?chuàng)建一個(gè) StreamReader 實(shí)例。因?yàn)榉謪^(qū)返回的 JSON 文本之間會(huì)有換行符,所以,咱們可以一行一行地讀。
運(yùn)行后你會(huì)發(fā)現(xiàn),響應(yīng)消息是幾個(gè)字幾個(gè)字地返回,這樣模擬它的思考過(guò)程,即返回多個(gè) JSON 對(duì)象。
{"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:26.8283737Z","response":"\u003cthink\u003e","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:26.935257Z","response":"\n","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:27.0400684Z","response":"嗯","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:27.1481036Z","response":",","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:27.2553207Z","response":"為什么","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:27.361141Z","response":"人類","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:27.4645525Z","response":"不能","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:27.5709536Z","response":"像","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:27.678601Z","response":"一些","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:27.7789896Z","response":"科","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:27.8843042Z","response":"幻","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:27.9865743Z","response":"作品","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:28.0981338Z","response":"中","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:28.2029637Z","response":"那樣","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:28.3082135Z","response":"擁有","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:28.409586Z","response":"兩個(gè)","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:28.51381Z","response":"頭","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:28.6184175Z","response":"呢","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:28.7219117Z","response":"?","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:28.825078Z","response":"這","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:28.9296468Z","response":"聽","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:29.0311444Z","response":"起來(lái)","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:29.1316079Z","response":"似乎","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:29.2358219Z","response":"是不","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:29.3398343Z","response":"可能","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:29.4403529Z","response":"的","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:29.5484937Z","response":",但","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:29.655022Z","response":"我","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:29.7581549Z","response":"想","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:29.8581566Z","response":"深","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:29.9648745Z","response":"入","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:30.0696775Z","response":"探","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:30.1753713Z","response":"討","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:30.27877Z","response":"一下","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:30.3833475Z","response":"這個(gè)","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:30.4894236Z","response":"問(wèn)題","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:30.5940864Z","response":"。","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:30.6990377Z","response":"首","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:30.8045853Z","response":"先","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:30.9119286Z","response":",我","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:31.0145369Z","response":"需要","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:31.1199967Z","response":"了解","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:31.2210625Z","response":"一下","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:31.3265552Z","response":"人的","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:31.4297025Z","response":"身體","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:31.5367356Z","response":"結(jié)構(gòu)","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:31.6424456Z","response":"。","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:31.7482556Z","response":"我們","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:31.8530019Z","response":"知道","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:31.9602229Z","response":",","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:32.0648399Z","response":"人","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:32.1710681Z","response":"體","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:32.2750219Z","response":"是","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:32.3830126Z","response":"由","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:32.4867969Z","response":" skull","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:32.5913801Z","response":"(","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:32.6956664Z","response":"骨","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:32.9019353Z","response":"骼","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:33.0078236Z","response":")、","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:33.1117008Z","response":" brain","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:33.2166404Z","response":"(","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:33.3208538Z","response":"大","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:33.4293562Z","response":"腦","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:33.5347365Z","response":")","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:33.6400088Z","response":"和","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:33.7457157Z","response":" spinal","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:33.8532486Z","response":" cord","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:33.9605695Z","response":"(","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:34.1659429Z","response":"脊","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:34.3748504Z","response":"髓","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:34.478906Z","response":")","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:34.584636Z","response":"組","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:34.6967087Z","response":"成","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:34.803769Z","response":"的","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:34.9106495Z","response":",這","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:35.0157751Z","response":"些","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:35.121576Z","response":"部分","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:35.2310764Z","response":"一起","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:35.3362608Z","response":"協(xié)","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:35.4423656Z","response":"調(diào)","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:35.5459597Z","response":"我們的","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:35.6509706Z","response":"各種","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:35.7515249Z","response":"生","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:35.8536359Z","response":"理","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:35.9587695Z","response":"功能","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:36.0627881Z","response":"。\n\n","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:36.1715121Z","response":"如果","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:36.272206Z","response":"有人","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:36.378669Z","response":"有","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:36.4843173Z","response":"兩個(gè)","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:36.5874258Z","response":"頭","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:36.6954651Z","response":",每","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:36.8010356Z","response":"個(gè)","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:36.905493Z","response":"頭","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:37.00777Z","response":"都","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:37.1116269Z","response":"必須","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:37.2184941Z","response":"有","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:37.3201941Z","response":"自己的","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:37.4281805Z","response":"大","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:37.5315492Z","response":"腦","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:37.6386404Z","response":"、","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:37.7430066Z","response":"五","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:37.8491178Z","response":"官","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:37.9535378Z","response":"和","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:38.0570105Z","response":"其他","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:38.1610682Z","response":"相關(guān)","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:38.2644939Z","response":"器","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:38.3776018Z","response":"官","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:38.4831233Z","response":"。這","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:38.5933517Z","response":"意味","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:38.6977998Z","response":"著","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:38.8058307Z","response":"雙","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:38.909728Z","response":"倍","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:39.012905Z","response":"的","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:39.1181564Z","response":"腦","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:39.2267474Z","response":"細(xì)胞","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:39.332114Z","response":"、","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:39.4392176Z","response":"雙","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:39.5447259Z","response":"倍","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:39.6503374Z","response":"的","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:39.7568585Z","response":"神","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:39.8659305Z","response":"經(jīng)","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:39.9700241Z","response":"系統(tǒng)","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:40.0779745Z","response":",","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:40.1827389Z","response":"可能","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:40.2906107Z","response":"還","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:40.3955068Z","response":"需要","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:40.5038202Z","response":"額","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:40.6077525Z","response":"外","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:40.7152217Z","response":"的","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:40.8227528Z","response":"血","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:40.9330314Z","response":"液","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:41.039979Z","response":"供應(yīng)","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:41.1470584Z","response":"和","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:41.2517911Z","response":"營(yíng)","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:41.3626235Z","response":"養(yǎng)","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:41.4682837Z","response":"吸","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:41.5776612Z","response":"收","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:41.6860285Z","response":"。","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:41.7945814Z","response":"這些","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:41.9013114Z","response":"額","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:42.0085381Z","response":"外","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:42.1138961Z","response":"的","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:42.2228489Z","response":"需求","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:42.3295525Z","response":"對(duì)于","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:42.4358337Z","response":"身體","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:42.5415029Z","response":"來(lái)說(shuō)","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:42.6485295Z","response":"是","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:42.7545516Z","response":"不是","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:42.866291Z","response":"太","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:42.9704037Z","response":"大","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:43.0771629Z","response":"了","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:43.1825152Z","response":"?","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:43.2885031Z","response":"也","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:43.3968687Z","response":"許","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:43.5034444Z","response":"在","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:43.6073514Z","response":"生","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:43.7134798Z","response":"理","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:43.817739Z","response":"上","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:43.9249076Z","response":"是","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:44.0288525Z","response":"不可","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:44.1364566Z","response":"行","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:44.2419482Z","response":"的","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:44.353196Z","response":"。\n\n","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:44.4604554Z","response":"再","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:44.5697433Z","response":"想","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:44.6773892Z","response":"想","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:44.7869962Z","response":",大","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:44.8917627Z","response":"腦","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:44.999083Z","response":"是","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:45.1022087Z","response":"大","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:45.2073669Z","response":"型","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:45.3130991Z","response":"的","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:45.4191818Z","response":"器","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:45.5240951Z","response":"官","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:45.6312206Z","response":",它","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:45.7367736Z","response":"占","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:45.8447533Z","response":"據(jù)","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:45.9490732Z","response":"了","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:46.0541405Z","response":"頭","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:46.1579005Z","response":"部","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:46.2673471Z","response":"的大","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:46.3708109Z","response":"部分","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:46.4779368Z","response":"空間","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:46.583351Z","response":"。如果","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:46.6928431Z","response":"有","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:46.7992793Z","response":"兩個(gè)","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:46.9084686Z","response":"頭","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:47.0124934Z","response":",每","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:47.11979Z","response":"個(gè)","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:47.2240414Z","response":"頭","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:47.3321941Z","response":"都","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:47.439608Z","response":"需要","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:47.5470513Z","response":"一個(gè)","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:47.6525859Z","response":"完整","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:47.7606506Z","response":"的大","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:47.8665934Z","response":"腦","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:47.9784114Z","response":",那","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:48.0841317Z","response":"么","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:48.191451Z","response":"總","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:48.2980576Z","response":"共","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:48.4076043Z","response":"就","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:48.5150721Z","response":"需要","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:48.6243834Z","response":"兩","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:48.7325953Z","response":"塊","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:48.8405749Z","response":"獨(dú)立","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:48.9465845Z","response":"的大","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:49.0549701Z","response":"腦","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:49.1622209Z","response":"。","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:49.269279Z","response":"這種","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:49.3762422Z","response":"情況","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:49.4928995Z","response":"下","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:49.5992815Z","response":",","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:49.7077158Z","response":"如何","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:49.8161646Z","response":"協(xié)","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:49.9271731Z","response":"調(diào)","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:50.0356263Z","response":"兩","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:50.1428866Z","response":"塊","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:50.2500634Z","response":"大","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:50.3583688Z","response":"腦","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:50.4648516Z","response":"的","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:50.5754194Z","response":"信息","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:50.6860491Z","response":"交流","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:50.7941721Z","response":"呢","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:50.9044184Z","response":"?","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:51.0084217Z","response":"這","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:51.1113881Z","response":"可能","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:51.2226612Z","response":"會(huì)","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:51.3282565Z","response":"導(dǎo)致","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:51.4382736Z","response":"嚴(yán)","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:51.5415728Z","response":"重","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:51.6461422Z","response":"的","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:51.7528749Z","response":"功能","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:51.8612338Z","response":"沖","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:51.9663524Z","response":"突","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:52.0727179Z","response":"或","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:52.1819698Z","response":"混","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:52.2868654Z","response":"亂","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:52.3969352Z","response":"。\n\n","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:52.5051955Z","response":"另外","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:52.6130004Z","response":",從","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:52.7188501Z","response":"進(jìn)","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:52.8268895Z","response":"化","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:52.9313751Z","response":"和","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:53.0399728Z","response":"自然","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:53.1452842Z","response":"選擇","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:53.2532015Z","response":"的","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:53.3577953Z","response":"角","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:53.4661099Z","response":"度","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:53.5784617Z","response":"來(lái)","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:53.6897647Z","response":"看","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:53.7976552Z","response":",","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:53.9114953Z","response":"人類","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:54.0239694Z","response":"的","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:54.1344666Z","response":"身體","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:54.2399898Z","response":"結(jié)構(gòu)","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:54.3524683Z","response":"已經(jīng)","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:54.467087Z","response":"非常","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:54.5843084Z","response":"優(yōu)","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:54.6916832Z","response":"化","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:54.7987819Z","response":"了","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:54.906161Z","response":"。","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:55.0171672Z","response":"擁有","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:55.1278378Z","response":"兩個(gè)","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:55.2341755Z","response":"頭","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:55.3417097Z","response":"不","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:55.4502543Z","response":"僅","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:55.5563824Z","response":"在","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:55.6665516Z","response":"生","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:55.7779068Z","response":"理","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:55.8908521Z","response":"上","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:55.9967553Z","response":"難","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:52:56.1099532Z","response":"以","done":false} …… {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:53:46.3458122Z","response":"可","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:53:46.4580693Z","response":"行","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:53:46.5710283Z","response":"性","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:53:46.6813578Z","response":"等","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:53:46.7906717Z","response":"多","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:53:46.9060062Z","response":"個(gè)","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:53:47.0186274Z","response":"角","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:53:47.1309257Z","response":"度","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:53:47.2435303Z","response":"來(lái)","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:53:47.3549818Z","response":"看","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:53:47.4657487Z","response":",這","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:53:47.5768398Z","response":"種","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:53:47.6881374Z","response":"現(xiàn)","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:53:47.7962713Z","response":"象","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:53:47.9044614Z","response":"是不","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:53:48.0134716Z","response":"可能","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:53:48.1229904Z","response":"的","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:53:48.234462Z","response":"。","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23T08:53:48.3483199Z","response":"","done":true,"done_reason":"stop","context":[128011,17792,113221,54253,19361,110835,65455,11571,128012,128013,198,116274,3922,113221,124785,54253,66201,113882,70626,111663,106942,16325,126018,123882,110835,65455,104586,11571,44388,50287,106155,113644,126957,88367,9554,102378,37046,101067,102987,17701,106767,112962,111230,103624,87219,1811,61075,61826,101602,86206,114706,111230,105390,111006,113520,1811,98739,104105,3922,17792,33014,21043,68171,35113,10110,110135,101805,120,65459,8271,10110,27384,108851,7705,34208,50112,23125,10110,101171,232,100499,241,7705,41127,13153,9554,103138,98184,105494,109277,107047,48972,125383,120288,21990,22649,99480,3490,63344,115814,19361,110835,65455,116255,19483,65455,72368,112157,19361,107924,27384,108851,5486,76208,102078,34208,93994,79656,32648,102078,110477,115552,100815,104836,98406,9554,108851,125951,5486,104836,98406,9554,101365,54493,73548,3922,88367,98806,86206,62291,48915,9554,104473,107654,126907,34208,104424,107711,107246,51109,1811,108787,62291,48915,9554,119745,117237,111006,117147,21043,103668,101402,27384,35287,11571,75863,104894,19000,21990,22649,17905,21043,109947,23039,9554,3490,88356,101067,101067,112886,108851,21043,27384,25287,9554,32648,102078,115973,108928,16423,35287,65455,34048,112914,105494,118582,119464,19361,110835,65455,116255,19483,65455,72368,86206,48044,126827,112914,108851,106169,82696,60843,55999,81258,86206,78640,107438,118326,112914,108851,1811,106880,106041,17297,3922,109425,107047,48972,78640,107438,27384,108851,9554,28469,113841,104586,11571,44388,88367,38093,124376,109759,30358,9554,99480,110158,104584,58291,107960,108267,3490,122922,113294,42399,33208,34208,109683,51504,9554,64936,27479,37507,52030,3922,124785,9554,111006,113520,104724,108008,91272,33208,35287,1811,123882,110835,65455,16937,110395,19000,21990,22649,17905,105142,23897,112026,97150,108562,51611,110593,5486,21990,25359,50667,108900,75863,48706,6744,116,43240,114099,102778,1811,104836,65455,88367,115552,100815,34226,59464,114223,112914,108851,99480,102378,92672,75863,88367,103652,37507,117724,9554,122530,34208,87219,3490,114002,48044,108900,21043,106222,34208,106581,9554,63212,72238,107644,124785,106222,16325,3922,111006,83799,47523,122503,107693,9554,66378,109568,119464,126550,19361,110835,65455,103138,19000,47551,41073,104654,16325,38093,28190,110547,109098,108199,114099,102778,102836,101307,115624,104587,16937,119237,106075,17701,106222,1811,70626,111663,106942,105363,104836,65455,88367,58666,33208,35287,106880,106041,102378,115827,17905,103138,119938,122793,117237,108306,117147,88367,21043,108008,108631,107202,34208,105142,23897,51611,33764,9554,3490,33091,48915,113294,104696,34208,125044,9554,64936,27479,37507,52030,3922,104251,67178,48044,123882,110835,65455,104123,86206,104584,105150,109098,108199,104696,108502,81802,235,110477,16937,110395,117947,82317,28037,101365,54493,73548,5486,104473,107654,122523,87412,110235,108399,64531,33014,111006,9554,99480,107047,48972,1811,113230,3922,126784,104696,98806,110621,105483,102780,118498,59464,114223,119745,3490,112672,101602,75863,19000,101067,106258,81543,88367,68438,48915,109178,17701,58291,93994,17792,49792,46034,38574,37507,112026,113418,28542,111825,92776,102924,110474,103138,119938,104696,106246,86206,106146,42246,61826,42399,34208,59464,114223,9554,73548,126526,98806,31634,124116,28037,56438,119100,19000,9554,106966,113266,34208,122530,110477,117237,105456,124785,117147,113644,21043,109947,23039,9554,3490,122922,3922,127298,63212,72238,75863,54253,120994,58552,119464,126550,123882,110835,65455,106169,82696,104563,88367,28190,110547,37026,37046,30051,42016,125648,116255,19483,65455,72368,19361,107924,126966,34208,99750,101682,103138,87502,104836,30358,124176,88367,124376,109759,30358,122935,22649,87219,1811,109425,55642,78640,108306,53953,9554,126966,34208,40474,99750,103138,109614,48044,106146,42246,59464,114223,103786,39442,53283,125648,3490,60843,37985,111230,113294,112027,48864,5486,42399,33208,5486,106222,106581,5486,104696,31540,23039,34171,109717,127298,113614,50667,43240,19483,106643,28190,37507,52030,3922,124785,123882,110835,65455,113644,126957,88367,9554,110477,16937,110395,19000,21990,22649,17905,48706,109947,101545,44309,9554,108502,81802,235,116496,19000,106222,34208,127298,17905,75863,103652,117661,109098,108199,114099,102778,1811,109491,101602,112403,17792,21043,54253,19361,110835,65455,9554,115286,44388,115310,105068,35287,112027,48864,106583,108729,53229,47548,104587,105142,23897,112026,104696,106583,59464,114223,105318,9174,128014,271,110747,71689,125456,112696,109806,74770,50928,20834,88852,37985,68931,49543,334,124785,110621,123882,110835,65455,334,3922,104514,46281,112027,48864,5486,42399,33208,5486,106222,106581,34208,104696,31540,23039,34171,50667,43240,19483,64936,27479,37507,52030,103138,87502,47551,47523,126957,88367,9554,1811],"total_duration":87732605300,"load_duration":4663612600,"prompt_eval_count":10,"prompt_eval_duration":1542000000,"eval_count":749,"eval_duration":81522000000}
最后一個(gè) JSON 對(duì)象的 done 字段為 true,表示是最后一個(gè)消息分塊。context 字段中的數(shù)字是用于對(duì)話上下文的,即下一次你向 LLM 發(fā)問(wèn)時(shí),可以把上次返回的 context 放到請(qǐng)求數(shù)據(jù)中,這樣形成基于上下文的推理。不過(guò)這個(gè) context 字段在官方文檔中已標(biāo)記為“過(guò)時(shí)”,以后可能不使用了。所以咱們可以不理會(huì),因?yàn)榭梢允褂昧奶炷J?API(請(qǐng)看上文)。
通過(guò)上面的簡(jiǎn)單演示,相信大伙伴都會(huì)用了。不過(guò)為了方便,咱們可以把請(qǐng)求數(shù)據(jù)封裝一下,通過(guò) JSON 序列化來(lái)調(diào)用,會(huì)更方便。
A、請(qǐng)求消息,主要使用 model、prompt 和 stream 字段。
/// <summary> /// 請(qǐng)求數(shù)據(jù) /// </summary> public class ModelRequest { /// <summary> /// 模型名稱 /// </summary> public string? Model { get; set; } /// <summary> /// 提問(wèn) /// </summary> public string? Prompt { get; set; } /// <summary> /// 是否使用流模式 /// </summary> public bool Stream { get; set; } }
B、返回的JSON封裝,用到 model、response、done 字段。
/// <summary> /// 返回的消息 /// </summary> public class ModelResponse { /// <summary> /// 模型名 /// </summary> public string? Model { get; set; } /// <summary> /// 回復(fù)內(nèi)容 /// </summary> public string? Response { get; set; } /// <summary> /// 是否為最后一個(gè)分塊 /// </summary> public bool Done { get; set; } = false; }
咱們測(cè)試一下流模式。
internal class Program { // 根URL const string BASE_URL = "http://127.0.0.1:11434"; // API 路徑 const string GEN_API = "/api/generate"; static async Task Main(string[] args) { using HttpClient client = new HttpClient(); // 設(shè)置基址 client.BaseAddress = new Uri(BASE_URL); // 準(zhǔn)備請(qǐng)求數(shù)據(jù) ModelRequest rqdata = new() { Model = "deepseek-r1:8b", Stream = true, Prompt = "25的15次方是多少?" }; // 發(fā)送請(qǐng)求 var reqmsg = new HttpRequestMessage(HttpMethod.Post, GEN_API); // 請(qǐng)求正文 JsonContent data = JsonContent.Create(rqdata); reqmsg.Content = data; var responsemsg = await client.SendAsync(reqmsg, HttpCompletionOption.ResponseHeadersRead); // 處理響應(yīng)消息 if (responsemsg.IsSuccessStatusCode) { using StreamReader reader = new(await responsemsg.Content.ReadAsStreamAsync()); // 屬性名不區(qū)分大小寫,在反序列化時(shí)如果不啟用該選項(xiàng) // 將無(wú)法讀到字段值 JsonSerializerOptions options = new() { <strong>PropertyNameCaseInsensitive = true</strong> }; var line = await reader.ReadLineAsync(); while (line != null) { ModelResponse? mdresp = JsonSerializer.Deserialize<ModelResponse>(line, options); if(mdresp != null) { Console.Write(mdresp.Response); // 是否為最后一塊 if(mdresp.Done == true) { Console.Write("\n\n(已完畢)\n"); break; } } line = await reader.ReadLineAsync(); } } } }
這個(gè)和上一個(gè)例子差不多,只是將數(shù)據(jù)封裝了。
需要注意的是,由于流是不斷地返回 JSON 對(duì)象,而不是一個(gè)單獨(dú)的JSON數(shù)組,所以不應(yīng)該直接返序列化為 ModelResponse 數(shù)組,而是和前面一樣,讀一行出來(lái),用 JsonSerializer.Deserialize 方法進(jìn)行反序列化。這里要用到 JsonSerializerOptions 類設(shè)置一個(gè) PropertyNameCaseInsensitive 屬性,這是因?yàn)榉祷氐?JSON 的字段名全是小寫的,而咱們定義的 ModelResponse 類的屬性是大寫字母開頭的,默認(rèn)處理是嚴(yán)格區(qū)分大小寫的(反序列化的時(shí)候,序列化時(shí)可以忽略),設(shè)置該選項(xiàng)是讓其能夠賦值。如果你嫌麻煩,也可以把 ModelResponse 類的屬性名稱全定義為小寫。
使用流模式調(diào)用,可以得到這樣的效果:
不過(guò),不得不說(shuō)一句,AI 做數(shù)學(xué)運(yùn)算不如直接讓 CPU 進(jìn)行運(yùn)算,秒出結(jié)果。這廝一直在瞎推理,推來(lái)推去,總算得出答案。所以說(shuō),AI 是有其適用范圍的,真不是任何場(chǎng)合都合適。
下面咱們使用一下 nuget 包,搜索 OllamaSharp 就能找到。
如何添加 nuget 包,此處省略 1851 字。
安裝好包后,需要引入以下命名空間:
using OllamaSharp; using OllamaSharp.Models;
然后,實(shí)例化 OllamaApiClient。
IOllamaApiClient client = new OllamaApiClient( "http://127.0.0.1:11434", "deepseek-r1:8b" );
構(gòu)造函數(shù)的第二個(gè)參數(shù)是設(shè)置一個(gè)默認(rèn)模型名稱,后面在調(diào)用 API 時(shí)就不用再設(shè)置了。
請(qǐng)求時(shí)要提交一個(gè) GenerateRequest 對(duì)象,和前面咱們自己封裝的一樣,需要用到 Model、Prompt 等屬性。
// 準(zhǔn)備數(shù)據(jù) GenerateRequest req = new(); // 如果在構(gòu)造函數(shù)配置過(guò)模型名稱,可以省略 //req.Model = "deepseek-r1:8b"; req.Stream = true; req.Prompt = "唐太宗是唐朝第幾位皇帝?";
由于咱們?cè)O(shè)置了默認(rèn)模型,這里 Model 屬性可以不賦值。
發(fā)出請(qǐng)求,返回一個(gè) IAsyncEnumerable<T> 對(duì)象,里面包含返回的 GenerateResponseStream 對(duì)象列表。這個(gè)支持異步枚舉。
var resp = client.GenerateAsync(req); await foreach(GenerateResponseStream? stream in resp) { if(stream != null) { Console.Write(stream.Response); // 如果已結(jié)束 if(stream.Done) { Console.Write("\n\n會(huì)話結(jié)束\n"); } } }
其實(shí)和咱們剛才自己封裝的差不多。運(yùn)行結(jié)果如下:
雖然答案是對(duì)的,但推理過(guò)程純屬胡說(shuō),大伙伴且當(dāng)娛樂(lè)。
下面咱們用一下聊天功能。
這是一個(gè) WinForm 項(xiàng)目,窗口上方是一個(gè) RichTextBox,顯示AI回復(fù)的內(nèi)容,下面的文本框用來(lái)輸入。
往項(xiàng)目添加 OllamaSharp 包,然后在窗口類的代碼文件中引入以下命名空間:
using OllamaSharp; using OllamaSharp.Models.Chat;
聊天模式也是先創(chuàng)建 OllamaApiClient 實(shí)例,然后把此 OllamaApiClient 實(shí)例傳遞給 Chat 類的構(gòu)造函數(shù),進(jìn)而創(chuàng)建 Chat 實(shí)例。接著,調(diào)用 Chat 實(shí)例的 SendAsAsync 或 SendAsync 方法發(fā)送消息。方法返回 AI 回答你的內(nèi)容。
// 聲明類級(jí)別的私有字段 OllamaApiClient? client; Chat? theChat; public Form1() { InitializeComponent(); // 調(diào)用這個(gè)方法初始化 Ollama 客戶端 InitOllamClient(); btnSend.Click += BtnSend_Click; } private void InitOllamClient() { client = <strong>new OllamaApiClient("http://127.0.0.1:11434", "deepseek-r1:8b"</strong><strong>)</strong>; theChat = <strong>new</strong><strong> Chat(client)</strong>; }
處理一下“發(fā)送”按鈕的 Click 事件,發(fā)送消息并把AI響應(yīng)的消息追加到 RichTextBox 中。
private async void BtnSend_Click(object? sender, EventArgs e) { if (txtMessage.Text == string.Empty) return; // 發(fā)起請(qǐng)求 IAsyncEnumerable<string> history = <strong>theChat!</strong><strong>.SendAsAsync(ChatRole.User, txtMessage.Text)</strong>; await foreach(string s in history) { // 跳過(guò)不需要的字符 if(s.Equals("<think>") || s.Equals("</think>") || s.Equals("\n\n") || s.Equals("\n")) { continue; } // 追加文本 <strong>rtbMessages.AppendText(s)</strong>; } // 一條消息后加一個(gè)換行符 rtbMessages.AppendText("\n"); txtMessage.Clear(); // 清除文本 }
SendAsAsync 方法有N多重載,此處使用的是以下版本:
public IAsyncEnumerable<string> SendAsAsync(ChatRole role, string message, CancellationToken cancellationToken = default(CancellationToken))
第一個(gè)參數(shù)是 role 表示角色,你說(shuō)的話要用 User 角色;第二個(gè)參數(shù)是消息內(nèi)容;第三個(gè)可選,一般默認(rèn)就行,除非你需要取消調(diào)用。
返回的內(nèi)容是字符串列表,這個(gè)列表包含模型預(yù)測(cè)的短語(yǔ)列表,要把整個(gè)列表串聯(lián)起來(lái)才是完整的消息(看前文第一個(gè)例子,就是流模式那樣)。
效果如下圖所示:
好了,本文內(nèi)容基本介紹完了。老周可不允許你學(xué)不會(huì)!如果這也學(xué)不會(huì),那就罰自己餓兩個(gè)月吧。ASP.NET Core 上的用法也一樣的,你可以讓 Ollama 和應(yīng)用程序在同一個(gè)服務(wù)器,本地調(diào)用,然后返回給客戶端,一般不用直接對(duì)外暴露 URL。
以上就是詳解如何在.NET代碼中使用本地部署的Deepseek語(yǔ)言模型的詳細(xì)內(nèi)容,更多關(guān)于.NET使用本地部署Deepseek的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
ASP.NET?Core使用Swagger/OpenAPI規(guī)范
這篇文章介紹了ASP.NET?Core使用Swagger/OpenAPI規(guī)范的方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04詳解ASP.NET數(shù)據(jù)綁定操作中Repeater控件的用法
.NET中的Repeater控件支持?jǐn)?shù)據(jù)模板,而且可以自由地定義樣式,這里我們就來(lái)詳解ASP.NET數(shù)據(jù)綁定操作中Repeater控件的用法,需要的朋友可以參考下2016-06-06.net6?在中標(biāo)麒麟下的安裝和部署過(guò)程
這篇文章主要介紹了.net6?在中標(biāo)麒麟下的安裝部署,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-04-04asp.net下實(shí)現(xiàn)支持文件分塊多點(diǎn)異步上傳的 Web Services
asp.net下實(shí)現(xiàn)支持文件分塊多點(diǎn)異步上傳的 Web Services...2007-04-04ASP.NET 2.0 中的創(chuàng)建母版頁(yè)
ASP.NET 2.0 中的創(chuàng)建母版頁(yè)...2006-09-09asp.net(c#)下讀取word文檔的方法小結(jié)
asp.net(c#)下讀取word文檔的方法小結(jié),需要的朋友可以參考下。2011-07-07ASP.NET實(shí)現(xiàn)多域名多網(wǎng)站共享Session值的方法
實(shí)現(xiàn)功能:可設(shè)置哪些站點(diǎn)可以共享Session值,這樣就防止別人利用這個(gè)去訪問(wèn),要想實(shí)現(xiàn)這個(gè)功能就必須得把Session值 放入數(shù)據(jù)庫(kù)中, 所有我們先在VS命令工具下注冊(cè)一個(gè)2011-11-11