【Web】Nginx文件已经存在全局反向代理问题如何排查记录并处理-数据运维技术

mikel阅读(336)

来源: 【Web】Nginx文件已经存在全局反向代理问题如何排查记录并处理-数据运维技术

项目场景:

阿里云搭建的宝塔Linux面板,上面已经搭建过其它网站了,我现在给一个新增的网站增加一个反向代理端口,但是通过宝塔面板添加反向代理的时候,出现了下图伪静态的错误。

 

问题描述

伪静态/nxinx主配置/vhost/文件已经存在全局反向代理

这个问题是其实是告诉我们nginx配置文件里面一个网站只能包含一个location /,不然就会产生报错了。

 

原因分析:

问题已经非常清楚了,就是nginx.conf的相关配置出现问题。

第一步,查看网站的相关配置文件,直接点击网站进入详情就可以查看配置文件了。

server
{
listen 80;
server_name www.123456.com;
index index.php index.html index.htm default.php default.htm default.html;
root /www/wwwroot/www.123456.com; 

#SSL-START SSL相关配置,请勿删除或修改下一行带注释的404规则
#error_page 404/404.html;
#SSL-END

#ERROR-PAGE-START 错误页配置,可以注释、删除或修改
#error_page 404 /404.html;
#error_page 502 /502.html;
#ERROR-PAGE-END

#PHP-INFO-START PHP引用配置,可以注释或修改
include enable-php-74.conf;
#PHP-INFO-END

#REWRITE-START URL重写规则引用,修改后将导致面板设置的伪静态规则失效
include /www/server/panel/vhost/rewrite/www.123456.com.conf;
#REWRITE-END

#禁止访问的文件或目录
location ~ ^/(\.user.ini|\.htaccess|\.git|\.svn|\.project|LICENSE|README.md)
{
return 404;
}

#一键申请SSL证书验证目录相关设置
location ~ \.well-known{
allow all;
}

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
error_log /dev/null;
access_log /dev/null;
}

location ~ .*\.(js|css)?$
{
expires 12h;
error_log /dev/null;
access_log /dev/null;
}
access_log /www/wwwlogs/www.123456.com.log;
error_log /www/wwwlogs/www.123456.com.error.log;
}

可以看到我这个配置页面并没有出现单独的location /规则,都是加入了相关的后缀限制。但是可以看到上面还出现了一个  include /www/server/panel/vhost/rewrite/www.123456.com.conf 重写的规则配置文件。

切换到这个目录查看这个文件。

可以看到这个文件也是空的,没有任何配置,有些问题可能是配置了下面的伪静态规则,如果配置了的话,会显示在那个rewrite文件夹下的配置文件里面的。

现在基本可以确定这个网站的配置,没有伪静态配置,也没有其它单独的location /配置。

那问题只能出在了nginx.conf原本的配置文件里面了,可以在下面的路径查看nginx文件配置,如果你首页添加了nginx的图标,也可以直接点进去配置,也可以直接通过ssh软件登录然后直接修改文件。

查看这个nginx.conf配置文件

user www www;
worker_processes auto;
error_log /www/wwwlogs/nginx_error.log crit;
pid /www/server/nginx/logs/nginx.pid;
worker_rlimit_nofile 51200; 

events
{
use epoll;
worker_connections 51200;
multi_accept on;
}

