发表于 3 天前

【项目】基于MCP+Tabelstore架构实现知识库答疑系统

整体流程设计

https://i-blog.csdnimg.cn/direct/be289dcac95447ae92bd02fa11b84201.png#pic_center
主要分为两部分:知识库构建和检索。
1.知识库构建


[*]文本切段:对文本进行切段,切段后的内容需要保证文本完整性以及语义完整性。
[*]提取 FAQ:根据文本内容提取 FAQ,作为知识库检索的一个补充,以提拔检索效果。
[*]导入知识库:将文本和 FAQ 导入知识库,并进行 Embedding 后导入向量。
2.知识检索(RAG)


[*]题目拆解:对输入题目进行拆解和重写,拆解为更原子的子题目。
[*]检索:针对每个子题目分别检索相关文本和 FAQ,针对文本接纳向量检索,针对 FAQ 接纳全文和向量混淆检索。
[*]知识库内容筛选:针对检索出来的内容进行筛选,保留与题目最相关的内容进行参考答复。
相比传统的 Naive RAG,在知识库构建和检索分别做了一些常见的优化,包括 Chunk 切分优化、提取 FAQ、Query Rewrite、混淆检索等。
(一)Agent 架构

https://i-blog.csdnimg.cn/direct/9c077da4aba1456fa68a9eb58dc0c425.webp#pic_center
整体架构分为三个部分:


[*]知识库:内部包罗 Knowledge Store 和 FAQ Store,分别存储文本内容和 FAQ 内容,支持向量和全文的混淆检索。
[*]MCP Server:提供对 Knowledge Store 和 FAQ Store 的读写操作,统共提供 4 个 Tools。
[*]功能实现部分:完全通过 Prompt + LLM 来实现对知识库的导入、检索和问答这几个功能。
具体实现
所有代码开源在这里,分为两部分:


[*]Python 实现的 Client 端:实现了与大模型进行交互,通过 MCP Client 获取 Tools,根据大模型的反馈调用 Tools 等基本能力。通过 Prompt 实现了知识库构建、检索和问答三个主要功能。
[*]Java 实现的 Server 端:基于 Spring AI 框架实现 MCP Server,由于底层存储用的是 Tablestore,所以主体框架是基于这篇文章的代码进行改造。
(二)知识库存储

(1)向量数据库Tablestore

知识库存储选择 Tablestore(向量检索功能先容),主要原因为:


[*]简单易用:仅一个创建实例步骤后即可开始使用,Serverless 模式无需管理容量和后续运维。
[*]低成本:完全按量计费,主动根据存储规模程度扩展,最大可扩展至 PB 级。当然如果采用本地知识库肯定是零成本,但这里实现的是一个企业级、可通过云共享的知识库。
[*]功能完备:支持全文、向量和标量等检索功能,支持混淆检索。
(2)MCP Server

实现了 4 个 Tools(具体注册代码可参考 TablestoreMcp),相关描述如下:
Tools功能给 LLM 的描述输入参数输出结果storeKnowledge写入知识库内容,同时进行 Embedding 后写入向量。Store document into knowledge store for later retrieval.{
“content”:“知识库内容”, “meta_data”: { “source”: “文档” }
}{
“content”: [
{ “type”: “text”,
“text”: “null” }
],
“isError”: false
}searchKnowledge对知识库进行向量检索提取内容Search for similar documents on natural language descriptions from knowledge store.{
“query”: “知识库内容”, “size”: 100
}{
“content”: [
{ “type”: “text”,
“text”: “[{“content”:“知识库内容”,“meta_data”:{“source”:“文档”}}]}” } ],
“isError”: false
}storeFAQ写入 FAQ 内容,题目和答案分别写入 Question 和 Answer 两个字段,Question 字段额外进行 Embedding 后写入向量。Store document into FAQ store for later retrieval.{
“question”: “题目”, “answer”: “答案”
}{
“content”: [ {
“type”: “text”,
“text”: “null” } ],
“isError”: false
}searchFAQ通过对 Question 的全文和向量的混淆检索来提取内容。Search for similar documents on natural language descriptions from FAQ store.{
“query”: “题目”, “size”: 100
}{
“content”: [{
“type”: “text”,
“text”: “[{“question”:“题目”,“answer”:“答案”}]” } ],
“isError”: false
} (三)知识库构建

