Ollama+Fastgpt构建本地知识库
Ray Cheng 英砖生

协会想做一个基于知识库的AI机器人,由于其中的资料不想外传,所以选择采取使用本地大模型ChatGLM、FastGPT、One-api的方式来进行部署。不过因为目前仅需尝试跑通流程,而且我电脑A卡不太能够运行ChatGLM,所以先用Ollama来代替。

One-api和FastGPT的关系可以理解为,One-api是一个网关,用来整合各种API访问方式,方便FastGPT调用。

image

本文涉及资源如下:

  • FastGPT一个基于 LLM 大语言模型的知识库问答系统,提供开箱即用的数据处理、模型调用等能力。同时可以通过 Flow 可视化进行工作流编排,从而实现复杂的问答场景!

  • One-api
    All in one 的 OpenAI 接口整合各种API访问方式一键部署,开箱即用

  • Ollama:大语言模型管理工具

  • 零一万物api:国产自研大模型

  • M3e Embedding模型:最强开源中文嵌入模型

  • ChatGLM3:智谱AI和清华大学KEG实验室联合发布的对话预训练模型。

部署准备

文中部分项目部署到Docker需要Linux,在Windows系统中使用Docker和Linux需要安装Docker Desktop和WSL2,详情可以参考往期文章。

使用WSL2在Windos中安装Linux,并安装VScode插件

通过Docker部署FastGPT

