基于Dify、Ollama、Xinference构建知识库问答机器人
参考文档:
功能简介 - Dify Docs
1.环境准备
需安装Ollama、Dify、Xinference。
Ollama、Dify参考:
通过ollama 安装部署deepseek,并集成到dify中。-CSDN博客
Xinference通过docker安装(安装Xinference是因为,我部署的Ollama 没有支持Rerank模型,不知道未来是否会支持):
参考:
(5 封私信 / 80 条消息) Xinference+Dify本地部署全攻略:知识库搭建与模型配置详解(附一键安装包) - 知乎
(1)编辑docker compose文件(注意修改映射路径):
version: '3.8'
services:
xinference:
image: xprobe/xinference:latest
container_name: xinference
volumes:
- type: bind
source: **D:\development\xinference**
target: /xinference
environment:
- XINFERENCE_HOME=/xinference
ports:
- "9997:9997"
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: all
capabilities: [gpu]
command: xinference-local -H 0.0.0.0 --log-level debug
restart: unless-stopped
(2)启动容器:docker compose up -d
2.整体架构

整体构建可划分为两步:知识库构建和模型检索。
知识库构建需要对文档进行预处理,处理完之后上传到知识库。知识库可通过Embeding模型对文档进行索引。索引完之后文档中的内容便会进入到知识库中。
LLM模型通过理解用户的问题,去知识库检索对应的内容。检索出来的内容会通过rerank之后,匹配出于用户问题相关性分数最高的知识进行返回。LLM根据返回的知识进行分析并向用户输出文本回答。
3.模型选择
LLM:DeepSeek-R1-Distill-Qwen-7B-GGUF
Embeding:nomic-embed-text
Rerank:bge-reranker-large
注:可以去www.modelscope.cn查询自己需要的模型。我的电脑配置不高所以选择了上面的模型。
4.知识库构建
4.1.过程

这里采用导入已有文本。

采用父子分段。

选择混合检索和高质量索引。
4.2.为什么要分段?
大模型上下文窗口有限,,无法一次性传输整个知识库的内容。所以需要将整个文档划分为多个内容块,该过程就是分段。
4.3.分段模式
dify的分段模式有两种:通用模式和父子模式。
4.3.1.通用模式

根据用户的规则将内容拆分为独立的分段。主要设置的参数有:
分段标识符:根据该配置值对内容进行分段。
分段最大长度:对超过该长度的段进行拆分
分段重叠长度:段与段之间可能会存在重叠的部分,保留该部分能够提高召回效果。dify建议设置为分段最大长度的10%-25%
根本预处理规则如文字所表达。
勾选使用Q&A分段,可提高信息检索的精准度,但是会消耗额外的token。其效果是会通过上下文将文档的内容作为问答QA的形式进行分段。那么在检索时,则会通过Q to Q进行检索。
例,使用Q&A之后,知识库中的内容如:
4.3.2.父子模式
该模式采用双层分段结构来平衡检索的精确度和上下文信息。
父区块保持较大的文本单位,比如段落,提供上下文信息。
子区块是较小的文本单位,比如句子,用于精确检索。
使用该种分段模式时,先通过子区块进行精确检索。然后通过父区块获取上下文信息,为子区块提供完整的背景信息。两者联同发给LLM。
例,采用父子分段后,知识库内容为:
4.3.3.人工文本预处理
按照上面的分段模式,可以看出需要对文档进行预处理。本文还没有考虑自动化处理,预处理这一步还是选择人工处理的。
4.4.索引方法
4.4.1.高质量索引
该模式会通过Embedding嵌入模型将已经分段的文本转换为数字向量,帮助更加有效地压缩于存储大量文本信息;使得用户问题与文本之间的匹配能够更加精准。
4.4.2.经济索引
每个区块内使用10个关键字进行检索,精准度降低,但是不会消耗token。
4.5.检索方法
4.5.1.高质量索引
高质量索引存在三个检索方法:向量检索、全文检索、混合检索
Rerank模型
rerank模型会将向量检索出的内容分段再一次重排序,优化排序结果。能够帮助LLM获取更加精确的内容,提高输出质量。
为什么要重排序?
向量查询的结果可能很多,比如100-200条。结果的相关性可能参差不齐。Rerank模型会基于更精细的语义理解,对结果进行重新打分和排序,将最相关的内容排在前面。
设置值:
TopK:用于筛选与用户问题相似度最高的文本片段。系统同时会根据选用模型上下文窗口大小动态调整片段数量。默认值为3,数值越高,预期被召回的文本分段数量越多。(召回是指从大规模文本数据中快速筛选出与用户查询相关的候选文本集合)。该值决定了Rerank模型返回的最相关结果数量。所以TopK越小,速度越快,但是越容易遗失相关信息。TopK越大,精度不一定随之上升,LLM效率也会下降。因为处理的内容更多,有可能产生冗余或者错误。
Score阈值:用于设置文本片段筛选的相似度阈值,只召回超过设置分数的文本片段。数值越高,说明对文本与问题的要求的相似度越高,预期被召回的文本数量也越少。
向量检索

向量化用户数据的问题,并生成查询文本的数学向量,比较查询向量与知识库内对应的文本向量间的距离,寻找相邻的分段内容。
全文检索

关键词检索,通过明文关键词匹配知识库内对应的文本片段。
混合检索

同时执行向量检索和全文检索。
可通过权重设置设置语义值(向量值检索)和关键词(全文检索)的占比权重。
4.5.2.经济索引
通过倒排索引进行查询。
4.6.元数据
元数据是描述其他数据的信息。可看作标签。
可在ai助手编排时进行设置。其可用于帮助检索。相当于是给知识库文档打上标签。检索时可根据用户查询的条件内容匹配相对应的标签。
4.7.召回测试

可以在知识库中对文档进行召回测试。查看问题检索召回的段落是否符合要求。
5.创建聊天助手


5.1.提示词
是对AI的回复做出一系列的指令和约束。详细的提示词能够帮助LLM模型按照预定逻辑,更精确地理解用户的目的。
5.2.知识库
可对助手设置对应的指定的知识库
5.3.选择LLM模型

可选择对应的模型。
6.集成模型

在用户设置-》模型供应商可对模型进行配置。注意需要安装对应的插件,如Ollama、Xorblts Inference。
更多推荐



所有评论(0)