(1)对文本进行切段并提取 FAQ

完全通过提示词来完成,可根据自己的要求进行调优。
提示词输入输出需要将以下文本切段,并根据文本内容整理 FAQ。文本切段的要求:
<1>保证语义的完整性:不要将一个完整的句子切断,不要把表达同一个语义的不同句子分割开
<2>保留充足多的上下文信息:如果切割后的文本段必须依赖上下文信息才能表达正确的语义,那就不能切割开
<3>过滤无效信息:过滤格式化内容如大量填充的空格,过滤不完整的段落以及过滤
<4>移除 markdown 内容的标记,层次关系按 1, 2, 3 以及 1.1, 2.1 来标记
<5>只保留文本内容,移除链接等信息
<6>不要对标题单独切段:仅对正文进行切段,标题可以与正文合并一起,或者是作为上下文信息扩充进正文分段内
<7>切段后的文本如果不是一个完整的句子,请修改为一个完整表述的句子表格存储向量检索在原有的 DiskANN 算法之上进行优化,提供大规模和高性能的向量检索服务。前期,我们也先对用户提供了基于 HNSW 的图算法,但是发现明显的性能题目,HNSW 对内存要求很高,很难支撑大规模数据,当内存不足时,HNSW 访问磁盘的性能较差。表格存储上的用户大多数数量相对较大,HNSW 的规模和成本题目不符合我们产物的定位,我们希望可以让更多的数据可以低成本的使用上向量能力,因此我们后续废弃掉了 HNSW 算法,使用 DiskAnn 重新实现了向量检索能力。{
“Chunks”: [ “表格存储向量检索在原有的 DiskANN 算法之上进行优化,提供大规模和高性能的向量检索服务。前期,我们也先对用户提供了基于 HNSW 的图算法,但是发现明显的性能题目。”, “HNSW 对内存要求很高,很难支撑大规模数据,当内存不足时,HNSW 访问磁盘的性能较差。表格存储上的用户大多数数量相对较大,HNSW 的规模和成本题目不符合我们产物的定位。”, “我们希望可以让更多的数据可以低成本使用上向量能力,因此我们后续废弃掉了 HNSW 算法,使用 DiskAnn 重新实现了向量检索能力。” ] }
{ “FAQ”: [
{“Question”: “表格存储向量检索使用了什么算法?”,
“Answer”: “表格存储向量检索在原有的 DiskANN 算法之上进行了优化,提供大规模和高性能的向量检索服务。” },
{“Question”: “为什么最初选择了 HNSW 图算法?”,
“Answer”: “前期对用户提供了基于 HNSW 的图算法,但发现其存在明显的性能题目。” },
{“Question”: “HNSW 算法的主要缺点是什么?”,
“Answer”: “HNSW 对内存要求很高,难以支撑大规模数据,且在内存不足时访问磁盘的性能较差。”},
{ “Question”: “为什么废弃了 HNSW 算法?”,
“Answer”: “HNSW 的规模和成本题目不符合表格存储产物的定位,无法满足大规模数据低成本使用向量能力的需求。” },
{“Question”: “表格存储最终采用什么算法替代 HNSW?”,
“Answer”: “后续废弃了 HNSW 算法,使用 DiskANN 重新实现了向量检索能力。” } ] } 以上是一个示例,可以看到通过大模型能比较正确的对文本进行切段并提取 FAQ。这种方式的优势是切段的文本能保证完整性以及语义同等性,能够比较灵活的对格式做一些处理。提取的 FAQ 很全面,对于简单题目的问答通过直接搜索 FAQ 是最正确直接的。最大的缺点就是执行比较慢并且成本较高,一次会消耗大量的 Token,不过幸亏是一次性的投入。
(2)写入知识库和 FAQ 库

这一步也是通过提示词来完成,基于 MCP 架构可以非常简单的实现,样比方下:
操作类型提示词模板写入知识库将以下内容存储入 Knowledge 知识库内:%s写入 FAQ将以下内容存储入 FAQ 库内:
Question:%s
Answer:%s (四)知识库检索