部署流程就是下载FastGPT的docker-compose.yml和config.json文件,然后启动容器。

  1. 下载docker-compose.yml和config.json文件

    可以打开Linux命令行界面,输入以下代码快速下载

    1
    2
    3
    4
    mkdir fastgpt
    cd fastgpt
    curl -O https://raw.githubusercontent.com/labring/FastGPT/main/projects/app/data/config.json
    curl -o docker-compose.yml https://raw.githubusercontent.com/labring/FastGPT/main/files/docker/docker-compose-pgvector.yml

    FastGPT官方文档中docker-compose.yml文件一共有三个数据库版本,这里我下载的是第一个PgVector版本

    如果出现网络问题,则可以直接去GitHub上下载这两个文件然后放到创建的文件夹中去。

  2. 启动容器

    下载好之后,将docker-compose-pgvector.yml重命名为docker-compose.yml(好像不用改

    在 docker-compose.yml 同级目录下执行。请确保docker-compose版本最好在2.17以上,否则可能无法执行自动化命令。

    1
    2
    3
    4
    5
    6
    # 启动容器
    docker-compose up -d
    # 等待10s,OneAPI第一次总是要重启几次才能连上Mysql
    sleep 10
    # 重启一次oneapi(由于OneAPI的默认Key有点问题,不重启的话会提示找不到渠道,临时手动重启一次解决,等待作者修复)
    docker restart oneapi

下载Ollama

  1. 下载Ollama

    打开Ollama下载界面,下载后点击安装即可。

    在终端命令行输入ollama --version确认是否下载成功。出现具体版本号即下载成功。

    image

  2. 下载本地模型

    Ollama中支持很多本地大模型,可以去官网的模型库查看

    这里我下载的是llama3和qwen,在命令行输入ollama run llama3ollama run qwen即可,这是运行模型的命令,如果第一次运行,就会自动下载,下载好后,就可以直接和模型进行对话了。

    【图片】

通过Docker部署M3e模型

1
2
3
4
# 使用CPU运行
docker run -d --name m3e -p 6008:6008 registry.cn-hangzhou.aliyuncs.com/fastgpt_docker/m3e-large-api
# nvida-docker 使用GPU
docker run -d --name m3e -p 6008:6008 --gpus all registry.cn-hangzhou.aliyuncs.com/fastgpt_docker/m3e-large-api

以上是一键部署m3e的Linux命令,我的笔记本没有独显,所以选择CPU运行,在Linux命令行中输入第一行代码,会自动下载并部署。

要想实现RAG,还需要Embedding(嵌入)大模型,因为fastgpt自带的是openai的模型,需要购买api才能使用,所以我们同样采取本地配置,这里选择的模型是M3e(Moka Massive Mixed Embedding)模型。

开始配置oneapi

one-api简单来说就是用来管理和分发接口工具,可以将所有大模型一键封装成OpenAI协议

image

容器启动后,输入到localhost:3001进入到one-api的配置界面如下,可以进行多种配置,如渠道、令牌、兑换、充值、用户、日志等等,但是这里只需涉及渠道、令牌两个方面。

渠道配置
渠道可以简单理解为各个大模型厂商,可以是原始厂商,也支持代理厂商,每家厂商又可以支持多种模型。是为了方便管理用户访问模型的权限的,比如你要用one-api代理大模型并且商用,不同级别的用户配置不同的却道。不过自己用的话随便折腾。

令牌配置
令牌类似各种大模型的调用密钥,供客户端或调用方使用,可以设置使用额度和到期时间等。每个令牌都支持复制为三种格式,分别是:ChatGPT-Next-Web、BotGem、Opencat,用于快捷支持这些客户端调用One API。

本地搭建的话,令牌无需配置,使用默认即可

配置本地模型渠道

最初的想法是想试一下chatglm,但因为笔记本电脑性能不太支持,所以选择使用ollama上参数稍微小一点的模型。这里我选择使用qwen:4b、qwen:latest以及llama3:latest不同的本地模型配置基本一样。

image

类型:选择Ollama
名称:随便填写
分组:默认即可
模型:在输入框输入模型名称,要和模型名称严格一致
密钥:随便填写
代理:填写http://host.docker.internal:11434

如果都是使用Ollma中的模型,那么不同的本地模型,只需要在模型这一栏填入不同的名称即可,我这里只填了千问大模型。

问题:代理只能用host.docker.internal

配置零一万物大模型渠道

添加在线的大模型比较简单,无需填写代理,有密钥即可。我这里选择使用国产大模型零一万物。
image

类型:选择Ollama
名称:随便填写
分组:默认即可
模型:在输入框输入模型名称,要和模型名称严格一致
密钥:随便填写
代理:无需填写

M3e Embedding模型渠道配置

M3e模型渠道配置和之前的大致相同,需要注意的一点就是密钥一定要使用sk-aaabbbcccdddeeefffggghhhiiijjjkkk,因为docker的配置文件中是这样配置的。

image

类型:选择Ollama
名称:随便填写
分组:默认即可
模型:在输入框输入模型名称,要和模型名称严格一致
密钥:必须填写sk-aaabbbcccdddeeefffggghhhiiijjjkkk
代理:填写http://host.docker.internal:6008

其实在填写代理地址这一步,也遇到了一些问题,一开始我使用回环地址127.0.0.1也能够测试通过,后面突然测试不通过,改为了本机真实ip偶尔可以测试通过,但大部分还是不行。最后换为了host.docker.internal这个ip就可以了,具体的原理还不太清楚。

修改config文件

这一步就比较关键了,只有修改了config文件,才能在Fastgpt中使用我们以上配置好的模型。需要在config文件中增加配置,添加llms和vector models。

config文件的结构如下:

现在需要再llmmodels的板块中,添加以上配置模型的参数。该板块中应该默认有三个模型gpt…

我们只需复制第一个gpt-4o-mini的参数,然后修改模型名称和模型别名即可,其他参数应该应该根据具体的模型支持的详情来修改(但是我没有。如下,我添加了三个模型配置分别是llama3:latestqwen:latestyi-34b-chat-0205。此处的模型名称应和模型真实名称,同时也是one-api中配置的模型名称一致。

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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
"llmModels": [
{
"model": "gpt-4o-mini", // 模型名(对应OneAPI中渠道的模型名)
"name": "gpt-4o-mini", // 模型别名
"avatar": "/imgs/model/openai.svg", // 模型的logo
"maxContext": 125000, // 最大上下文
"maxResponse": 16000, // 最大回复
"quoteMaxToken": 120000, // 最大引用内容
"maxTemperature": 1.2, // 最大温度
"charsPointsPrice": 0, // n积分/1k token(商业版)
"censor": false, // 是否开启敏感校验(商业版)
"vision": true, // 是否支持图片输入
"datasetProcess": true, // 是否设置为文本理解模型(QA),务必保证至少有一个为true,否则知识库会报错
"usedInClassify": true, // 是否用于问题分类(务必保证至少有一个为true)
"usedInExtractFields": true, // 是否用于内容提取(务必保证至少有一个为true)
"usedInToolCall": true, // 是否用于工具调用(务必保证至少有一个为true)
"usedInQueryExtension": true, // 是否用于问题优化(务必保证至少有一个为true)
"toolChoice": true, // 是否支持工具选择(分类,内容提取,工具调用会用到。目前只有gpt支持)
"functionCall": false, // 是否支持函数调用(分类,内容提取,工具调用会用到。会优先使用 toolChoice,如果为false,则使用 functionCall,如果仍为 false,则使用提示词模式)
"customCQPrompt": "", // 自定义文本分类提示词(不支持工具和函数调用的模型
"customExtractPrompt": "", // 自定义内容提取提示词
"defaultSystemChatPrompt": "", // 对话默认携带的系统提示词
"defaultConfig": {}, // 请求API时,挟带一些默认配置(比如 GLM4 的 top_p)
"fieldMap": {} // 字段映射(o1 模型需要把 max_tokens 映射为 max_completion_tokens)
},
{
"model": "llama3:latest",
"name": "llama3",
"avatar": "/imgs/model/openai.svg",
"maxContext": 125000,
"maxResponse": 16000,
"quoteMaxToken": 120000,
"maxTemperature": 1.2,
"charsPointsPrice": 0,
"censor": false,
"vision": true,
"datasetProcess": true,
"usedInClassify": true,
"usedInExtractFields": true,
"usedInToolCall": true,
"usedInQueryExtension": true,
"toolChoice": true,
"functionCall": false,
"customCQPrompt": "",
"customExtractPrompt": "",
"defaultSystemChatPrompt": "",
"defaultConfig": {},
"fieldMap": {}
},
{
"model": "qwen:latest",
"name": "qwen",
"avatar": "/imgs/model/openai.svg",
"maxContext": 125000,
"maxResponse": 16000,
"quoteMaxToken": 120000,
"maxTemperature": 1.2,
"charsPointsPrice": 0,
"censor": false,
"vision": true,
"datasetProcess": true,
"usedInClassify": true,
"usedInExtractFields": true,
"usedInToolCall": true,
"usedInQueryExtension": true,
"toolChoice": true,
"functionCall": false,
"customCQPrompt": "",
"customExtractPrompt": "",
"defaultSystemChatPrompt": "",
"defaultConfig": {},
"fieldMap": {}
},
{
"model": "yi-34b-chat-0205",
"name": "yi-34b-chat-0205",
"avatar": "/imgs/model/openai.svg",
"maxContext": 125000,
"maxResponse": 16000,
"quoteMaxToken": 120000,
"maxTemperature": 1.2,
"charsPointsPrice": 0,
"censor": false,
"vision": true,
"datasetProcess": true,
"usedInClassify": true,
"usedInExtractFields": true,
"usedInToolCall": true,
"usedInQueryExtension": true,
"toolChoice": true,
"functionCall": false,
"customCQPrompt": "",
"customExtractPrompt": "",
"defaultSystemChatPrompt": "",
"defaultConfig": {},
"fieldMap": {}
},
{
"model": "gpt-4o",
"name": "gpt-4o",
...
},
{
"model": "o1-mini",
"name": "o1-mini",
...
},
{
"model": "o1-preview",
"name": "o1-preview",
...
}
]

接下来还需要添加M3e嵌入模型的配置,步骤同以上一样,先复制原有的模型参数,修改名称和别名,只是添加的位置不同,嵌入模型需要在vctor板块中添加,其实参数配置可以更简单一点,如下所示:

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
"vectorModels": [
{
"model": "text-embedding-ada-002", // 模型名(与OneAPI对应)
"name": "Embedding-2", // 模型展示名
"avatar": "/imgs/model/openai.svg", // logo
"charsPointsPrice": 0, // n积分/1k token
"defaultToken": 700, // 默认文本分割时候的 token
"maxToken": 3000, // 最大 token
"weight": 100, // 优先训练权重
"defaultConfig": {}, // 自定义额外参数。例如,如果希望使用 embedding3-large 的话,可以传入 dimensions:1024,来返回1024维度的向量。(目前必须小于1536维度)
"dbConfig": {}, // 存储时的额外参数(非对称向量模型时候需要用到)
"queryConfig": {} // 参训时的额外参数
},{
"model": "m3e",
"name": "m3e模型",
"price": 0.1,
"defaultToken": 500,
"maxToken": 1800
},
{
...
},
{
...
}
]

知识库问答AI搭建

接下来启动FastGpt的容器,进入到对应的本地网址localhost:3000

创建知识库

创建知识库,索引模型选择之前添加的m3e模型,文件处理模型选择yi-34b-chat-0205

image

随后点击右上角创建文件夹,进入文件夹点击右上角导入文本数据集上传相关文件到文件夹中,训练模式选择默认的直接分段后,等待索引完毕即可。

image

之后可以点击左侧搜索测试进行测试,需要注意的一点是,在进行测试时,要点击测试框上方的语义检索-问题优化,然后关闭问题优化,或者选择其他模型,不然就会报错,因为问题优化默认使用gpt-4o-mini,而我们没有配置这一模型。

image

创建对话机器人

使用01万物在线模型

点击工作台,右上角新建建议应用,然后关联相关的知识库即可。可以对该机器人进行自定义配置,如开场白、头像等等。

image

使用Ollama本地模型

ollama本地模型使用和在线模型没什么区别,只是需要在使用时,在命令行输入ollama serve启动ollma。或者也可以选择直接启动ollama客户端。

image

然后模型选择上,选择对应模型即可。

创建完成后,点击发布,即可在首页聊天框处进行聊天。同时在调试界面还有发布渠道可以选择,可以进行API调用等。

后续

可以尝试结合FastGpt的高级编排创建工作流配合知识库,提升AI回答的准确性。

拿翻译举例子,可以通过知识库上传术语库,高级编排工作流添加翻译反思模型和审校模型,实现全流程翻译。再进一步,可以完善输入环节,针对文本进行分割,处理长文本翻译。或者完善结尾,结合python和模型对齐,输出到excel表格中去。

参考文章

  1. Fastgpt配合chatglm+m3e或ollama+m3e搭建个人知识库
  2. ollama + fastgpt搭建本地私有AI大模型智能体工作流(AI Agent Flow)– windows环境
  3. oneapi:强大而易用的OpenAI接口管理和分发系统
  4. OneAPI-接口管理和分发神器:所有大模型一键封装成OpenAI协议
  5. 接入 M3E 向量模型
  6. M3E 可能是最强大的开源中文嵌入模型