在上一篇《本地部署 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
APIkey
API秘钥,填写刚才获取的即可
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
APIkey
API秘钥,填写刚才获取的即可
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