在上一篇《本地部署 DeepSeek-R1及微信机器人接入教程》中,我们一起实现了本地部署DeepSeek-R1并接入了微信机器人,让它能跟我们聊天,今天,我要跟大家分享个更有意思的玩法:如何给咱们的 AI 助手喂点干货,让它变身成一个真正懂行的专业顾问!
接下来我会手把手带大家完成整个知识库搭建过程,包括环境配置、知识库部署、上传资料,还有一些细节调优的小技巧。最后我们再把这个"充满知识"的AI接入微信机器人,打造一个真正懂你、懂行业的智能小助手!

先来看下效果,这是我上传了一份《人体损伤致残程度分级》资料询问后的结果:

DeepSeek-R1部署
DeepSeek 部署有两种方式,一种是本地部署、一种是接入第三方API。
这两种的优缺点:
- 本地部署
✅ 优点:数据完全私有、长期成本低、响应快
❌ 缺点:吃本地算力、需要配置较高的机器 - API调用
✅ 优点:快速接入、免维护、弹性扩展
❌ 缺点:数据需传第三方、长期成本不可控
本地DeepSeek
首先你本机需要确保已经安装 ollama ,并且 ollama 能正常运行。
DeepSeekAPI
其实我原本打算这篇文章只写本地部署的方式的.....
不过呢,由于 DeepSeek 网页版最近一直在"罢工",我被迫尝试了本地 ChatBox 工具来接入 API。没想到体验了一把满血版的 R1,爽得飞起!觉得这个方案也很香,所以就顺手把 API 的方式也写进来。
这里我提供两个平台,大家自行选择接入。
先要获取APIkey,后续我们需要将APIkey填入知识库配置中。
火山方舟
官网
https://console.volcengine.com/ark
价格
输入:¥2/ M Tokens
输出:¥8/ M Tokens
进入侧的APIKey管理,创建APIkey

新建秘钥,复制APIkey

硅基流动
硅基流动 官网
https://cloud.siliconflow.cn/account/ak
价格
输入:¥4/ M Tokens
输出:¥16/ M Tokens
进入左侧的API秘钥,点击新建秘钥后复制秘钥

知识库
知识库安装
接着我们需要接入知识库,这里使用AnythingLLM这个项目。
AnythingLLM 是一个开源的大语言模型(LLM)应用框架,旨在帮助用户轻松构建和部署基于私有数据的智能问答、文档分析等应用。
进入 AnythingLLM 官网并下载安装程序
https://anythingllm.com/

运行安装程序,中间会下载所需要的额外依赖项(GPU、NPG支持)

如果下载失败了,或者是你关闭这个下载窗口跳过了这一步,AnythingLLM还是会成功安装。
这个时候不要担心,可以手动进行安装。
网盘链接中有一个lib压缩包。
解压压缩包,并将解压后的文件夹放入你的安装目录AnythingLLMresourcesollama目录内。

知识库配置
安装完成,进入 AnythingLLM 界面,这里需要选择一个默认的大模型。
本地配置
如果你使用的是本地部署 DeepSeek 的方式,向下拉找到Ollama选择即可。

API配置
如果你使用的是第三方API,这一步不需要选择ollama,向下找到Generic OpenAI
Generic OpenAI:
通过自定义配置连接到任何兼容OpenAI接口格式的服务。

这里需要填写5个参数

使用硅基流动API:
BaseURL请求地址
https://api.siliconflow.cn/v1
APIkeyAPI秘钥,填写刚才获取的即可
ChatModelName模型名称
Pro/deepseek-ai/DeepSeek-R1
Token context window(上下文窗口)
4096
Max Tokens(最大tokens数量)
4096或者是8192根据自己情况来
使用火山方舟API:
BaseURL请求地址
https://ark.cn-beijing.volces.com/api/v3
APIkeyAPI秘钥,填写刚才获取的即可
ChatModelName模型名称
这里比较特殊,火山方舟模型名称需要填写接入点ID。我们需要去平台上创建接入点。
首先先开通DeepSeekR1的服务

