掘金 人工智能 07月24日 15:25
Langchain-Chatchat 知识库问答流程深度剖析
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文深入剖析了知识增强问答系统(RAG)的核心工作原理,解释了其如何通过“文档检索+模型生成”的模式解决传统大模型回答专业问题时存在的“幻觉”问题。文章详细阐述了从文档上传、文本预处理(分段、清洗)、向量化(Embedding)到向量索引构建(如FAISS)的完整流程。同时,也介绍了用户提问后,系统如何进行向量检索、构造提示词,并最终调用语言模型(LLM)生成准确回答的整个技术链条。文中还提供了Langchain-Chatchat的本地安装部署指南,并详细介绍了各阶段的实现细节和模块协作结构,为构建可控、可追溯、可自定义的大模型问答系统提供了清晰的指导。

💡 **RAG解决大模型“幻觉”问题**:知识增强问答(RAG)系统通过结合“文档检索”和“模型生成”来提升回答的准确性,弥补了传统大模型仅依赖训练语料而可能出现的编造(hallucination)现象,使其能基于实时或特定知识源进行回答。

⚙️ **RAG核心流程与技术实现**:RAG的基本流程包括用户问题->文档检索->提示词构建->语言模型输入->模型输出。具体实现上,涉及文档上传解析、文本切分(如使用ChineseRecursiveTextSplitter,关注chunk_size和chunk_overlap)、文本向量化(使用如bge-large-zh-v1.5等中文Embedding模型)以及向量索引构建(如FAISS),这些环节共同支撑起知识库的建立。

🚀 **Langchain-Chatchat部署与配置**:文章提供了Langchain-Chatchat的本地安装部署步骤,包括pip安装、模型推理框架(如Xinference)的接入、项目配置文件的修改(model_settings.yaml, kb_settings.yaml等)以及知识库的初始化和项目的启动,为用户搭建RAG系统提供了实践指导。

🧱 **系统模块协作与优势挑战**:文章展示了前端UI、FastAPI接口、向量库查询、文档拼接、大模型推理及结果生成之间的协作结构图。RAG系统的优势在于提升回答准确性、定向专业内容回答和架构的可扩展性,但也面临文本切分粒度调优、向量库查询性能、模型对上下文利用能力以及多文档融合效果等挑战。

📚 **关键技术解析与实践**:通过对文档上传API(server\knowledge_base\kb_doc_api.py)、文本切分(server\file_rag\text_splitter)、向量化(get_Embeddings, LocalAIEmbeddings)和向量存储(FAISS)等关键模块的源码和参数进行详细介绍,文章深入解析了RAG系统的实现细节,帮助用户理解和掌握构建自定义大模型问答系统的关键技术。

从文档上传到模型应答,一步步解构知识增强问答系统的底层逻辑。

一、什么是知识库问答(RAG)?

传统大模型在回答专业问题时,常会编造(hallucination) ,因为它的“知识”来自训练语料,而非实时信息。为此,Langchain-Chatchat 构建了知识增强问答系统(RAG) ,通过“文档检索 + 模型生成”组合提升回答的准确性。

RAG 的基本流程是:

graph LR用户问题 --> 检索相关文档 --> 搭建提示词 --> 输入语言模型 --> 输出更准确回答

二、知识库问答的整体流程图(逻辑视角)

graph TD文档上传 --> B[文本预处理: 分段/清洗] --> C[向量化: Embedding] --> D[向量索引构建: FAISS等] --> E[知识库建立完成];E --- 用户提出问题 --> F[查询向量检索: Retriever] --> G[构造提示词: Prompt] --> H[模型回答: LLM] --> 最终输出回答;

本地安装部署 Langchain-Chatchat

    安装 Langchain-Chatchat
pip install langchain-chatchat -U

模型部署框架 Xinference 接入 Langchain-Chatchat 需要额外安装对应的 Python 依赖库,因此如需搭配 Xinference 框架使用时如下安装方式:

pip install "langchain-chatchat[xinference]" -U
    模型推理框架并加载模型