http
{
include mime.types;
#include luawaf.conf;

include proxy.conf;

default_type application/octet-stream;

server_names_hash_bucket_size 512;
client_header_buffer_size 32k;
large_client_header_buffers 4 32k;
client_max_body_size 50m;

sendfile on;
tcp_nopush on;

keepalive_timeout 60;

tcp_nodelay on;

fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 256k;
fastcgi_intercept_errors on;

gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.1;
gzip_comp_level 2;
gzip_types text/plain application/JavaScript application/x-JavaScript text/javascript text/css application/xml;
gzip_vary on;
gzip_proxied expired no-cache no-store private auth;
gzip_disable “MSIE [1-6]\.”;

limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn_zone $server_name zone=perserver:10m;

server_tokens off;
access_log off;

server
{
listen 888;
server_name phpmyadmin;
index index.html index.htm index.php;
root /www/server/phpmyadmin;
location ~ /tmp/ {
return 403;
}

#error_page 404 /404.html;
include enable-php.conf;

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
}

location ~ .*\.(js|css)?$
{
expires 12h;
}

location ~ /\.
{
deny all;
}

location / {
if (!-e $request_filename){
rewrite ^(.*)$ /index.php?s=$1 last; break;
}
}

access_log /www/wwwlogs/access.log;
}
include /www/server/panel/vhost/nginx/*.conf;
}

可以看到,确实存在一个location /匹配规则, 虽然这个规则是属于一个server:888端口下的配置,先删除再说,然后下面还看到一个Include 文件夹。去这个文件夹下查看,这个配置文件就是我们通过宝塔面板配置的网站参数配置,不需要再查看了。

删除上面那个location /, 再去添加反向代理,这次添加直接成功了。

 

解决方案:

首先需要了解nginx.conf各个路径的配置文件,这个问题涉及到三个路径的配置文件。

第一个是网站的伪静态重写配置文件,在/www/server/panel/vhost/rewrite/ 路径的文件夹下。

第二个是网站本身的配置文件,在/www/server/panel/vhost/nginx/ 路径的文件夹下。

第三个最后一个是nginx.conf配置文件,这个一般都是在/www/server/nginx/conf/ 路径下,然后查看每个配置是否存在location / 匹配规则,有的话需要删除。

这次是因为nginx.conf文件下的server:888块存在一个location / 匹配规则,把红色部分删除掉就行了。

CentOS 7.9+.net7+宝塔 部署.NET7项目最全教程 - andywu188 - 博客园

mikel阅读(259)

来源: CentOS 7.9+.net7+宝塔 部署.NET7项目最全教程 – andywu188 – 博客园

首先切换到ROOT

1
sudo -i

一、安装宝塔

1、安装宝塔8.0.4

Centos: yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh
Ubuntu/Deepin: wget -O install.sh https://download.bt.cn/install/install-ubuntu_6.0.sh && sudo bash install.sh

 

2、打上开心版补丁,来源于网络,仅供测试学习(此步骤可以省略)建议购买正版

升级命令:
企业版:
curl https://io.bt.sy/install/update_panel.sh|bash
另外,需要在以下网站中加白服务器IP:
https://safe.bt.sy/

3、安装nginx,如果有需要可再安装MySQL、ftp等应用

4、新建网站

二、安装.net7环境

1、#注册 Microsoft 密钥。注册产品存储库。安装必需的依赖项。

//SentOS 7
sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm

//SentOS 8
sudo rpm -Uvh https://packages.microsoft.com/config/centos/8/packages-microsoft-prod.rpm

 

注意,如果执时后出现如下错误:

package packages-microsoft-prod-1.0-1.noarch is already installed
file /etc/yum.repos.d/microsoft-prod.repo from install of packages-microsoft-prod-1.0-1.noarch conflicts with file from package packages-microsoft-prod-1.0-1.noarch

需要在执行的命令后面加上两个参数即可解决  –nodeps –force

 

2、#安装 .NET Core 运行时(此步骤可以省略,前提是发布.net core程序时,有选择“布署模式”为“独立”,独立时,不需要单独安装环境,但发布包可能会比较大)

复制代码
.net core 7安装命令:
Centos:
sudo yum -y install aspnetcore-runtime-7.0

Ubuntu/Deepin::
sudo apt-get update && \

sudo apt-get install -y aspnetcore-runtime-7.0
复制代码

 

详明说时可以参考:https://learn.microsoft.com/zh-cn/dotnet/core/install/linux-ubuntu-2204

 

#查看Dotnet 版本信息

1
dotnet --info

其他发行版,请参考官方文档:https://docs.microsoft.com/zh-cn/dotnet/core/install/linux-centos

 

三、发布.net程序

1、以独立模式发布,此种方式,服务器不需要安装.net core 环境。

2、以框架依赖模式发布,此种方式,服务器需要安装.net core 环境,按照第二步中操作。

四、启动程序

1、将发布的程序上传到服务器新建的网站目录下

 

2、通过终端定位到站点根目录,并运行程序,此步骤可以不操作,看文章第六部分,使用守护进程来执行。

复制代码
//方案1
cd /www/wwwroot/mySiteDir
dotnet 解决方案名称.dll

//方案2(发布时生成单文件后,主程序为没有扩展名的文件)
//先安装icu库
yum install icu
//切换到程序目录
cd /www/wwwroot/mySiteDir
//设置程序执行权限
chmod 777 ./解决方案名称
//启动程序
./解决方案名称
复制代码

出现访问地址了 http://localhost:5000 即为启动成功。

五、设置反向代理

1、打开站点配置,反向代理,添加反向代理

 

填写一个名称,目标URL填

1
http://localhost:5000

发送域名这里填自己的域名(或者IP)即可,也可以填写  $host,代表当前请求的任何域名。

六、配置守护进程。(可以让网站持续运行)

1、安装supervisor

2、添加守护进程,启动用户为root,运行目录为对应的网站目录,

启动命令为【dotnet 解决方案.dll】,单文件发布时,启动命令为【./解决方案名称】

七、可能出现的问题

1、在第一次部署后,遇到报错:

1
2
System.InvalidOperationException: The SPA default page middleware could not return the default page '/index.html' because it was not found, and no other middleware handled the request.
Your application is running in Production mode, so make sure it has been published, or that you have built your SPA manually. Alternatively you may wish to switch to the Development environment.

可能是前端项目没有上传服务器。需要将解决方案目录下ClientApp/dist文件夹上传到网站根目录,具体根具实际情况来。

然后修改一下startup.cs中的Configure方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
public void Configure(IApplicationBuilder app, IOptionsMonitor<Configs> configs, IHostEnvironment env)
        {
            app.UseExceptionHandler(configs.CurrentValue.ErrorHandler);
            app.UseStaticFiles();
            app.UseWtmStaticFiles();
            //app.UseSpaStaticFiles();1.第一步修改,注释掉,新添加下面新行代码
            var spaStaticFileOptions = new StaticFileOptions
            {
                FileProvider = new Microsoft.Extensions.FileProviders.PhysicalFileProvider(System.IO.Path.Combine(env.ContentRootPath, "ClientApp/dist"))
            };
            app.UseSpaStaticFiles(spaStaticFileOptions);
            app.UseWtmSwagger();
            app.UseRouting();
            app.UseWtmMultiLanguages();
            app.UseWtmCrossDomain();
            app.UseAuthentication();
            app.UseAuthorization();
            app.UseSession();
            app.UseWtm();
            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllerRoute(
                   name: "areaRoute",
                   pattern: "{area:exists}/{controller=Home}/{action=Index}/{id?}");
                endpoints.MapControllerRoute(
                    name: "default",
                    pattern: "{controller=Home}/{action=Index}/{id?}");
                if (env.IsDevelopment())
                {
                    endpoints.MapToVueCliProxy(
                        "{*path}",
                        new SpaOptions { SourcePath = "ClientApp" },
                        npmScript: "start",
                        regex: "Compiled successfully");
                }
            });
            
            app.UseWtmContext();
            //app.UseSpa(spa =>
            //{
            //    spa.Options.SourcePath = "ClientApp";
            //});2.第二步修改,注释掉,新添加下面新行代码
            app.UseSpa(spa =>
            {
                if (env.IsDevelopment())
                    spa.Options.SourcePath = "ClientApp/";
                else
                    spa.Options.DefaultPageStaticFileOptions = spaStaticFileOptions;
                //if (env.IsDevelopment())
                //{
                //    spa.UseVueCli(npmScript: "serve");
                //}
            });
        }

 

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

mikel阅读(282)

来源: 【.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阅读(215)

来源: 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阅读(329)

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

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

mikel阅读(1199)

来源: 开挂!小白用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阅读(199)

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阅读(763)

来源: 太通透了!大模型接入业务系统的最佳实践来了-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阅读(497)

来源: 办公新利器: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阅读(7380)

来源: 本地部署 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 (●’◡’●)