来到在线推理--创建接入点

确认接入

这个ID就是接入点ID,填写这个值即可。

Token context window(上下文窗口)
4096
Max Tokens(最大tokens数量)
4096或者是8192根据自己情况来
以上设置完成后,别忘了点SaveChanage保存。

工作区创建
下一步进入这个隐私界面,就是告诉你数据怎么存、怎么用的那些说明书,反正都是套话,直接跳过下一步就可以

这一步是欢迎界面,没啥特别的,直接跳过它

这里创建一个工作区名称,建议使用英文,因为要是后面想用 API 来调用的话,这个名字可就派上用场了。

现在进入 AnythingLLM 的主界面了。它会用一段示例对话来教你怎么玩

点击左边我们刚才起好名字的工作区,进入新的对话界面。

这里简单对话来测试模型是否调用成功。

工作区设置
点击工作区右侧的设置按钮进入设置界面。

进入聊天设置,我们可以在这里对模型进行细节上的调整

这里是调整当前使用的大模型。默认使用系统设置的,也就是刚才设置的ollama

也可以选择其他本地大模型或是API服务

模式分聊天和查询,查询表示只使用查询上下文功能(需要有自己上传的文档),聊天表示使用聊天功能+查询

上下文数量

你可以理解为是人设提示词,可以修改为中文,也可以保持默认。

投喂资料
接下来需要给知识库投喂资料,点击工作区旁的上传按钮

进入知识库管理界面

支持批量上传,支持Excel、world、txt等文件格式。这里我上传了一个《人体损伤致残程度分级》.pdf。

选中文件,点击Move to WorkSpace,这一步是将临时区的文件加入到工作空间。

可以看到上传的文件转移至右边,这里点击Sace and Embed进行保存。

下方提示WorkSpace updated successfully表示保存成功。

这里需点击Pin to workspace这个按钮。
Pin to workspace:
如果在使用 AnythingLLM 时,发现默认情况下没有得到满意的答案,那么可以通过钉住文档来提高回答质量。这是一种快速提升回答准确性和相关性的方法。
简单来说,文档钉住就是把文档内容直接“喂”给语言模型,让它在回答问题时能够参考这些内容,从而提供更好的答案。

然后我们回到对话页面,新建一个对话,提问问题,验证知识库是否添加成功。


误差解决
可以看到DeepSeek已经结合上传的资料进行回答,但是回答的问题有误差。
比如第一个问题:
问:
两根肋骨骨折是什么等级?
答:
根据提供的上下文信息,人体损伤致残程度分级标准中关于肋骨骨折的规定如下:
重伤二级:四肋以上骨折或者两肋以上并有反常活动;
轻伤一级:一至三肋骨骨折。
对于两根肋骨骨折的情况,如果没有伴随反常活动或其他严重情况(如超过四根),则属于轻伤一级。因此,两根肋骨骨折的等级是:
轻伤一级
但这在上传的文件中,两根肋骨骨折属于轻伤二级。这对于法律咨询方面的应用来说是比较严重的错误。

遇到这种回答不准的问题,也不用着急,我们来排查下原因。
我仔细看了下上传的 PDF 文件,发现里面有很多表格、特殊格式,还有一大堆用不到的内容。这些"杂质"会影响 AI 理解我们真正想要它学习的内容。

这些杂乱的格式会让 AI 抓不住重点,就像我们看到一本乱糟糟的书一样,所以我把关键内容重新整理成了一个简洁的 Word 文档,删掉了那些用不到的内容,然后重新喂给了 AI。
整理后的文档内容节选:
5.6.4轻伤二级
b)肋骨骨折2处以上。
c) 胸骨骨折;锁骨骨折;肩胛骨骨折。
d)胸锁关节脱位;肩锁关节脱位。
e) 胸部损伤,致皮下气肿1周不能自行吸收。
f) 胸腔积血;胸腔积气。
g)胸壁穿透创。
h)胸部挤压出现窒息征象。
5.6.5轻微伤
a)肋骨骨折;肋软骨骨折。
5.7 腹部损伤
5.7. 1重伤一级
a)肝功能损害(重度)。
b)胃肠道损伤致消化吸收功能严重障碍,依赖肠外营养。
c) 肾功能不全(尿毒症期)。
再试着问了一遍,这次回答准确多了!