启动 Langchain-Chatchat 项目前,首先进行模型推理框架的运行,并加载所需使用的模型。本文中 Embedding 模型使用 bge-large-zh-v1.5 通过 Xinference 本地运行,LLM 使用 deepseek-chat 在线API。

    初始化项目配置与数据目录

      设置 Chatchat 存储配置文件和数据文件的根目录(可选): export CHATCHAT_ROOT=xxx执行初始化:chatchat init修改配置文件
        配置模型(model_settings.yaml)配置知识库路径(basic_settings.yaml)(可选)配置知识库(kb_settings.yaml)(可选)

    初始化知识库

进行知识库初始化前,请确保已经启动模型推理框架及对应 embedding 模型,且已按照上述步骤3完成模型接入配置。

chatchat kb -r

    启动项目
chatchat start -a

三、每个阶段的实现细节

1. 文档上传与解析

文档上传

def upload_docs(        files: List[UploadFile] = File(..., description="上传文件,支持多文件"),        knowledge_base_name: str = Form(            ..., description="知识库名称", examples=["samples"]        ),        override: bool = Form(False, description="覆盖已有文件"),        to_vector_store: bool = Form(True, description="上传文件后是否进行向量化"),        chunk_size: int = Form(Settings.kb_settings.CHUNK_SIZE, description="知识库中单段文本最大长度"),        chunk_overlap: int = Form(Settings.kb_settings.OVERLAP_SIZE, description="知识库中相邻文本重合长度"),        zh_title_enhance: bool = Form(Settings.kb_settings.ZH_TITLE_ENHANCE, description="是否开启中文标题加强"),        docs: str = Form("", description="自定义的docs,需要转为json字符串"),        not_refresh_vs_cache: bool = Form(False, description="暂不保存向量库(用于FAISS)"),) -> BaseResponse:    """    API接口:上传文件,并/或向量化    """

文档解析成文本

class KnowledgeFile:    def __init__(        self,        filename: str,        knowledge_base_name: str,        loader_kwargs: Dict = {},    ):        """        对应知识库目录中的文件,必须是磁盘上存在的才能进行向量化等操作。        """        ...        self.document_loader_name = get_LoaderClass(self.ext)        ...    def file2docs(self, refresh: bool = False):        if self.docs is None or refresh:            ...            loader = get_loader(                loader_name=self.document_loader_name,                file_path=self.filepath,                loader_kwargs=self.loader_kwargs,            )            ...

2. 文本切分与清洗

class KnowledgeFile:    ...    def docs2texts(            self,            docs: List[Document] = None,            zh_title_enhance: bool = Settings.kb_settings.ZH_TITLE_ENHANCE,            refresh: bool = False,            chunk_size: int = Settings.kb_settings.CHUNK_SIZE,            chunk_overlap: int = Settings.kb_settings.OVERLAP_SIZE,            text_splitter: TextSplitter = None,    ):        docs = docs or self.file2docs(refresh=refresh)        if not docs:            return []        if self.ext not in [".csv"]:            if text_splitter is None:                text_splitter = make_text_splitter(                    splitter_name=self.text_splitter_name,                    chunk_size=chunk_size,                    chunk_overlap=chunk_overlap,                )

3. 文本向量化(Embedding)

4. 向量索引构建(Vector Store)

5. 用户提问 → 检索相关片段

6. Prompt 构造:拼接文档 + 问题

7. 模型调用(LLM)

8. 输出回答

四、项目中各模块之间的协作结构图

graph TDA[前端UI] -- 提问 --> B[FastAPI 接口];B --- B1[向量库查询];B --- B2[文档拼接];B --> C[大模型推理];C1[模型适配器 OpenAI/GLM/Qwen] --- C;C --> D[结果生成 + 回传 UI];

五、知识库问答的优势与挑战

优势挑战
🔍 提升回答准确性📐 文本切分粒度需调优
💾 实时更新知识⚡ 向量库查询性能
🎯 定向回答专业内容🤖 模型对上下文利用能力有限
🧱 架构清晰,可扩展🔗 多文档融合效果需评估

✅ 总结

知识库问答(RAG)是 Langchain-Chatchat 最核心的能力之一,它以模块化设计方式将文档解析、向量化、检索与提示词拼接串联起来,实现了一个“接入你自己知识”的智能问答系统。理解它的每一环节,可以帮助你掌握如何构建可控、可追溯、可自定义的大模型问答系统。

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

知识增强问答 RAG Langchain-Chatchat 大模型 向量数据库
相关文章