同样这一步也是通过提示词加 MCP 来实现,非常的简单,样比方下:
提示词模板检索条件检索结果你是产物答疑助手,在答复题目之前请先检索 Knowledge 库和 FAQ 库:
1. 先明白题目并对题目进行拆解,拆解成多个子题目。
2. 每个子题目同时检索 Knowledge 库和 FAQ 库,每次检索结果不超过 20 条
3. 对检索的内容进行筛选,保留与题目最相关的内容,Knowledge 和 FAQ 分别不超过 10 条。
末了合并检索内容,返回与检索内容最相关的 20 条,直接返回检索的结果,样比方下:
1. 如果是 Knowledge,格式为:Knowledge:<结果一>
2. 如果是 FAQ,格式为:FAQ:<结果二>
检索内容:%sTablestore 底层向量索引算法选择了哪种实现?Knowledge:表格存储向量检索在原有的 DiskANN 算法之上进行优化。
Knowledge:表格存储上的用户大多数数据量相对较大。
FAQ:为什么最初选择了 HNSW 图算法?
FAQ:为了给用户提供一种向量检索的服务选项。
FAQ:表格存储向量检索是基于什么算法实现的?
FAQ:表格存储向量检索是在原有的 DiskANN 算法基础上进行了优化。 通过提示词描述实现了一个稍微复杂点的检索:


[*] 1.先对题目进行拆解,拆解为更原子的子题目。
[*] 2.每个子题目分别检索知识库和 FAQ,检索结果汇总后筛选留下与题目最相关的内容。
[*] 3.按照格式返回结果。
(五)知识库问答

直接看下提示词和效果
提示词模板题目答案你是产物答疑助手,在答复题目之前请先检索 Knowledge 库和 FAQ 库:
1. 先明白题目并对题目进行拆解,拆解成多个子题目,子题目尽量是比较小比较原子的题目。
2. 每个子题目同时检索 Knowledge 库和 FAQ 库,每次检索结果不超过 10 条,末了合并所有子题目的检索结果。
对检索的内容进行筛选,保留与题目最相关的检索结果,使用检索到的内容进行答复,不要乱给答案。
我的题目是:%sTablestore 底层向量索引算法选择了哪种实现?Tablestore 底层向量索引算法选择了 DiskANN 算法实现。
最初,Tablestore 曾尝试使用 HNSW (Hierarchical Navigable Small World) 图算法来提供向量检索服务。
然而,HNSW 对内存要求很高,难以支撑大规模数据。当内存不足时,HNSW 访问磁盘的性能极差。考虑到大多数用户的大量数据需求以及希望让更多的数据能够以较低成本使用上向量能力的愿望,
最终决定不再使用 HNSW 算法,而是基于 DiskANN 算法进行了优化,提供了大规模和高性能的向量检索服务。 从 MCP Server 的 Log 内可以看到主动调用了知识库和 FAQ 的检索工具,并能根据之前导入的内容进行答复。
项目实践一

开源地址:aliyun/alibabacloud-tablestore-mcp-server
(1)创建知识库存储实例

可通过命令行工具(下载地址)来创建 Tablestore 实例,参考这个文档先进行配置。
配置乐成后执行以下命令进行实例创建,实例名自行选择,需要保证 Region 内唯一。
tablestore> create_instance -r cn-hangzhou -d 'Knowledge store for AI Agent.' -n 'my-store' done
(2)启动MCP Server

启动前需要在环境变量内配置如下几个参数:
变量名必填含义默认值TABLESTORE_INSTANCE_NAME是(yes)实例名-TABLESTORE_ENDPOINT是(yes)实例访问地址-TABLESTORE_ACCESS_KEY_ID是(yes)秘钥 ID-TABLESTORE_ACCESS_KEY_SECRET是(yes)秘钥 SECRET- 可参考代码库 README 内的步骤进行启动,也可将项目导入 IDE 后直接运行 App 这个类,启动后会主动初始化表和索引。
(3)导入知识库

