本篇咱们来聊一聊怎么在 .net 代码中使用本地部署的 deepseek 语言模型。大伙伴们不必要紧张,很简单的,你不需要学习新知识,只要你知道 .net 如何访问 http 和 json 的序列化相关就够了。
先说说如何弄本地模型,有伙伴会问:直接用在线的不好?其实,本地部署更实用,也更符合安全要求。其实,ai 真正用于生产环境反而不需要那么“强大”,能有行业化定制模型会更好,这样在专业领域的预测算法更准确;只有用于娱乐产业才需要“面面俱到”。
网上关于本地化部署的教程太多了,所以老周只是简单描述一下。而且,老周也相信大伙伴们的能力,连代码都会写了,怎么会搞不定这些活儿呢?
1、安装 ollama,官网:ollama。各位注意,这年头下载软件一定要看清楚是不是官网,现在国内很多冒充官网骗钱的,所以,看好域名很重要(比如,obs、vs code 等也有很多假域名)。ollama 就是专门用于调用 llm 的工具,它会启动本地服务器(web),通过 web api 方式交互。该工具是跨平台的,使用 c 和 go 语言开发,性能上不用担心,它不是用某脚本语言开发的。这个下载后直接安装就完事了,无难度。
2、先不急着下载模型,看看你的 c 盘空间够不够下载模型,不够的话,请配置一下 ollama_models 环境变量,指向你要存放模型的目录。这个都会配置了,不用老周说了吧,基于用户和基于机器的环境变量都可以。
ollama 默认启动 web 服务器的本地地址是 http://127.0.0.1:11434,如果端口有冲突,可以用 ollama_host 环境变量自己配置一下。没其他要求,就按默认就行了,不用配置。配置时要写上完整的 http 地址,如 http://192.168.1.15:8819。这个你看看源代码就知道为什么要写完整 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、第一次启动大语言模型需要下载,在 ollama 官网进入“models”页面,你基本不用找了,现在最热门的就是它了。
点击模型链接,进入详细页。下拉列表能看到模型大小,视你的 cpu 或 gpu 配置来选吧。
老周的机器 cpu 是 i5-11400f,跑 8b 问题不大(显卡是 4g 显存),回答问题一般要二三十秒,能接受。如果你不确定,可以从 7b 开始测试。页面向下滚动会告诉你命令行怎么用,比如,要下载7b的模型,执行命令 ollama run deepseek-r1:7b。
模型名称后面有个冒号,之后是模型的大小。执行后就是坐和等待。下载时间取决于网速和运气。
4、下载完后,你就可以问 deepseek 问题了,输入问题,回车就行了。你关闭了控制台,手动启动的方法就是上面下载模型的命令(只想下载,不运行,可以将 run 替换为 pull),ollama run xxxx:7b,但这次它不会再下载了,而是直接启动。
好了,准备工作结束,下面正片开始。
和调用一般 web api 一样,http 协议,json 格式。要和模型交互,会用到两个api。
1、单次对话(你问,它回答,类似搜索,这种较常用)。
post /api/generate
要提交的json一般只需要三个参数(其他你可以看文档,其实有些参数老周也没看懂):
model:llm 模型的名称,毕竟 ollama 可以下载多种模型,所以要指定模型,如 deepseek-r1:7b;
prompt:你要问它的问题,比如“何不食肉糜?”;
stream:是否启用流式传输。如果是 false,你发出请求后,要等到所有回答内容生成后,一次性返回。如果是 true,可以分块返回,不必等到全部生成你就可以读了。
返回的 json 对象中,response 字段就是 llm 回答你的内容,如果是流式返回,最后一段回复的 done 字段会为 true,其他片段为 false。
2、聊天模式
post /api/chat
请求的 json 常用的字段和上面单次对话一样,但 prompt 字段换成 messages 字段。此字段是数组类型,包含多个对象,代表聊天记录。其中,role 代表角色,你是 user,ai是 assistant。content 代表聊天消息内容。在调用时,可以把前面的聊天记录放进 messages 数组。
{ "model": "deepseek-r1:32b", "stream": false, "messages": [ { "role": "user", "content": "你好啊" }, { "role": "assistant", "content": "我不好" }, { "role": "user", "content": "为什么不好?" } ] }
返回的 josn 对象中,message 字段就是新的聊天记录(一般是 ai 回复你的)。
好了,知识就介绍到这儿,下面咱们要实际操作了。先声明一下:ollama api 的调用是有专门的 nuget 包的,都封装好的,你不需要自己干活。不过,为了让大伙伴们好理解,老周下面的演示暂不使用 nuget 包。
先来个简单的,关闭流模式。
internal class program { // 请求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(); // 设置基址 client.baseaddress = new uri(bs_url); // 请求数据 string senddata = """ { "model": "deepseek-r1:8b", "prompt": "黄河有多长?", "stream": false } """; stringcontent content = new(senddata, encoding.utf8, new mediatypeheadervalue("application/json")); httprequestmessage msg = new httprequestmessage() { method = httpmethod.post, content = content }; // 设置相对的url即可 msg.requesturi = new uri(api_gen, urikind.relative); // 发送请求,并读取响应消息 httpresponsemessage respmsg = await client.sendasync(msg); if (respmsg.issuccessstatuscode) { string json_back = await respmsg.content.readasstringasync(); console.writeline("-------------- 返回的json ----------------\n"); console.writeline(json_back); } } }
代码运行后,需要等待一段时间。请求返回后,将得到以下 json:
{ "model": "deepseek-r1:8b", "created_at": "2025-02-23t05:12:46.9156624z", "response": "\u003cthink\u003e\n嗯,用户问“黄河有多长?”首先,我得回想一下黄河的基本信息。黄河是中国的一条重要河流,发源于青藏高原,流经华北平原,注入渤海湾。\n\n接下来, 我需要确定黄河的长度。我记得它被称为“九曲黄河”,这可能是因为它有很多弯曲的河道。根据我所知道的资料,黄河的总长大约在5463公里左右。不过,这个数字好像有点问题,因为有些资料会提到水系更长的情况,比如包括支流在内。\n\n另外,我还需要考虑用户为什么会问这个问题。也许他们是在做研究、写作业,或者只是出于好奇。我应该确认一下数据的准确性,避免误导用户。如果有时间的话,最好核实一下最新的资料,但目前我只能依据已有的信息回答。\n\n在解释时,我会提到黄河的重要性,比如它对中国历史、文化的影响,以及作为水资源的重要性。这不仅能满足用户的基本问题,还能提供更多背景信息,让回答更丰富。\n\n最后,考虑到用户可能需要进一步了解,可以建议他们查阅最新的地理资料或相关文献,以确保得到准确的数据和详细的信息。\n\u003c/think\u003e\n\n黄河的长度约为5,463公里(3,455英里),它是中国最长的河流之一,从青藏高原的玛旁雍措开始,经过九曲,最终注入渤海湾。", "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 字段就是模型所回答的内容。done: true 表示所有回复已完成。
当流模式关闭时,响应消息是一次性返回的。下面咱们开启流模式,看会发生什么。
internal class program { // 请求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(); // 设置基址 client.baseaddress = new uri(bs_url); // 请求数据 string senddata = """ { "model": "deepseek-r1:8b", "prompt": "人为什么不能有两个头?", <strong>"stream": true</strong> } """; stringcontent content = new(senddata, encoding.utf8, new mediatypeheadervalue("application/json")); httprequestmessage msg = new httprequestmessage() { method = httpmethod.post, content = content }; // 设置相对的url即可 msg.requesturi = new uri(api_gen, urikind.relative); // 发送请求,并读取响应消息 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); } } } }
使用流模式后,有几个地方要改:
1、post 的内容中,stream 字段要设置为 true;
2、调用 httpclient.sendasync 方法时,要指定 httpcompletionoption 枚举值 responseheadersread,它表示:客户端不需要等到所有响应都完成,只要读到 header 就可以返回;
3、以流的方式读取,所以为了方便一行一行地读,需要创建一个 streamreader 实例。因为分区返回的 json 文本之间会有换行符,所以,咱们可以一行一行地读。
运行后你会发现,响应消息是几个字几个字地返回,这样模拟它的思考过程,即返回多个 json 对象。
{"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":"两个","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":"起来","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":"这个","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23t08:52:30.4894236z","response":"问题","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":"结构","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":"协","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23t08:52:35.4423656z","response":"调","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":"两个","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":"个","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":"相关","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":"细胞","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":"经","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23t08:52:39.9700241z","response":"系统","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":"供应","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":"营","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23t08:52:41.3626235z","response":"养","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":"对于","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":"来说","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":"据","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":"两个","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":"个","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":"一个","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":"独立","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":"协","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23t08:52:49.9271731z","response":"调","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":"会","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23t08:52:51.3282565z","response":"导致","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23t08:52:51.4382736z","response":"严","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":"进","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":"来","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":"结构","done":false} {"model":"deepseek-r1:8b","created_at":"2025-02-23t08:52:54.3524683z","response":"已经","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":"优","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":"两个","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":"个","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":"来","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":"现","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}
最后一个 json 对象的 done 字段为 true,表示是最后一个消息分块。context 字段中的数字是用于对话上下文的,即下一次你向 llm 发问时,可以把上次返回的 context 放到请求数据中,这样形成基于上下文的推理。不过这个 context 字段在官方文档中已标记为“过时”,以后可能不使用了。所以咱们可以不理会,因为可以使用聊天模式 api(请看上文)。
通过上面的简单演示,相信大伙伴都会用了。不过为了方便,咱们可以把请求数据封装一下,通过 json 序列化来调用,会更方便。
a、请求消息,主要使用 model、prompt 和 stream 字段。
/// <summary> /// 请求数据 /// </summary> public class modelrequest { /// <summary> /// 模型名称 /// </summary> public string? model { get; set; } /// <summary> /// 提问 /// </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> /// 回复内容 /// </summary> public string? response { get; set; } /// <summary> /// 是否为最后一个分块 /// </summary> public bool done { get; set; } = false; }
咱们测试一下流模式。
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(); // 设置基址 client.baseaddress = new uri(base_url); // 准备请求数据 modelrequest rqdata = new() { model = "deepseek-r1:8b", stream = true, prompt = "25的15次方是多少?" }; // 发送请求 var reqmsg = new httprequestmessage(httpmethod.post, gen_api); // 请求正文 jsoncontent data = jsoncontent.create(rqdata); reqmsg.content = data; var responsemsg = await client.sendasync(reqmsg, httpcompletionoption.responseheadersread); // 处理响应消息 if (responsemsg.issuccessstatuscode) { using streamreader reader = new(await responsemsg.content.readasstreamasync()); // 属性名不区分大小写,在反序列化时如果不启用该选项 // 将无法读到字段值 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(); } } } }
这个和上一个例子差不多,只是将数据封装了。
需要注意的是,由于流是不断地返回 json 对象,而不是一个单独的json数组,所以不应该直接返序列化为 modelresponse 数组,而是和前面一样,读一行出来,用 jsonserializer.deserialize 方法进行反序列化。这里要用到 jsonserializeroptions 类设置一个 propertynamecaseinsensitive 属性,这是因为返回的 json 的字段名全是小写的,而咱们定义的 modelresponse 类的属性是大写字母开头的,默认处理是严格区分大小写的(反序列化的时候,序列化时可以忽略),设置该选项是让其能够赋值。如果你嫌麻烦,也可以把 modelresponse 类的属性名称全定义为小写。
使用流模式调用,可以得到这样的效果:
不过,不得不说一句,ai 做数学运算不如直接让 cpu 进行运算,秒出结果。这厮一直在瞎推理,推来推去,总算得出答案。所以说,ai 是有其适用范围的,真不是任何场合都合适。
下面咱们使用一下 nuget 包,搜索 ollamasharp 就能找到。
如何添加 nuget 包,此处省略 1851 字。
安装好包后,需要引入以下命名空间:
using ollamasharp; using ollamasharp.models;
然后,实例化 ollamaapiclient。
iollamaapiclient client = new ollamaapiclient( "http://127.0.0.1:11434", "deepseek-r1:8b" );
构造函数的第二个参数是设置一个默认模型名称,后面在调用 api 时就不用再设置了。
请求时要提交一个 generaterequest 对象,和前面咱们自己封装的一样,需要用到 model、prompt 等属性。
// 准备数据 generaterequest req = new(); // 如果在构造函数配置过模型名称,可以省略 //req.model = "deepseek-r1:8b"; req.stream = true; req.prompt = "唐太宗是唐朝第几位皇帝?";
由于咱们设置了默认模型,这里 model 属性可以不赋值。
发出请求,返回一个 iasyncenumerable<t> 对象,里面包含返回的 generateresponsestream 对象列表。这个支持异步枚举。
var resp = client.generateasync(req); await foreach(generateresponsestream? stream in resp) { if(stream != null) { console.write(stream.response); // 如果已结束 if(stream.done) { console.write("\n\n会话结束\n"); } } }
其实和咱们刚才自己封装的差不多。运行结果如下:
虽然答案是对的,但推理过程纯属胡说,大伙伴且当娱乐。
下面咱们用一下聊天功能。
这是一个 winform 项目,窗口上方是一个 richtextbox,显示ai回复的内容,下面的文本框用来输入。
往项目添加 ollamasharp 包,然后在窗口类的代码文件中引入以下命名空间:
using ollamasharp; using ollamasharp.models.chat;
聊天模式也是先创建 ollamaapiclient 实例,然后把此 ollamaapiclient 实例传递给 chat 类的构造函数,进而创建 chat 实例。接着,调用 chat 实例的 sendasasync 或 sendasync 方法发送消息。方法返回 ai 回答你的内容。
// 声明类级别的私有字段 ollamaapiclient? client; chat? thechat; public form1() { initializecomponent(); // 调用这个方法初始化 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>; }
处理一下“发送”按钮的 click 事件,发送消息并把ai响应的消息追加到 richtextbox 中。
private async void btnsend_click(object? sender, eventargs e) { if (txtmessage.text == string.empty) return; // 发起请求 iasyncenumerable<string> history = <strong>thechat!</strong><strong>.sendasasync(chatrole.user, txtmessage.text)</strong>; await foreach(string s in history) { // 跳过不需要的字符 if(s.equals("<think>") || s.equals("</think>") || s.equals("\n\n") || s.equals("\n")) { continue; } // 追加文本 <strong>rtbmessages.appendtext(s)</strong>; } // 一条消息后加一个换行符 rtbmessages.appendtext("\n"); txtmessage.clear(); // 清除文本 }
sendasasync 方法有n多重载,此处使用的是以下版本:
public iasyncenumerable<string> sendasasync(chatrole role, string message, cancellationtoken cancellationtoken = default(cancellationtoken))
第一个参数是 role 表示角色,你说的话要用 user 角色;第二个参数是消息内容;第三个可选,一般默认就行,除非你需要取消调用。
返回的内容是字符串列表,这个列表包含模型预测的短语列表,要把整个列表串联起来才是完整的消息(看前文第一个例子,就是流模式那样)。
效果如下图所示:
好了,本文内容基本介绍完了。老周可不允许你学不会!如果这也学不会,那就罚自己饿两个月吧。asp.net core 上的用法也一样的,你可以让 ollama 和应用程序在同一个服务器,本地调用,然后返回给客户端,一般不用直接对外暴露 url。
以上就是详解如何在.net代码中使用本地部署的deepseek语言模型的详细内容,更多关于.net使用本地部署deepseek的资料请关注代码网其它相关文章!
发表评论