这只是最简单的解决方案。如果你想让 AI 回答得更准确,还可以试试调整文档格式、优化搜索方式、调整 AI 参数等方法。不过这些高级玩法我们后面再聊。
接入微信BOT
获取AnythingLLM秘钥
打开AnythingLLM界面,进入设置-API秘钥-生成新的API秘钥

使用整合包
我已经将AnythingLLM的接口接入到NGCBOT中并制做成整合包。
解压网盘链接中的NGCBOT_LLM.zip压缩包,双击启动器.exe即可运行。
在使用之前需要做三件事!
在使用之前需要做三件事!
在使用之前需要做三件事!
第一,确认你整合包目录下没有中文,有中文必报错!
正确示范
F:AIAIpackageNGCBot
错误示范
F:微信BOTAIpackageNGCBot
第二,安装指定版本微信。
在网盘链接中有一个微信版本
WeChatSetup-3.9.10.27.exe
安装这个版本,电脑上原本有微信不用删除,直接覆盖安装。
第三,修改NGCBOT的配置文件。
需要对ConfigConfig.yaml配置文件就行修改。
配置文件一共修改三处
1.修改超级管理员配置。
这里填入你设定的微信号的ID,记住一定要改!不然都发给我了....
这个ID如何获取?用你想设为管理员的微信号,给机器人发个消息,然后在控制台就能看到发送消息人的id。

2.修改ai优先级配置。
这里是ai接口执行的次序,前面的数字越小代表优先执行。默认设定是AnythingLLM优先。

3.AnythingLLM配置。
这里需要修改workspace、AnythingLLMkey这两个值就好。
workspace填写你AnythingLLM创建的工作区的名称,就是那个小写的。
AnythingLLMkey填写你AnythingLLM中获取的秘钥。不是硅基流动或者是火山方舟的那个秘钥!!
记住前面的Bearer不要去掉

