AI个人学习
和实操指南

基于DeepSeek-R1实现本地/API知识库,并接入微信BOT

在上一篇《本地部署 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配置。

这里需要修改workspaceAnythingLLMkey这两个值就好。

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

CDN
未经允许不得转载:首席AI分享圈 » 基于DeepSeek-R1实现本地/API知识库,并接入微信BOT

首席AI分享圈

首席AI分享圈专注于人工智能学习,提供全面的AI学习内容、AI工具和实操指导。我们的目标是通过高质量的内容和实践经验分享,帮助用户掌握AI技术,一起挖掘AI的无限潜能。无论您是AI初学者还是资深专家,这里都是您获取知识、提升技能、实现创新的理想之地。

联系我们
zh_CN简体中文