这一步需要执行代码库内的 knowledge_manager.py 工具,执行前需要先配置访问大模型的 API-KEY,默认采用 qwen-max。
export LLM_API_KEY=sk-xxxxxx
请自行预备知识库文档,使用 markdown 格式,执行如下:
https://i-blog.csdnimg.cn/direct/0a2e7c90bd684290aa7de0e7b7d8bf07.webp#pic_center
(4)检索知识库

执行如下:
https://i-blog.csdnimg.cn/direct/cefc7a6bec8342a4892d58ba071af3a5.webp#pic_center
(5)基于知识库进行问答

https://i-blog.csdnimg.cn/direct/b98c7fc8b8e4495b8a06a1004c9ee2a9.webp#pic_center
项目实践二:使用CherryStudio实现MCP

(1)效果

这里展示 2 个 tool 的能力,一个是存储工具,一个是搜索工具。 我们使用的软件是热门的开源软件 cherry-studio, 使用的大模型是通义千问的 qwen-max 模型
1.1 写入到Tablestore

cherry-studio 使用示比方下图:
https://i-blog.csdnimg.cn/direct/e9f1fe75a22a43289fe95eef3d2a0140.jpeg#pic_center
python Server 端代码的写入日记如下图:
https://i-blog.csdnimg.cn/direct/c4e0400bc93a4a0dba144dd4b04c5873.jpeg#pic_center
Tablestore(表格存储) 控制台数据存储结果如下图:
https://i-blog.csdnimg.cn/direct/851abd9d71d24324b98809c5539523ed.jpeg#pic_center
1.2 搜索文档

Tablestore(表格存储) 的多元索引支持向量、标量、全文检索等各种类型的组合查询,该示例代码中使用了混淆检索,如需更复杂的查询,可以参考文章末了的“贡献代码和二次开发”章节相识如何自定义开发。
cherry-studio 搜索查询示比方下图:
https://i-blog.csdnimg.cn/direct/7865d9ea338c4f76a457d340ad78cd66.jpeg#pic_center
python Server 端的查询日记如下图:
https://i-blog.csdnimg.cn/direct/7c0936e368254f4c9215541a47532d5c.jpeg#pic_center
Tablestore(表格存储) 控制台数据也可以进行查询,这里以全文检索示例:
https://i-blog.csdnimg.cn/direct/90bfcfd86c8a492b9e915ba09bc7e1b8.jpeg#pic_center
(2)流程

https://i-blog.csdnimg.cn/direct/b8a7880cc22f403a84e2bf880244c55a.jpeg#pic_center
MCP server 提供的 2 个工具十分简单:

[*]写入: 文档颠末 MCP server 内置的 Embedding ( 默以为 BAAI/bge-base-zh-v1.5 ) 模型,写入到Tablestore(表格存储)即可。
[*]查询: 用户的查询文本颠末 MCP server 内置的 Embedding 模型转成向量,然后调用表格存储的 多元索引即可,其内部使用了 向量检索 和 全文检索 进行混淆查询,最终召回用户盼望的结果。
(3)本地运行

3.1 下载源码


[*]使用 git clone 将代码下载到本地。
[*]进入 python 源码的根目次:cd tablestore-mcp-server/tablestore-python-mcp-server
3.2 预备环境

代码需要 python3.10 版本以上进行构建,使用了 uv 进行包和环境管理。
安装 uv:
# 方式1:使用现有 python3 安装 uv
pip3 install uv
# 方式2:源码安装 uv:
curl -LsSf https://astral.sh/uv/install.sh | sh
预备 Python 环境:
   如果本地有 python3.10 版本以上环境,无需执行这一小步。
因为我们项目至少需要 python3.10 版本,这里使用 python3.12 进行示例。
# 查看当前有哪些 python 环境
uv python list
# 如果没有python 3.12.x 相关版本,请安装 python3.12 版本. 内部会从 github 下载 uv 官方维护的 python 包。
uv python install 3.12
创建虚拟环境:
# 使用 python 3.12 版本当做虚拟环境
uv venv --python 3.12
3.3 配置环境变量