按照以上步骤修改后,双击启动器.exe就可以愉快的玩耍咯!
整合包获取在文章末尾。
恭喜你!看到这里的都是👍🏻👍🏻
如果你只想快速上手玩转知识库机器人,看到这里就可以。
下面是写给想深入研究的小伙伴的内容
- 如何调用 AnythingLLM 接口
- 如何扩展 NGCBOT 功能
感兴趣的可以继续往下看
开发拓展
接口调用
此步骤适合想拓展开发研究的小伙伴,如果你是小白,想直接玩整合包,请跳过此步骤。
OK,我们来玩点高级的,浏览器输入[http://localhost:3001/api/docs/](http://localhost:3001/api/docs/)进入API页面。
这里由于官方原本的API文档网页访问不了,所以改成本地访问API文档。
进入API说明网页后,可以看到这里面有各种各样的接口。并且支持在这个网页上直接进行调试。
在开始接入之前,我们需要授权一下秘钥,点击Authorize。

在打开的界面将AnythingLLMAPI秘钥粘贴进去,授权成功

接着向下找到/v1/workspace/{slug}/chat这个API

参数说明
| 参数 | 说明 | 备注 |
|---|---|---|
| slug | 工作空间 | 拒绝中文字符、大写等特殊字符,只能小写 |
| message | 消息内容 | 你要发送的消息 |
| mode | 模式 | 模式分chat和query,query表示只使用查询上下文功能(需要有自己上传的文档),chat表示使用聊天功能 |
请求示例(Request body)
curl --location 'http://localhost:3001/api/v1/workspace/newwork/chat'
--header 'Authorization: Bearer 7X26VBD-0824RMG-MD0VV2X-PC02ZJ4'
--header 'Content-Type: application/json'
--data '{
"message": "两根肋骨骨折是什么等级?",
"mode": "chat"
}'
Responses
{
"id": "488ff13e-0206-4014-bf50-ea2d8e78c1c3",
"type": "textResponse",
"close": true,
"error": null,
"chatId": 17,
"textResponse": "<think>n好的,我现在需要解决用户的问题:“两根肋骨骨折是什么等级?” 用户之前已经询问过这个问题,并且我给出了一个回答,但现在他再次提问,可能希望得到更详细或不同的解释。nn首先,回顾一下上下文。在提供的Context 0中,5.6.4轻伤二级部分提到了b)肋骨骨折2处以上属于轻伤二级。因此,两根肋骨骨折符合这一标准,应定级为轻伤二级。nn用户可能是一名法律工作者、家属或受伤者本人,想要了解骨折的严重程度以便处理工伤赔偿或其他相关事宜。他们可能对分级标准不太熟悉,所以才会多次询问。nn在思考过程中,我需要确认是否还有其他相关的评定标准会影响结果。例如,是否有特殊情况如骨折的位置、是否伴随内脏损伤等,这些因素可能会改变评定等级。但根据提供的Context,没有提到这些情况,因此只能基于给出的信息进行判断。nn此外,用户可能希望知道如何申请工伤认定或后续的赔偿流程,但由于信息有限,我无法提供具体步骤,但可以建议他们联系劳动保障部门或医疗机构获取专业指导。nn总结来说,两根肋骨骨折属于轻伤二级,这是根据提供的标准得出的结论。用户可能需要进一步的法律或医疗咨询来处理相关事宜。n</think>nn根据您提供的上下文信息:nn在 **5.6.4 轻伤二级** 中提到:n- **b) 肋骨骨折2处以上**。nn因此,**两根肋骨骨折属于轻伤二级**。",
"sources": [
{
"text": "5.2.4轻伤二级nna)面部单个创口或者瘢痕长度4.5cm 以上;多个创口或者瘢痕长度累计6.0cm 以上。nnb)面颊穿透创,皮肤创口或者瘢痕长度1.0cm以上。nnc)口唇全层裂创,皮肤创口或者瘢痕长度1.0cm 以上。nnd) 面部块状瘢痕,单块面积3.0cm²以上或多块面积累计5.0cm²以上。nne) 面部片状细小瘢痕或者色素异常,面积累计8.0cm²以上。f)眶壁骨折(单纯眶内壁骨折除外)。nng)眼睑缺损。nnh) 一侧眼睑轻度外翻。nni) 一侧上眼睑下垂覆盖瞳孔。nnj) 一侧眼睑闭合不全。nnk)一侧泪器损伤伴溢泪。nn1)耳廓创口或者瘢痕长度累计6.0cm以上。nnm)耳廓离断、缺损或者挛缩畸形累计相当于一侧耳廓面积15%以上。n)鼻尖或者一侧鼻翼缺损。nno) 鼻骨粉碎性骨折;双侧鼻骨骨折;鼻骨骨折合并上颌骨额突骨折;鼻骨骨折合并鼻中隔骨折;双侧上颌骨额突骨折。nnp) 舌缺损。nnq) 牙齿脱落或者牙折2枚以上。nnr) 腮腺、颌下腺或者舌下腺实质性损伤。nns) 损伤致张口困难I 度 。nnt)颌骨骨折(牙槽突骨折及一侧上颌骨额突骨折除外)。u)颧骨骨折。nn5.2.5轻微伤nnnnnnnnnna)面部软组织创。nnb)面部损伤留有瘢痕或者色素改变。nnc) 面部皮肤擦伤,面积2.0cm²以上;面部软组织挫伤;面部划伤4.0cm以上。nnd)眶内壁骨折。nne)眼部挫伤;眼部外伤后影响外观。nnf) 耳廓创。nng) 鼻骨骨折;鼻出血。h)上颌骨额突骨折。nni) 口腔粘膜破损;舌损伤。nnj) 牙齿脱落或者缺损;牙槽突骨折;牙齿松动2枚以上或者Ⅲ度松动1枚以上。nn5.3 听器听力损伤nn5.3. 1重伤一级nna) 双耳听力障碍(≥91dB HL)。nn5.3.2重伤二级nna) 一耳听力障碍(≥91dB HL)。nnb) 一耳听力障碍(≥81dB HL),另一耳听力障碍(≥41dB HL)。nnc) 一耳听力障碍(≥81dB HL),伴同侧前庭平衡功能障碍。nnd) 双耳听力障碍(≥61dB HL)。nne) 双侧前庭平衡功能丧失,睁眼行走困难,不能并足站立。nn5.3.3轻伤一级nna)双耳听力障碍(≥41dB HL)。nnb)双耳外耳道闭锁。nn5.3.4轻伤二级nna) 外伤性鼓膜穿孔6周不能自行愈合。b...continued on in source document...",
"id": "210f98f0-d656-4c0f-b3d5-d617f6398eca",
"url": "file://C:\Users\XX\AppData\Roaming\anythingllm-desktop\storage\hotdir\新建 DOCX 文档.docx",
"title": "新建 DOCX 文档.docx",
"docAuthor": "no author found",
"description": "No description found.",
"docSource": "pdf file uploaded by the user.",
"chunkSource": "localfile://C:\Users\XX\Desktop\新建 DOCX 文档.docx",
"published": "2025/2/7 13:00:52",
"wordCount": 126,
"token_count_estimate": 3870
}
],
"metrics": {
"prompt_tokens": 431,
"completion_tokens": 326,
"total_tokens": 757,
"outputTps": 63.178294573643406,
"duration": 5.16
}
}
这样我们完成了AnythingLLM接口的调用测试。根据这个接口你可以实现自己的业务逻辑,下面我们结合微信BOT来实现知识库机器人。
NGC修改
NGCBOT项目中需要在ApiServerAiServerAiDialogue.py脚本中增加调用AnythingLLM的逻辑。
这里我直接放代码。
def getAnythingLLM(self, content, messages):
"""
本地 AnythingLLM 模型
:param content: 对话内容
:param messages: 消息列表
:return:
"""
op(f'[*]: 正在调用本地AnythingLLM对话接口... ...')
messages.append({"role": "user", "content": f'{content}'})
data = {
"model": self.anythingLLMConfig.get('anythingllmModel'),
"message": content
}
headers = {
"Content-Type": "application/json",
"Authorization": self.anythingLLMConfig.get('anythingllmKey')
}
try:
resp = requests.post(
url=self.anythingLLMConfig.get('anythingllmApi').format(workspace=self.anythingLLMConfig.get('workspace')),
headers=headers,
json=data,
timeout=300
)
resp.encoding = 'utf-8'
json_data = resp.json()
assistant_content = json_data['textResponse']
if "</think>" in assistant_content:
assistant_content = assistant_content.split("</think>")[1].strip()
messages.append({"role": "assistant", "content": f"{assistant_content}"})
if len(messages) == 21:
del messages[1]
del messages[2]
return assistant_content, messages
except Exception as e:
op(f'[-]: 本地AnythingLLM对话接口出现错误, 错误信息: {e}')
return None, [{"role": "system", "content": f'{self.systemAiRole}'}]
init中添加anythingLLMConfig
self.anythingLLMConfig = {
'anythingllmApi': configData['apiServer']['aiConfig']['AnythingLLM']['AnythingllmApi'],
'anythingllmKey': configData['apiServer']['aiConfig']['AnythingLLM']['AnythingllmKey'],
'anythingllmModel': configData['apiServer']['aiConfig']['AnythingLLM']['AnythingllmModel'],
'workspace': configData['apiServer']['aiConfig']['AnythingLLM']['workspace']
}
整合包获取
嘟嘟实验室——Windowns版
夸克:
https://pan.quark.cn/s/8d1293227cf9
百度:
https://pan.baidu.com/s/1wx8LmbY2XBaJAAJvmGK06g?pwd=8d5m
© 版权声明
文章版权归 AI分享圈 所有,未经允许请勿转载。
相关文章
暂无评论...




