【.NET】调用本地 Deepseek 模型 - 东邪独孤 - 博客园

mikel阅读(268)

来源: 【.NET】调用本地 Deepseek 模型 – 东邪独孤 – 博客园

本篇咱们来聊一聊怎么在 .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": "人为什么不能有两个头?",
                    "stream": true
                }
                """;
            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, HttpCompletionOption.ResponseHeadersRead);
            if (respmsg.IsSuccessStatusCode)
            {
                StreamReader reader = new(await respmsg.Content.ReadAsStreamAsync());
                string? line;
                while( (line = reader.ReadLine()) != 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() { PropertyNameCaseInsensitive = true };
                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 是有其适用范围的,真不是任何场合都合适。不要听网上那些外行人和卖课的胡说八道,他们整天把 AI 吹的比人还历害。骗三个月小孩呢,机器永远是机器,只能用在机器所擅长的领域,而我们人也应当做人该做的事,不可能啥都推给机器做,在那里无所事事。如何正确处理人和 AI 的关系,建议观赏一下 CLAMP 大妈的漫话《人形电脑天使心》。

 

下面咱们使用一下 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 = new OllamaApiClient("http://127.0.0.1:11434", "deepseek-r1:8b");
     theChat = new Chat(client);
 }
复制代码

处理一下“发送”按钮的 Click 事件,发送消息并把AI响应的消息追加到 RichTextBox 中。

复制代码
 private async void BtnSend_Click(object? sender, EventArgs e)
 {
     if (txtMessage.Text == string.Empty) return;

     // 发起请求
     IAsyncEnumerable<string> history = theChat!.SendAsAsync(ChatRole.User, txtMessage.Text);
     await foreach(string s in history)
     {
         // 跳过不需要的字符
         if(s.Equals("<think>") 
             || s.Equals("</think>")
             || s.Equals("\n\n")
             || s.Equals("\n"))
         {
             continue;
         }
         // 追加文本
         rtbMessages.AppendText(s);
     }
     // 一条消息后加一个换行符
     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。

linux 服务器利用宝塔面板部署.net 6(.net core)服务端程序图文步骤_宝塔部署net6-CSDN博客

mikel阅读(208)

来源: linux 服务器利用宝塔面板部署.net 6(.net core)服务端程序图文步骤_宝塔部署net6-CSDN博客

使用宝塔可视化操作发布.net core 项目
随着.net core 跨平台技术的兴起,微软.net拥抱云原生,支持跨平台,可以使基于.net core技术的服务端程序轻松移植到基于Linux的云服务器上,本文以图文的方式介绍如何利用阿里云轻量应用服务器安装宝塔面板部署基于.net core的后端服务器接口程序并正常运行。
步骤
准备一台linux服务器
安装宝塔镜像及开放端口(网上教程有很多,基本都是傻瓜式安装,这里不做过多赘述)
登录宝塔会看到这样的一个面板

点击左边网站选项进入网站列表
点击添加站点填写站点信息(根目录填写存放.net core 项目的跟目录,就是有 项目名称.dll的目录)添加完成后点击提交
发布.netcore 程序
注意,部署模式选择独立,否则需要现在linux服务器装.netcore运行环境。详细请看
https://docs.microsoft.com/zh-cn/dotnet/core/install/linux-centos
发布完成后并确保咱们项目没问题之后,就可以进入宝塔去上传了。
进入第5步选择的根目录中,上传打包之后的文件
进入软件商店搜索并下载守护进程软件
安装完成后进入并添加守护进程
启动命令后的端口可以随意指定,注意,是没有被占用过的。
准备妥当后点击确定
进入网站列表点击刚创建的网站填写配置文件-反向代理的脚本
代理地址就是上一步启动命令中的填写的地址。
location / {
      proxy_pass http://localhost:5052;
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection keep-alive;
      proxy_set_header Host $host;
      proxy_cache_bypass $http_upgrade;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $scheme;
    }
至此整个配置过程已经大功告成,我们可以通过浏览器访问一下.net api的swagger文档:https://api.xxxx.com/swagger/index.html 已经可以访问了:
结语
.net跨平台,超高的性能,简易的部署方式给后端程序员又提供了一种新的选择,以上便是通过阿里云轻量应用服务器采用宝塔面板全界面操作的全过程,简单实用而且很方便!
————————————————
                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_45602658/article/details/129299814

火绒安全防火墙意外拦截局域网域名代理服务器IP的问题修复

mikel阅读(314)

刚刚域名代理软件快解析服务器的域名无法访问内部的Web服务器,开始以为是代理服务器的网络有问题了,重启了也不行。然后去域名映射到的web服务器发现火绒安全防火墙拦截代理服务器的局域网IP地址了,关了火绒软件就可以整合访问了,问题原来出在这,那也不能不开防火墙啊,太危险了,于是开了火绒还是被拦截,于是一个一个的看防火墙设置发现再暴力破解保护项中将域名代理服务器的IP临时加入黑名单了!于是将域名代理服务器的IP加入信任列表,反向域名代理域名可以正常访问了!

开挂!小白用DeepSeek开发一个全栈小程序!保姆级教程!

mikel阅读(1184)

来源: 开挂!小白用DeepSeek开发一个全栈小程序!保姆级教程!

大家好,我是程序员小孟。

最近用DeepSeek疯狂测试,进行系统的开发,极大地提高了工作效率。

现在的DeepSeek也可以接入到各种软件、微信中。

今天继续分享用DeepSeek开发一个全栈小程序,已经完美开发出来,全程无尿点,全部免费分享,手把手教学。

项目是帮一个铁粉开发的:

图片

 

掌握了本文的方法,即使是小白,也可以完美的开发出来你想要的程序。建议点赞、收藏、转发,防止以后找不到。

废话不多说,让我们开干。

一,需求生成,一分钟制作思维导图

首先打开DeepSeek,输入我们想要的需求:

请帮我整理景点旅游小程序需求,以markdown格式输出,我要做成思维导图

然后我们点击右上角的复制:

图片

下一步,在电脑本地新建一个 景点小程序.txt,把刚刚复制的内容全部粘贴进去,然后把后缀txt改成md。

图片

记得内容要保存下。

下一部分我们打开思维导图的软件:Xmind

图片

Xmind可以直接在我的公众号搜索,我把所有的软件都整理到一起了

直接获取:公众号回复:deepseek

下一步,我们首先选择文件,然后选择导入,最后选择Markdown

记得要选择你刚才保存的路径地址。

图片

图片

等待3秒钟的时间,就生成了一个思维导图。

图片

我们就把需求搞定了。

下一步我们继续,let‘s go!

二,后端代码生成

后端开发我们采用的是IDEA开发。可以再IDEA中配置DeepSeek,也可以在SpringBoot中配置DeekSeek。

前面的话,我整理了一套软件的安装,平时我开发都是用的这一套软件。

图片

对于IDEA的安装,可以去官网进行下载:

https://www.jetbrains.com.cn/idea/

如果不想下载的话,我也给你整理好了,直接获取:公众号回复:IDEA

下一步需要安装CodeGPT:

CodeGPT的安装,有两种方式,第一是线上的安装,第二是本地离线安装。

线上的安装,可以直接在商城中进行install。

具体步骤:

  1. 打开 Intelli IDEA并进入 File -> settings (Windows/Linux) 或者 Intelli] IDEA -> preferences,找到 plugins 选项卡

2.在 Plugins 页面点击右侧的 Marketplace 按钮,在搜索框内输入“CodeGPT” 进行查找。

3.如果找到了对应的插件,则点击 Install 来下载并安装该插件;如果没有发现官方渠道提供的 CodeGPT插件。

 

图片

然后填写Key的信息:

图片

注意去deepseek的api官网找到你的key信息,复制进去就行了,非常esay。

API key:
填入 DeepSeek API key
URL:
填入 https://api.deepseek.com/chat/completions

 

图片

到这一步,基本完事。

例如我们这里生成一个增删改查的代码。

图片

根据这个方法,我们可以生成想要的代码,最后的项目直接搞好:

图片

控制层代码都可以生成:

图片

除了将IDEA集成DeepSeek,还有一种方式,我们可以在SpringBoot中集成DeepSeek,这样也是可以方便后端的开发。

三,SpringBoot中集成DeepSeek

我们开始在SpringBoot中集成DeepSeek。

首先确保你已经获取了DeepSeek的官方SDK,并根据官方文档完成了必要的环境配置。

这个配置的方法,和上面是一样的。

添加依赖

在pom.xml文件中添加DeepSeek SDK相关的依赖:
<dependencies>

<dependency>

<groupId>com.deepseek</groupId>

<artifactId>deepseek-sdk</artifactId>

<version>1.0.0</version>

</dependency>

</dependencies>
>> 
生成控制层的代码:
//小孟微信:fly9996868
@RestController

@RequestMapping("/api/deepseekDemo")

public class DeepSeekController {

private final DeepSeekService deepSeekService;

@Autowired

public DeepSeekController(DeepSeekService deepSeekService) {

this.deepSeekService = deepSeekService;

}

@PostMapping("/demo")

public String train(@RequestBody String data) {

deepSeekService.trainModel(data);

return "你好,小孟";

}
}

}
生成服务层的代码:
//小孟微信:fly9996868
public class DeepSeekService {

private final DeepSeekDemo deepSeekDemo;

@Autowired

public DeepSeekService(DeepSeekDemo deepSeekDemo) {

this.deepSeekDemo = deepSeekDemo;

}

public void trainModel(String Demodata) {
deepSeekDemo.train(Demodata);

}

}

}

可以生成你想要的任何代码:

图片

做任何事都要耐心,跟到这里你已经成功了90%。

四,自动生成小程序代码

 

创建 HBuilderX 项目:
●打开 HBuilderX,选择“文件”->“新建”->“项目”。
●选择“uni-app”,填写项目名称,选择默认模版,点击启用uniCloud,点击选择阿里云,Vue版本选择2,点击“创建”。

图片

 

然后选择刚创建项目目录,点击导航栏运行到小程序模拟器查看页面效果。

图片

开发者工具中选择信任并运行,关掉编辑器和调试器可以更方便的查看页面效果。

图片

打开cursor。

图片

点击Continue,点击use Extensions。

图片

下面模式左边是允许Cursor收集使用数据,右边则是隐私模式,选择好后点击Continue。

图片

点击后会出现登录注册选择项,如果还没有账号需要点击右边按钮进行注册。

图片

登录后选择Open project打开创建好的小程序项目。

图片

点击最上方设置图标,选择Models,勾选deepseek-v3模型,其它模型都取消勾选。

图片

 

除了小程序端的开发,我们还需要进行前端的开发。

接下来我们就在cursor这个集成开发环境中调用deepseek去进行小程序的一个开发。使用快捷键ctrl+i呼出composer输入提示词。需要注意 @Codebase 前面有空格,这步是为了让deepseek去阅读整个代码文件。

图片

点击回车键发送提示词,代码编写好以后点击 Accept all确认修改,然后打开开发者工具查看效果。

图片

五,项目展示

根据需求和上面的步骤,在小程序端、前端、后端,我搞完了全部的系统。

小程序端:

图片

图片

图片

图片

后端:

图片

图片

图片

看了上面的教程,是不是感觉开发很简单的样子,欢迎更多的小伙伴学习。

如果大家需要,我会录制详细的视频,录制详细的开发过程。

程序员的未来不是被裁员,而是起飞。

码字不易,开发加文章弄了好几天,文章点赞、在看、转发 ,支持下,全部免费,就是我最大的开源动力,我会继续更新详细用DeepSeeK开发全栈小程序的教程!

WordPress 导出为 Markdown 项目常见问题解决方案-CSDN博客

mikel阅读(191)

WordPress 导出为 Markdown 项目常见问题解决方案
wordpress-export-to-markdown
Converts a WordPress export XML file into Markdown files.
项目地址: https://gitcode.com/gh_mirrors/wo/wordpress-export-to-markdown

基础介绍
该项目是一个开源项目,旨在将 WordPress 的导出 XML 文件转换成 Markdown 文件,使其兼容静态站点生成器(如 Eleventy、Gatsby、Hugo 等)。项目主要使用 JavaScript 编程语言。

注意事项及解决步骤
问题一:Node.js 环境配置
问题描述: 新手在运行项目前,需要确保已安装 Node.js。

解决步骤:

访问 Node.js 官方网站下载并安装 Node.js。
安装完成后,在命令行中输入 node -v 和 npm -v 验证是否成功安装。
确保安装的 Node.js 版本与项目兼容。
问题二:配置项目参数
问题描述: 在使用该项目时,需要正确配置项目参数。

解决步骤:

将 WordPress 导出文件(确保导出为 “All content”)重命名为 export.xml 并放入脚本所在目录。
运行 npx wordpress-export-to-markdown 或克隆仓库后执行 npm install && node index.js。
按照终端中的向导提示,设置输出文件夹路径、是否创建年份文件夹等参数。
如果需要自定义输出格式,可以使用命令行参数,如 –post-folders=false –prefix-date=true。
问题三:图像下载问题
问题描述: 在转换过程中,项目会自动下载文章中的图像并保存在本地,但有时可能会遇到图像下载失败的问题。

解决步骤:

确认 WordPress 导出文件中图像链接的有效性。
检查网络连接是否稳定。
如果下载失败,可以尝试手动下载图像并放置到指定的输出目录。
修改项目的源代码,增加错误处理逻辑,确保在图像下载失败时不会影响其他功能的执行。
通过以上步骤,新手用户可以顺利使用该项目将 WordPress 内容导出为 Markdown 文件,并解决可能遇到的一些常见问题。

wordpress-export-to-markdown
Converts a WordPress export XML file into Markdown files.
项目地址: https://gitcode.com/gh_mirrors/wo/wordpress-export-to-markdown
————————————————

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/gitblog_00572/article/details/144036209

太通透了!大模型接入业务系统的最佳实践来了-CSDN博客

mikel阅读(734)

来源: 太通透了!大模型接入业务系统的最佳实践来了-CSDN博客

文章目录
一、背景
二、业务系统接入大模型的三种方式
用通俗易懂的方式讲解系列
技术交流
三、直接PROMPT(提示语)方式接入
PROMPT 的常用技巧
Zero-Shot, One-Shot, Few-Shot
链式思维
任务分解
如何在PROMPT提示语中嵌入业务知识
四、通过RAG(检索增强)方式接入
RAG的实现
RAG的流程
知识检索如何实现
业务接入RAG检索的例子
五、通过Fine-tuning(微调训练)接入
微调训练的方式有哪些
KubeAI大模型平台上如何进行 Fine-tuning
一些Fine-tuning微调的例子
六、业务系统接入大模型的最佳路径
七、总结与展望
一、背景
最近经常收到内部业务方的咨询,他们想知道”如何让我们的业务系统接入大模型提效”。为了回答这个问题,我们梳理了 KubeAI 大模型平台对接的一些业务实践与一些业界经典案例分享给大家。

OpenAI 的第一次开发者大会的主题为 Maximizing LLM Performance,提出业务系统可以通过三种方式接入大模型,PROMPT(直接给大模型输入提示词),RAG(通过检索增增强来提升大模型的能力),Fine-tuning(通过微调训练来提升大模型的能力)。

本文借鉴 OpenAI 的观点,结合具体实践例子分别介绍这三种接入方式,最后建议业务可以通过渐进(PROMPT,RAG,Fine-tuning)的方式接入大模型,从而达到最佳的收益效果。

二、业务系统接入大模型的三种方式

前面我们简单提过,目前业务系统接入大模型一共有三种方式,分别是 PROMPT(直接给大模型输入提示语),RAG(通过检索增强来提升大模型的能力),Fine-tuning(通过微调训练来提升大模型的能力)。

下面我们对这三种方式先给出简单的示例解释。

PROMPT(直接给大模型输入提示语)
通过 PROMPT 方式接入大模型是最简单最直接的方式。即我们拿到开源大模型后,直接推理部署运行起来。然后通过给大模型发送提示语的方式,让大模型解决你的问题返回答案。比如可以直接让大模型对一篇文章生成总结等。

RAG(通过检索增强大模型的能力)
通过 RAG 的方式接入大模型,是一种利用检索增强生成(Retrieval Augmented Generation)技术,让大语言模型(Large Language Model,LLM)能够参考相关的知识,从而提高生成质量和准确性的方法。

RAG 的核心思想是,先通过向量数据库(Vector Database)检索出与用户提问最相关的文档或知识,然后将这些文档或知识融入到大模型的输入(Prompt)中,让大模型在生成答案时能够参考这些信息。从而让大模型更加了解业务相关知识。

Fine-tuning(通过训练增加大模型的能力)
Fine-tuning 的方式是指在一个已经预训练好的大模型的基础上,用业务特定的数据集对模型的部分或全部参数进行微调,以适应特定的任务或领域。通过 Fine-tuning,可以让大模型更了解业务的需求和特点,提高模型在业务场景中的表现。

接下来我们会结合 KubeAI 大模型平台对接的业务实践或一些业界经典案例,继续详细阐述业务系统如何通过上面三种方式接入大模型。

用通俗易懂的方式讲解系列
用通俗易懂的方式讲解:不用再找了,这是大模型最全的面试题库
用通俗易懂的方式讲解:这是我见过的最适合大模型小白的 PyTorch 中文课程
用通俗易懂的方式讲解:一文讲透最热的大模型开发框架 LangChain
用通俗易懂的方式讲解:基于 LangChain + ChatGLM搭建知识本地库
用通俗易懂的方式讲解:基于大模型的知识问答系统全面总结
用通俗易懂的方式讲解:ChatGLM3 基础模型多轮对话微调)
用通俗易懂的方式讲解:最火的大模型训练框架 DeepSpeed 详解来了
用通俗易懂的方式讲解:这应该是最全的大模型训练与微调关键技术梳理
用通俗易懂的方式讲解:Stable Diffusion 微调及推理优化实践指南
用通俗易懂的方式讲解:大模型训练过程概述
用通俗易懂的方式讲解:专补大模型短板的RAG
用通俗易懂的方式讲解:大模型LLM Agent在 Text2SQL 应用上的实践
用通俗易懂的方式讲解:大模型 LLM RAG在 Text2SQL 上的应用实践
用通俗易懂的方式讲解:大模型微调方法总结
用通俗易懂的方式讲解:涨知识了,这篇大模型 LangChain 框架与使用示例太棒了
技术交流
技术要学会分享、交流,不建议闭门造车。一个人走的很快、一堆人可以走的更远。

建立了大模型技术交流群, 大模型学习资料、数据代码、技术交流提升, 均可加知识星球交流群获取,群友已超过2000人,添加时切记的备注方式为:来源+兴趣方向,方便找到志同道合的朋友。

方式①、微信搜索公众号:机器学习社区,后台回复:技术交流
方式②、添加微信号:mlc2060,备注:技术交流

 

三、直接PROMPT(提示语)方式接入

所谓 PROMPT 方式接入大模型,是指给大模型设计合适的提示语(Prompt)让大模型产生对应的输出,从而完成各种任务。最简单的 PROMPT 比如上面的例子,让大模型写一首关于春天的诗,然后大模型会产生对应的输出。

在复杂业务场景下,PROMPT 的设计往往非常复杂。因此专门研究如何设计 PROMPT 的”PROMPT 工程”应运而生。PROMPT 工程是一门利用大语言模型(Large Language Model, LLM)的内在能力,通过设计合适的提示语(Prompt)来完成各种任务的学科。其目的是找到最优的提示语,使模型的性能和效率达到最高。

以下关于 PROMPT 的梳理参考了 Prompt Engineering Guide(https://www.promptingguide.ai/zh),openai-cookbook(https://github.com/openai/openai-cookbook/tree/main)里提到的相关内容与论文,感兴趣的同学可以去深入了解下。

PROMPT 的常用技巧
目前大模型的输入上下文长度一般为 4K 或 16K,最近有些大模型支持 32K 或 128K,为 Promopt 的设计留下了比较大的发挥空间。

Zero-Shot, One-Shot, Few-Shot
OpenAI 关于 GPT-3 的论文”Language Models are Few-Shot Learners”,这篇论文详细介绍了 GPT-3,一个强大的自然语言处理(NLP)模型。其中的亮点之一便是 Few-Shot Learning。

Zero-Shot 学习:就是让模型在没有任何相关数据的情况下,直接用自然语言指令来完成一个新任务。比如,你可以告诉模型“把这段英文翻译成中文”,然后模型就会尝试做出翻译,而不需要给它任何翻译的例子。这种方法最方便,但也最有挑战,因为有些任务可能很难用自然语言指令来清楚地描述。

One-Shot 学习:就是让模型在只有一个相关数据的情况下,用自然语言指令和一个例子来完成一个新任务。比如,你可以告诉模型“把这段英文翻译成中文”,然后给它一个英文句子和它的中文翻译作为例子,然后模型就会尝试根据这个例子来做出翻译。这种方法比 Zero-Shot 更容易让模型理解任务的内容或格式,因为有一个例子可以参考。

Few-Shot 学习:就是让模型在有少量相关数据的情况下,用自然语言指令和几个例子来完成一个新任务。比如,你可以告诉模型“把这段英文翻译成中文”,然后给它几个英文句子和它们的中文翻译作为例子,然后模型就会尝试根据这些例子来做出翻译。这种方法比 One-Shot 更能提高模型的准确性和稳定性,因为有更多的例子可以参考。

在以上三种情况下,Prompt(提示语)就是用来提供自然语言指令和少量例子的语句,以便引导模型完成任务。

链式思维
链式思维(Chain of thoughts)解决问题的方法是把复杂问题拆分成很多环环相扣的步骤,逐步解决问题。这种逐步解答示例可以帮助模型更好地理解和解决需要多步骤推理的复杂问题。

相关论文链接:Large Language Models are Zero-Shot Reasoners(https://arxiv.org/abs/2205.11916)

提示语设计:

作者发现,通过在每个答案之前简单添加“让我们逐步思考(Let’s think step by step)”,大模型可以成为出色的零样本推理者。将这个简单的技巧应用于 MultiArith 数学数据集,作者发现 Let’s think step by step 使准确度翻了四倍,从 18% 到 79%!

举例:
下面是在 text-davinci-003 模型上的实验:

错误答案如下:

Q:一个杂耍者可以抛 16 个球。球的一半是高尔夫球,而高尔夫球中又有一半是蓝色的。有多少个蓝色的高尔夫球?

A:8 个蓝色的高尔夫球。

加了链式思维提示后,得到了正确的答案:

Q:一个杂耍者可以抛 16 个球。球的一半是高尔夫球,而高尔夫球中又有一半是蓝色的。有多少个蓝色的高尔夫球?

让我们一步一步思考

A:首先,一个杂耍者可以抛 16 个球,所以一共有 16 个球。其次,其中一半是高尔夫球,所以有 8 个高尔夫球。最后,高尔夫球中又有一半是蓝色的,所以有 4 个蓝色的高尔夫球。

下面是作者论文中的例子:

任务分解
任务分解是当一个任务比较复杂时,往往是将一个复杂的任务分解成更小、更容易处理的子任务的过程。经典的例子,比如 AB 两个城市之间搬运货物,需要分三个步骤,A 城市装货,AB 城市之间运输,B 城市卸货。

前期比较火爆的浙大 & 微软研究院提出的 HuggingGPT 工程,就是任务分解的典型应用。

相关论文链接:HuggingGPT: Solving AI Tasks with ChatGPT and its Friends in HuggingFace(https://arxiv.org/abs/2303.17580)

提示语设计:

HuggingGPT 会把一个多模态任务拆分成多个子任务,然后再以此执行每个子任务,从而实现多模态的功能。

 

HuggingGPT 的任务拆分是通过 PROMPT 提示大模型来实现的。下面看下 HuggingGPT 的一个 PROMOT 的具体内容(已经翻译成中文):

用户请求内容如下:

根据/examples/d.jpg的姿势和/examples/e.jpg的内容,请向我展示一张新图片。
1
HuggingGPT 给大模型的提示如下:

 

这些 Prompt 后面还会增加一些请求返回的示例,也就是 Few-Shot,让大模型对这些 Prompt 理解更加精确,这个我们在前面的 Few-Shot 部分有讲到。

大模型的返回如下:

[{
“task”: “openpose-control”,
“id”: 0,
“dep”: [-1],
“args”: {
“image”: “/examples/d.jpg”
}
}, {
“task”: “image-to-text”,
“id”: 1,
“dep”: [-1],
“args”: {
“image”: “/examples/e.jpg”
}
}, {
“task”: “openpose-text-to-image”,
“id”: 2,
“dep”: [0, 1],
“args”: {
“image”: “<GENERATED>-0”,
“text”: “<GENERATED>-1”
}
}]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
由此可见,基于任务拆解 PROMOPT,完全让大模型具备任务拆解的功能,把一个复杂的多模态任务拆分成一个个简单的 task,然后 HuggingGPT 会依据 GPT 返回的 task,去一步一步执行,返回给用户最后结果。

如何在PROMPT提示语中嵌入业务知识

在为大模型设计 PROMPT 时,通常可以将其分为四个可选部分,以指导模型的响应和行为:

用户指令:明确告诉大模型需要执行的具体任务,例如扮演特定角色,生成某些内容等。

对话上下文:提供之前的对话内容,帮助大模型理解当前对话的背景,从而生成更相关的回应。

附加内容:补充额外信息,如基础库的细节或特定业务知识,以丰富大模型的知识库和回答质量。

输出要求:指定期望的输出格式,输出内容限制等。

这四个部分并非都必须包含在每个 PROMPT 中,可以根据实际需求灵活选择。

从上图的 PROMPT 四要素中可以看出,业务知识可以嵌入到 PROMPT 的附加内容中,业务场景对话可以嵌入到 PROMPT 的对话上下文中。

下面是 KubeAI 大模型平台对接的”AI画原型”项目的一个 PROMPT 写法(简单版本),该项目的目的是用户写完产品描述后,让大模型基于产品描述生成满足标准的前端页面。我们来拆解下他的 PROMPT。

 

这样的 PROMPT 设计允许业务知识通过附加内容部分嵌入到提示语中。可见按照 PROMPT 四要素的原则去设计,可以把业务相关知识比较容易嵌入到提示语中。

四、通过RAG(检索增强)方式接入
虽然通过 PROMPT 的方式直接接入大模型比较简单,但是直接 PROMPT 对接会面临两个挑战:

PROMPT 直接咨询大模型的时候,大模型并不了解你的业务知识,有时还会产生幻觉,导致回答质量不佳。

PROMPT 里嵌入的业务知识需要随着业务的变化而不断更新。

为了克服这些挑战,RAG 技术应运而生。RAG 技术是一种利用大语言模型(LLM)的应用方案,它的全称是检索增强生成(Retrieval Augmented Generation)。它的核心思想是通过检索获取相关的知识,并将其融入到大模型的输入中,让大模型能够参考这些知识来给出合理的回答或生成内容。

大模型 RAG 技术有很多优势,例如:

它可以解决大模型自身知识不足、幻觉问题、数据安全性等问题。

它可以利用私域数据或实时数据,提高大模型的时效性和专业。

RAG的实现
RAG的流程

上图展示了 RAG 的一个典型流程,我们来逐步分析这个流程。RAG 的主要步骤如下:

用户根据自己的需求输入指令,例如:公司 IT 的电话是多少?

知识检索器根据用户的指令,从业务知识存储池(向量数据库)中检索(向量搜索)出相关的知识。例如:在向量数据库中找到公司 IT 的电话号码等业务知识。

将用户的指令和业务知识组合成大模型的 PROMPT,例如组合后的结果为:基于如下内容回答:公司 IT 的电话是多少?。内容:公司的 IT 电话是 XXXX。

向大模型发出 PROMPT,并得到大模型的回答。

知识检索如何实现

知识检索可以从互联网直接获取知识,也可以先在企业内部存储业务知识,再进行检索。由于企业内部知识存储的应用较为广泛,我们这里只介绍这种实现方式。

业务知识检索主要包括两个环节,分别是业务知识的录入和检索。我们来逐一分析这两个环节的具体步骤。

业务知识录入:

用户将业务知识文档通过工具切分成若干片段。

对于每个文档片段,利用 Embedding Model 计算其对应的向量表示。

将文档片段和向量表示一起存储到向量数据库中。

业务知识检索:

用户输入检索指令,利用 Embedding Model 计算其对应的向量表示。

在向量数据库中查找与检索指令向量最相似的文档片段向量。

返回检索结果,即与检索指令最匹配的业务知识。

业务接入RAG检索的例子
下面以 KubeAI 大模型平台对接的数仓指标智能分析为例,讲解下一个具体业务如何通过 RAG 的方式接入大模型。

 

该项目能够根据用户的自然语言描述,直接生成用户可视化的数据展示。其简单 RAG 推理流程如下:

Agent 接收到用户的咨询问题,立即访问向量数据库,找出需要用到的数仓指标。

Agent 利用用户的咨询和指标,调用大模型,由大模型产生相应的查询指令。

Agent 运行查询指令,获得数据结果,将结果返回并呈现给用户。

五、通过Fine-tuning(微调训练)接入
微调训练的方式有哪些

上图展示了一个完整的大型模型训练过程,从大型模型的预训练到应用于业务场景,通常包括三个阶段:

预训练
定义:在大规模的无标注文本上,使用自监督学习的方法,训练一个通用的语言模型,使其能够捕捉语言的统计规律和语义知识。预训练是为了建立一个通用的语言理解基础。

数据例子:

今天是个好日子,我和我的朋友们一起去公园玩,我们在草地上野餐,还玩了飞盘和滑梯,我觉得很开心。
1
指令调优
定义:在预训练的基础上,使用一些有标注的(指令,输出)对模型进行微调,使其能够根据人类给定的指令,生成期望的输出。指令调优是为了提高模型的可控性和可解释性,使其能够按照用户的意图执行不同的任务。

数据例子:

指令:写一首五言绝句,主题是春天输出: 春风吹绿江南岸 桃花开满山头红 莺歌燕舞迎新岁 人间四月天如梦
1
RLHF
定义:在指令调优的基础上,使用强化学习的方法,利用人类的反馈作为奖励信号,对模型进行进一步的优化,使其能够生成更符合人类偏好的输出。RLHF 是为了提高模型的质量和安全性,使其能够避免一些不合理或不道德的生成结果。

KubeAI大模型平台上如何进行 Fine-tuning

在 KubeAI 大模型平台上,用户可以按照以下步骤迅速启动大型模型训练并进行自动部署:

选择大模型,基于之前提到的大模型选择原则,在大型模型平台上选择您需要的大模型。

上传训练数据,按照上述数据准备方法,将您准备好的数据上传到大型模型平台。

配置训练参数,通常情况下,选择默认配置参数,如 Lora 即可。这些参数通常经过优化以获得最佳的训练效果可。

训练,点击相应按钮,启动训练过程。大型模型平台将自动处理训练任务,以便您专注于业务应用的开发和部署。

一些Fine-tuning微调的例子
我们以训练一个某业务领域的智能客服机器人为例,讲解下如何通过 Fine-tuning 的方式构建一个智能客服机器人。

 

训练的目的是构造一个熟悉某业务领域知识的智能客服机器人。

数据准备。

准备业务领域知识,可以是文档,过往客服解决问题的聊天记录等。

数据清洗,主要目的是提升数据质量。最常见的操作比如,数据分类后进行去重,过滤,补充等方式。

构造客服聊天数据,基于上一步清洗好的数据,构造一问一答形式的客服聊天数据,可以调用其他大模型通过 PROMPT 的方式直接构造。

微调大模型。

基础大模型选型,选型考虑大模型的大小, 各项指标的评分等。模型参数越大越聪明,但是推理速度会变慢。所以最好的方式是可以多选几个大模型,做实验去评测。

微调大模型,可以选择一下开源框架直接微调大模型,比如大部分情况直接通过 Lora 的方式微调出一个 Lora Adapter 参数模型即可。

六、业务系统接入大模型的最佳路径
渐进式接入大模型

前面介绍了业务如何通过 PROMPT(提示语),RAG(检索增强),Fine-tuning(微调训练)三种方式接入大模型。OpenAI 的开发者大会 Maximizing LLM Performance 提出的业务接入大模型的方式,我们理解应该是渐进式接入,其流程如下。

第一步,业务先用 PROMPT 方式接入大模型。这一步很简单,只需编写 PROMPT,并建立基本的调用逻辑,测试效果。

第二步,业务在第一步的基础上,可以用 RAG 的方式接入。通过 RAG,可以改变 PROMPT 的内容,加入更多业务相关的知识。当然如果业务有充足的训练数据,这一步也可以省略,直接进入第三步的 Fine-tuning 方式。

第三步,业务用 Fine-tuning 方式接入大模型,可以让大模型更好地理解业务的知识。这一步需要有足够的高质量的数据,数据可以用第二步的 RAG 生成的数据,或其他来源的数据。Fine-tuning 相比于 RAG,可以提高大模型的推理准确性和速度。

七、总结与展望
本文介绍了业务系统接入大模型的三种方式:PROMPT、RAG和Fine-tuning。我们通过具体的实践案例,展示了这三种方式在不同场景下的效果和优势,以及如何根据业务需求和数据情况选择合适的方式。最后建议业务接入大模型的最佳实践,渐进式的接入,即 PROMPT,RAG,Fine-tuning,这个也是借鉴 OpenAI 开发者大会提出的接入方式。

大模型是未来业务创新的重要驱动力,可以帮助业务提升效率、质量和用户体验。建议业务可以通过渐进的方式接入大模型,从 PROMPT 开始,逐步尝试 RAG 和 Fine-tuning,以达到最佳的收益效果。也期待与更多的业务部门合作,共同探索大模型的更多可能性。
————————————————

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/m0_59596990/article/details/135760649

办公新利器:DeepSeek+Word,让你的工作更高效_deepseek接入word-CSDN博客

mikel阅读(485)

来源: 办公新利器:DeepSeek+Word,让你的工作更高效_deepseek接入word-CSDN博客\

DeepSeek与Word的梦幻联动,将为你开启高效办公的新篇章!熟悉的Word界面中,只需轻点鼠标,就能召唤出强大的DeepSeek,让它为你快速检索信息、精准翻译文本、智能生成内容…… 告别在不同软件间来回切换的繁琐,告别低效的信息获取方式,让办公效率飞起来!

 

1.效果演示
按照文本教程完成操作后,Word的选项卡中将会出现DeepSeek的生成图标,选中文本并点击生成,即可实现模型回复!例如,我们想要将一段中文文本翻译成英文:

 

 

接下来我将详细介绍,如何实现DeepSeek与Word的结合。

2.获取API key
API key的获取教程可以参照我之前的之一篇文章,在获取API key之后,回到这里。

PyCharm接入DeepSeek实现AI编程-CSDN博客
https://blog.csdn.net/qq_63708623/article/details/145370942?spm=1001.2014.3001.5501

3.配置Word
3.1 开发者工具的配置
新建一个Word文档,点击 文件 -> 选项 -> 自定义功能区,勾选“开发者工具”。

 

点击 信任中心 -> 信任中心设置,选择“启用所有宏”与“信任对VBA……”。

 

接下来点击确定,我们发现选项卡中出现了“开发者工具”,点击开发者工具,点击Visual Basic,将会弹出一个窗口。

 

3.2 复制代码
我们点击新窗口中的插入,点击模块。

 

点击后将会弹出一个编辑器,我们把如下代码复制到编辑区中。注意不要忘记替换你自己的API key。

Function CallDeepSeekAPI(api_key As String, inputText As String) As String
Dim API As String
Dim SendTxt As String
Dim Http As Object
Dim status_code As Integer
Dim response As String

API = “https://api.deepseek.com/chat/completions”
SendTxt = “{“”model””: “”deepseek-chat””, “”messages””: [{“”role””:””system””, “”content””:””You are a Word assistant””}, {“”role””:””user””, “”content””:””” & inputText & “””}], “”stream””: false}”

Set Http = CreateObject(“MSXML2.XMLHTTP”)
With Http
.Open “POST”, API, False
.setRequestHeader “Content-Type”, “application/json”
.setRequestHeader “Authorization”, “Bearer ” & api_key
.send SendTxt
status_code = .Status
response = .responseText
End With

‘ 弹出窗口显示 API 响应(调试用)
‘ MsgBox “API Response: ” & response, vbInformation, “Debug Info”

If status_code = 200 Then
CallDeepSeekAPI = response
Else
CallDeepSeekAPI = “Error: ” & status_code & ” – ” & response
End If

Set Http = Nothing
End Function

Sub DeepSeekV3()
Dim api_key As String
Dim inputText As String
Dim response As String
Dim regex As Object
Dim matches As Object
Dim originalSelection As Object

api_key = “替换为你的api key”
If api_key = “” Then
MsgBox “Please enter the API key.”
Exit Sub
ElseIf Selection.Type <> wdSelectionNormal Then
MsgBox “Please select text.”
Exit Sub
End If

‘ 保存原始选中的文本
Set originalSelection = Selection.Range.Duplicate

inputText = Replace(Replace(Replace(Replace(Replace(Selection.text, “\”, “\\”), vbCrLf, “”), vbCr, “”), vbLf, “”), Chr(34), “\”””)
response = CallDeepSeekAPI(api_key, inputText)

If Left(response, 5) <> “Error” Then
Set regex = CreateObject(“VBScript.RegExp”)
With regex
.Global = True
.MultiLine = True
.IgnoreCase = False
.Pattern = “””content””:””(.*?)”””
End With
Set matches = regex.Execute(response)
If matches.Count > 0 Then
response = matches(0).SubMatches(0)
response = Replace(Replace(response, “”””, Chr(34)), “”””, Chr(34))

‘ 取消选中原始文本
Selection.Collapse Direction:=wdCollapseEnd

‘ 将内容插入到选中文字的下一行
Selection.TypeParagraph ‘ 插入新行
Selection.TypeText text:=response

‘ 将光标移回原来选中文本的末尾
originalSelection.Select
Else
MsgBox “Failed to parse API response.”, vbExclamation
End If
Else
MsgBox response, vbCritical
End If
End Sub

完成后,可直接关闭弹窗。

3.3 添加新组
点击 文件 -> 选项 -> 自定义功能区,右键开发工具,点击添加新组。

 

在添加的新建组点击右键,点击重命名。将其命名为DeepSeek,并选择心仪的图标,最后点击确定。

 

首先选择DeepSeek(自定义),选择左侧的命令为“宏”,找到我们添加的DeepSeekV3,选中后点击添加。

 

随后,选中添加的命令,右键点击重命名,选择开始符号作为图标,并重命名为“生成”。

 

最后点击确定。

至此,Word成功接入DeepSeek大模型。

4.效果测试
选中文字,点击生成,就可以直接将选中的文本发送给大模型,大模型将会按照你选中的文本,做出响应。

 

————————————————

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/qq_63708623/article/details/145418457

本地部署 DeepSeek:小白也能轻松搞定! - 程序员晓凡 - 博客园

mikel阅读(7364)

来源: 本地部署 DeepSeek:小白也能轻松搞定! – 程序员晓凡 – 博客园

大家好,我是晓凡。

写在前面

最近DeepSeek太火了,以至于每个小伙伴都想试试。DeepSeek 的到来可谓是开启了全民AI热潮。

本以为DeepSeek本地化部署有多难,实际上验证后很简单,操作起来就像给电脑装个新软件那么简单,大约十多分钟可完成本地部署。

今天咱们来聊聊如何在自己的电脑上本地部署 DeepSeek-R1-1.5B 模型。

一、为啥要部署 DeepSeek-R1-1.5B?

在做的小伙伴可能跟我一样在使用DeepSeek时,经常遇到“服务器繁忙,请稍后再试。”

服务器繁忙,请稍后再试

先说说为啥我推荐这个版本吧。DeepSeek-R1-1.5B 是一个轻量级的模型,参数量只有 15 亿,听起来是不是很“迷你”?但别小瞧了它,这可是个“小而精”的家伙。它只需要 3GB 的显存就能运行,这意味着即使你的电脑配置不高,也能轻松驾驭它。而且,它在数学推理方面表现相当出色,甚至在某些基准测试中超过了 GPT-4o 和 Claude 3.5。当然了,如果你电脑配置更高,可以尝试其他版本。

二、DeepSeek 不同版本模型硬件要求

以下是 DeepSeek 不同版本模型的硬件要求,小伙伴们可以结合自己电脑配置选择版本

模型版本 参数量 显存需求(FP16) 推荐 GPU(单卡) 多卡支持 量化支持 适用场景
DeepSeek-R1-1.5B 15亿 3GB GTX 1650(4GB显存) 无需 支持 低资源设备部署(树莓派、旧款笔记本)、实时文本生成、嵌入式系统
DeepSeek-R1-7B 70亿 14GB RTX 3070/4060(8GB显存) 可选 支持 中等复杂度任务(文本摘要、翻译)、轻量级多轮对话系统
DeepSeek-R1-8B 80亿 16GB RTX 4070(12GB显存) 可选 支持 需更高精度的轻量级任务(代码生成、逻辑推理)
DeepSeek-R1-14B 140亿 32GB RTX 4090/A5000(16GB显存) 推荐 支持 企业级复杂任务(合同分析、报告生成)、长文本理解与生成
DeepSeek-R1-32B 320亿 64GB A100 40GB(24GB显存) 推荐 支持 高精度专业领域任务(医疗/法律咨询)、多模态任务预处理
DeepSeek-R1-70B 700亿 140GB 2x A100 80GB/4x RTX 4090(多卡并行) 必需 支持 科研机构/大型企业(金融预测、大规模数据分析)、高复杂度生成任务
DeepSeek-671B 6710亿 512GB+(单卡显存需求极高,通常需要多节点分布式训练) 8x A100/H100(服务器集群) 必需 支持 国家级/超大规模 AI 研究(气候建模、基因组分析)、通用人工智能(AGI)探索

三、晓凡硬件配置

  • CPU:AMD Ryzen 7 5800H with Radeon Graphics 3.20 GHz
  • 内存:16GB
  • 操作系统:Windows 11
  • 硬盘空间:500G,剩余335G

    硬件配置信息

四、部署步骤

4.1 下载并安装Ollama

访问官网:https://ollama.com/ 下载

官网下载

或者直接到GitHub下载

GitHub下载

安装文件OllamaSetup.exe大约745MB。

注:如果下载过于缓慢可以使用迅雷之类的加速下载;(晓凡将软件打包放网盘了,有需要的小伙伴可在文章末尾自取)

双击OllamaSetup.exe进行安装:

双击安装

4.2 检验Ollama是否安装成功

命令行输入 ollama -v 命令,出现如下版本号说明安装成功

安装成功

4.3 通过 Ollama 拉取 DeepSeek 模型

这里我选择是的1.5b,整个模型大小1.1 GB

  • 1.5B:适用于轻量级任务,如边缘设备(如智能手表、物联网设备)上的简单交互、小型智能问答系统等。目前开源的最小版本。
  • 671B:主要用于大规模云端推理,适合科研分析、数据挖掘等需要处理海量数据的复杂任务。目前开源的最强版本

更多版本可以在这里查看:https://ollama.com/library/deepseek-r1 。

image-20250212233235760

命令行输入:ollama run deepseek-r1:1.5b 拉取DeepSeek模型

拉取deepseek模型

整个拉取过程还是比较丝滑的,5到6分钟后看到【success】字样,代表成功安装DeepSeek R1,然后就可以与DeepSeek对话了

image-20250212234222695

4.4 与DeepSeek对话

通过上面步骤之后,我们就可以愉快的与Deep Seek对话了,如输入:程序员如何避免35岁焦虑?

与DeepSeek对话

4.5 安装WebUI

使用命令提示符与DeepSeek对话并不友好,为了更好的体验,我们可以安装WebUI,这里使用的是浏览器插件:Page Assit

(如果小伙伴找不到在哪下载Page Assit插件,晓凡打包放网盘了,可在文章末尾自取)

启动ollama服务后,输入快捷键【ctrl + shift+L】快捷键即可打开WebUI页面

刚安装Page Assit 插件, 需要进行一下如下设置

WebUI设置

设置完成后,选择模型就可以与DeepSeek对话了

与对话

五、实际应用场景:DeepSeek-R1-1.5B 能干啥?

别看 DeepSeek-R1-1.5B 体积小,它可一点都不“弱”。它非常适合用在一些轻量级的任务上,比如:

  • 智能客服:在小型企业或者个人项目中,它可以快速回答客户的一些常见问题,提高服务效率。
  • 语言学习:你可以用它来练习语言表达,比如输入一个中文句子,让它生成英文翻译。
  • 创意写作:如果你是个作家或者文案策划,它可以帮你快速生成一些创意片段或者文案初稿

六、小结

小伙伴们,是不是觉得本地部署 DeepSeek-R1-1.5B 模型超简单?只要按照上面的步骤操作,你就能让自己的电脑拥有一个“智能助手”。

而且,这个模型不仅运行速度快,还能在很多场景中发挥大作用。快去试试吧!

DeepSeek本地部署相关软件下载:

通过网盘分享的文件:DeepSeek本地部署软件.zip
链接: https://pan.baidu.com/s/1gQp1hJ2cTisfcd0hJcO9gw?pwd=ip55 提取码: ip55

本期内容到这儿就结束了,希望对您有所帮助。

我们下期再见 ヾ(•ω•`)o (●’◡’●)

DeepSeek-R1本地部署如何选择适合你的版本?看这里 - kaizi1992 - 博客园

mikel阅读(463)

来源: DeepSeek-R1本地部署如何选择适合你的版本?看这里 – kaizi1992 – 博客园

DeepSeek-R1本地部署:选择最适合你的版本,轻松搞定!

 

 

关于本地部署DeepSeek-R1前期知识

如果你正在考虑将DeepSeek-R1部署到本地服务器上,了解每种类型的硬件需求是非常重要的。DeepSeek-R1是一个非常强大的语言模型,它有多个不同的版本,每个版本在计算资源和硬件要求上都有不同的需求。本文将帮助你理解每个版本的参数、所需硬件以及如何根据自己的需求选择合适的类型。

 

 

选择最合适你的版本

PS:本文是本地化部署DeepSeek系列教程第二篇。本系列共计4篇文章,最终,我们讲实操在Windows操作系统和Mac操作系统实现本地部署DeepSeek-R1大模型。

DeepSeek-R1的不同类型及含义

DeepSeek-R1有多个不同的类型,每个类型的名称后面跟着一个数字(比如1.5B、7B、14B等),这些数字代表模型的参数量。参数量直接决定了模型的计算能力和存储需求,数字越大,模型越强,但也需要更多的硬件资源。

什么是“B”?

在这些数字中,B代表“billion”(十亿),所以:

1.5B意味着该模型有15亿个参数

7B表示70亿个参数

8B表示80亿个参数

14B表示140亿个参数

32B表示320亿个参数

70B表示700亿个参数

671B表示6710亿个参数

这些模型的参数量越大,处理的数据和生成的内容就越复杂,但它们也需要更多的计算资源来运行。

每种类型的硬件需求

每个模型的计算和存储需求都有所不同,下面我们列出了DeepSeek-R1的各个型号,并给出了所需的硬件配置。根据不同的使用需求,选择合适的模型可以帮助你节省成本,同时提升部署效率。

DeepSeek-R1类型信息表格

 

 

R1不同版本模型大小

各类型模型的硬件需求总结

根据你选择的型号,硬件需求会有所不同。以下是每个模型的大致硬件要求:

1.5B(1.1GB):

CPU:普通的四核或六核处理器即可。

显卡:中等性能显卡,如NVIDIA GTX 1650或RTX 2060。

内存:16GB RAM。

磁盘空间:至少50GB空闲空间。

7B(4.7GB):

CPU:6核或8核处理器。

显卡:NVIDIA RTX 3060或更强显卡。

内存:32GB RAM。

磁盘空间:至少100GB空闲空间。

8B(4.9GB):

CPU:6核或8核处理器。

显卡:NVIDIA RTX 3060或更强显卡。

内存:32GB RAM。

磁盘空间:至少100GB空闲空间。

14B(9GB):

CPU:8核以上处理器,如Intel i9或AMD Ryzen 9。

显卡:NVIDIA RTX 3080或更强。

内存:64GB RAM。

磁盘空间:至少200GB空闲空间。

32B(20GB):

CPU:8核以上处理器。

显卡:NVIDIA RTX 3090、A100或V100显卡。

内存:128GB RAM。

磁盘空间:至少500GB空闲空间。

70B(43GB):

CPU:12核以上处理器,推荐使用高端Intel或AMD处理器。

显卡:NVIDIA A100、V100显卡,甚至需要多个显卡配置。

内存:128GB RAM。

磁盘空间:至少1TB空闲空间。

671B(404GB):

CPU:高性能、多核CPU,建议多台服务器配置。

显卡:NVIDIA A100或多个V100显卡,甚至需要集群支持。

内存:至少512GB RAM。

磁盘空间:至少2TB空闲空间。

各模型硬件需求如下表:

 

 

各模型对比

说明:

CPU:随着模型参数量的增加,CPU的核心数要求也逐渐增加。高端多核处理器有助于减少计算瓶颈,尤其在大模型推理时。

显卡:随着模型规模的增大,对显卡的要求也越来越高。GPU的显存和计算能力成为关键。如果单卡显存不够,可能需要多个显卡联合工作。

内存:内存不仅仅用于存储模型参数,还需要为计算过程中的中间结果、缓存等分配足够空间。大模型尤其对内存的需求大,超过32GB的模型在内存方面会有较大压力。

磁盘空间:磁盘空间是根据模型的大小和推理过程中的临时数据存储需求计算的。尤其对于大型模型,在存储和加载数据时需要更多的空间。

注意:

这些硬件需求是针对 推理 场景进行估算的,如果是 训练,硬件需求会更高,特别是在GPU和内存方面。

实际硬件需求还取决于模型优化方法、量化技术、分布式计算和云服务等因素,可能会有所不同。

每个参数需要多少字节?

一般来说,DeepSeek-R1模型中的每个参数占用4个字节(32位)。这个值相对固定,常用于大多数深度学习模型。通过这个假设,我们可以计算出每个版本大致需要多少内存。

计算方法:

每个参数需要4字节

假设某个模型有70亿个参数(即70B模型)

所以,内存需求 = 70亿个参数 × 4字节/参数 = 28GB

 

 

不同模型需要内存大小

疑问:7B或者8B是阉割版本吗?

在DeepSeek-r1中,1.5B、7B、8B模型分别指的是模型的参数数量:1.5B代表15亿个参数,7B代表70亿个参数,8B代表80亿个参数。这些参数数量直接影响模型的计算能力和所需的存储空间。

1.5B模型是较小的版本,计算能力较弱,但占用的内存和存储空间较小,适合对硬件要求不高的场景。

7B和8B是更强大的版本,参数更多,计算能力更强,因此模型的推理能力和生成质量也更高。

7B不是阉割版,它只是相对于8B而言,参数数量稍少,因此它的计算能力和生成效果可能略差,但并不意味着它比8B“功能不全”或者“缩水”,只是在计算能力上有所差距。

如果你对推理速度和资源占用有较高的要求,选择1.5B会更合适。如果你希望模型生成质量更高,可能更倾向于7B或8B。不过,性能差距主要体现在任务的复杂性和精度上。

下面是每个版本的计算能力和生成质量的详细比较:

 

 

各个版本之间计算能力及生产能力对比

详细比较:

1.5B (15亿参数)

主要功能:适合基础的文本处理、情感分析、简单对话生成等。

与上一个版本的计算能力比较:没有前一个版本可比,作为最小模型,计算能力最弱。

与上一个版本的生成质量比较:同理,生成质量最低,文本较为简单和粗糙。

7B (70亿参数)

主要功能:能够处理多领域应用,如问答系统、对话生成、基本文本总结。

与上一个版本的计算能力比较:相比1.5B,计算能力提升了 367%,推理能力增强,能处理更多复杂任务。

与上一个版本的生成质量比较:相比1.5B,生成质量提升 60%,文本更自然,理解上下文能力增强。

8B (80亿参数)

主要功能:适用于高质量对话生成、短文本总结、复杂问题解答等。

与上一个版本的计算能力比较:相比7B,计算能力提升 14%,推理能力有所增强,但增幅较小。

与上一个版本的生成质量比较:相比7B,生成质量提升 20%,生成的文本更加自然、准确,适应更复杂的语境。

14B (140亿参数)

主要功能:高级语言理解、长篇文本生成、高级推理等任务。

与上一个版本的计算能力比较:相比8B,计算能力提升 75%,能够处理更复杂的语境和任务。

与上一个版本的生成质量比较:相比8B,生成质量提升 30%,长篇生成更连贯、自然,文本质量大幅提升。

32B (320亿参数)

主要功能:适合复杂推理任务、高级写作、长篇对话生成等。

与上一个版本的计算能力比较:相比14B,计算能力提升 129%,可以处理更多复杂任务。

与上一个版本的生成质量比较:相比14B,生成质量提升 40%,文本质量接近人工水平,适合高级写作和深度理解。

70B (700亿参数)

主要功能:深度语义理解、创意写作、多模态推理等高端应用。

与上一个版本的计算能力比较:相比32B,计算能力提升 119%,能够处理更加复杂的推理和生成任务。

与上一个版本的生成质量比较:相比32B,生成质量提升 50%,文本质量更加精细,几乎无明显错误,适用于创意和高精度任务。

671B (6710亿参数)

主要功能:超高精度推理、大规模内容生成、跨领域深度理解等任务。

与上一个版本的计算能力比较:相比70B,计算能力提升 860%,能够处理极为复杂的推理任务和大规模内容生成。

与上一个版本的生成质量比较:相比70B,生成质量提升 100%,文本生成几乎完美,几乎没有语境偏差,适用于最复杂的任务。

总结:

计算能力:从1.5B到671B,每个版本相对于前一个版本的计算能力都有显著提升,尤其是从 70B 到 671B,计算能力的大幅度提升说明了超大模型在推理复杂性上的巨大优势。

生成质量:生成质量从 1.5B 到 671B 逐步提升,每个新版本生成的文本更加自然、流畅,能够处理更复杂的上下文和细节。尤其是 70B 和 671B 版本的文本生成已经达到了极高水平,几乎可以媲美人工写作。

如何选择合适的型号?

选择哪种类型的DeepSeek-R1模型取决于你的应用场景以及硬件配置。如果你只是进行简单的文本处理、学习或小型项目,1.5B和7B可能就足够了。如果你的需求是生成高质量的文本,或者做大规模的数据处理,14B和更高的型号可能更适合。对于科研或者企业级应用,32B、70B甚至671B的型号能提供超高的性能和处理能力。

总结

不同型号的DeepSeek-R1:每个型号的参数数量和存储需求不同,越大的型号需要的硬件配置越高,处理能力也越强。

硬件配置:选择合适的型号时,需要考虑自己的硬件配置。例如,1.5B模型对硬件要求较低,而70B和671B则需要非常强大的计算资源。

估算内存需求:一般来说,每个参数占用4字节,通过参数数量和字节数可以粗略估算每个模型的内存需求。

我把deepseek等大模型接入了微信公众号,打造个人AI助手 - 程序员博博 - 博客园

mikel阅读(2038)

来源: 我把deepseek等大模型接入了微信公众号,打造个人AI助手 – 程序员博博 – 博客园

前言

最近deepseek大模型可是火出了圈,给国产大模型公司点赞。于是乎去deepseek试了一下效果,奈何太多人使用了,问两句来一句 “服务器繁忙,请稍后再试”,体验感实在太差了。

作为程序员,怎么能忍受?于是乎去寻找deepseek供应商,对比了下常用的供应商,比如阿里百炼的通义、字节火山的豆包、腾讯的混元、fireworks、together等等。发现其中还真有不少好用且稳定的供应商。

于是萌生了接入微信公众号,自己独享,速度快的起飞。直接在微信上使用,岂不美滋滋,说干就干。

cow项目

chatgpt-on-wechat(简称CoW),项目地址如下:cow

CoW开源项目,支持将deepseek、OpenAI、通义、豆包、文心一言等大模型接入到我们的办公工具上面,包括但不限于微信公众号、飞书、钉钉等

1、提前准备

  1. 你需要登录deepseek官网(或者其他提供商)获取你自己的专属API-KEYS
  2. 登录公众号后台,“在左侧菜单选择 “设置与开发 – 基本配置 – 服务器配置”获取你专属的url、token等信息

以上信息请提前准备好

2、配置cow项目

  1. 克隆项目到自己服务器上面,可以使用linux部署,也可以使用docker部署
  2. pip3 install -r requirements.txt (请使用python3.8+版本)
  3. 打开config.json配置文件,把刚才准备好的密钥填进来
{
  "channel_type": "wechatmp",
  "model": "你的大模型,可以是deepseek,也可以是qwen等等",
  "open_ai_api_key": "apikey",
  "open_ai_api_base": "https://api.deepseek.com/v1",
  "single_chat_prefix": [""],
  "single_chat_reply_prefix": "",

  "wechatmp_app_id": "wx6e**********0b5",
  "wechatmp_app_secret": "a204ce**********a12007a5",
  "wechatmp_token": "保持和公众号一致即可",
  "wechatmp_aes_key": "Hego**************2VeCc8875",
  "wechatmp_port": 8080,

  "clear_memory_commands": ["#清除记忆"],
  "conversation_max_tokens": 1000,
  "expires_in_seconds": 3600,
  "character_desc": "你是基于大语言模型的AI智能助手,旨在回答并解决人们的任何问题,并且可以使用多种语言与人交流。",
  "temperature": 0.8,
  "subscribe_msg": "感谢您的关注!\n程序员博博公众号已接入DeepSeek-V3、阿里qwen-max等模型,可以自由对话。\n受微信限制,较长的输出会先回复一句【正在思考中】,等待片刻后发送任意文字即可获取输出。如需清楚记忆,请回复:#清除记忆",
  "use_linkai": false
}
  1. 然后使用python3 app.py, 启动项目即可。
  2. 如果以上都没问题,那么恭喜你,你的公众号现在已经拥有deepseek大模型的能力,愉快的玩耍吧。
  3. 如果遇到了问题,请参考cow的官方文档

3、最终效果

这里我尝试了一下deepseek、qwen、文心一言等。发觉qwen是比较稳定快速的,所以最终我接入了阿里的qwen大模型

最后

最后,微信公众号接入了deepseek等大模型,非常的好用,可以成为自己的AI小助手,有问题,直接在微信上问他即可,非常的方便,专属于你的小助手。

也希望大家有条件可以尝试接入一下,接入的过程中肯定会遇到各种各样的奇葩问题,但大家一一解决的过程就是成长,我差不多利用下班时间2天搞定了。