代码里所有的配置是通过环境变量来实现的,出完整的变量见下方表格。 主要依赖的数据库 Tablestore(表格存储) 支持按量付费,使用该工具,表和索引都会主动创建,仅需要在控制台上申请一个实例即可。
变量名必填含义默认值SERVER_HOST否MCP server 的 host0.0.0.0SERVER_PORT否MCP server 的 port8001TABLESTORE_INSTANCE_NAME是(yes)实例名-TABLESTORE_ENDPOINT是(yes)实例访问地址-TABLESTORE_ACCESS_KEY_ID是(yes)秘钥 ID-TABLESTORE_ACCESS_KEY_SECRET是(yes)秘钥 SECRET-TABLESTORE_TABLE_NAME否表名ts_mcp_server_py_v1TABLESTORE_INDEX_NAME否索引名ts_mcp_server_py_index_v1TABLESTORE_VECTOR_DIMENSION否向量维度768TABLESTORE_TEXT_FIELD否文本字段名_contentTABLESTORE_VECTOR_FIELD否向量字段名_embeddingEMBEDDING_PROVIDER_TYPE否Embedding 模型提供者hugging_face(当前仅支持 hugging_face)EMBEDDING_MODEL_NAME否Embedding 模型名字BAAI/bge-base-zh-v1.5(维度是768,和 TABLESTORE_VECTOR_DIMENSION 呼应)TOOL_STORE_DESCRIPTION否写入的 MCP tool 的描述文字参考 settings.pyTOOL_SEARCH_DESCRIPTION否查询的 MCP tool 的描述文字参考 settings.py 3.4 Embedding

为了方便,这里不使用云服务的Embedding能力,而使用了内置的本地Embedding模型,示例代码仅支持了 HuggingFace 的本地Embedding模型,使用十分简单,如果网络不好,可以配置 HuggingFace 的镜像。
export HF_ENDPOINT=http://hf-mirror.com
3.5 运行 MCP 服务

# 加速下载 Hugging 的 Embedding Modelexport HF_ENDPOINT=http://hf-mirror.com
export TABLESTORE_ACCESS_KEY_ID=xxexport TABLESTORE_ACCESS_KEY_SECRET=xxexport TABLESTORE_ENDPOINT=xxxexport TABLESTORE_INSTANCE_NAME=xxx# 默认以 sse 模式运行,如果希望以 stdio 模式运行可以添加: `--transport stdio`uv run tablestore-mcp-server (4)集成三方工具

4.1 Cherry Studio

Cherry-Studio,是一个热门的开源的 AI Client 软件, 免费使用,其支持 MCP 服务。
安装 :Github链接 下载最新版本的适合自己机器运行环境的安装包. 比如我的电脑是m1芯片的mac,因此下载 Cherry-Studio-1.1.4-arm64.dmg 进行安装。安装好后,需要配置大模型的 api-key 相关信息,这里不再一一描述。
按照如下所示创建MCP服务:
https://i-blog.csdnimg.cn/direct/12aa367b38ad4a519e08829d265f0620.jpeg#pic_center
在谈天里使用MCP服务(可以把一些模版填充到 Cherry Studio 的模版里,生成一个自己的特别助手,后续可以直接使用):
https://i-blog.csdnimg.cn/direct/2b4a2fe977804027be64679a87672bed.jpeg#pic_center
(5)拓展应用场景

MCP 的 Tool 的能力和场景是 Tool 的描述来提供的,因此我们可以定义一些特别的能力,可以发挥你的想象力。别的,当前我们没有接入一些复杂的多字段自由 Filter 能力、稀疏向量(Sparse Vector)能力,后续有时间会继续进行集成。
仅需要修改如下配置即可, 如何写可以参考 settings.py
export TOOL_STORE_DESCRIPTION="你的自定义的描述"
export TOOL_SEARCH_DESCRIPTION="你的自定义的描述"
修改后从 MCP Client 中可以看到工具 (Tool) 的描述已经变成了自定义的描述,那么大模型(LLM)就会根据你的描述去使用工具(Tool)。
https://i-blog.csdnimg.cn/direct/e4b943845b1e4de899ca1c638e7adfc0.jpeg#pic_center

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 【项目】基于MCP+Tabelstore架构实现知识库答疑系统