AI Agent白手起家49: 从零构建 ChatDoc 文档对话助手

发布时间:2026/8/9 21:56:26

AI Agent白手起家49: 从零构建 ChatDoc 文档对话助手
纲要项目概述ChatDoc 文档检索对话助手核心功能加载 PDF、Word 和 Excel 文档文档切片与国产嵌入模型向量化Chroma 向量存储与智能检索多种检索调优策略查询重写、上下文压缩、MMR、相似性打分封装为流式对话链实现步骤统一文件加载器根据后缀自动选择文本预处理与切片向量化与存储BGE‑M3 Chroma基础检索与高级优化构建对话链并支持流式输出完整可运行代码整合加载、切片、嵌入、检索与对话的本地示例引言掌握了 RAG 的各个独立组件——文档加载、切片、嵌入、向量数据库和检索器——之后下一步就是将它们串联成一个完整的应用。本文将以“ChatDoc”项目为例手把手带你构建一个支持 PDF、Word、Excel 三种格式的文档对话助手。你将看到如何用国产嵌入模型 BGE‑M3 和 Chroma 向量库搭建底层设施并通过查询重写、上下文压缩等调优手段大幅提升回答质量最后封装为带流式输出的对话链。项目架构ChatDoc 的整体流程遵循经典 RAG 流水线并在检索环节加入了多种优化策略。.pdf.docx.xlsx上传文档文件类型判断PyPDFLoaderDocx2txtLoaderOpenpyxlLoader文档切片BGE-M3 向量化Chroma 向量库基础检索器检索调优对话链 流式输出实现步骤环境准备安装所需依赖pipinstalllangchain langchain-core langchain-community chromadb pypdf openpyxl docx2txt文件加载器统一入口首先实现一个get_file_loader函数根据文件后缀自动选择对应的加载器将 PDF、Word、Excel 统一转换为 LangChain 的Document对象。fromlangchain_community.document_loadersimportPyPDFLoaderfromlangchain_community.document_loadersimportDocx2txtLoaderfromlangchain_community.document_loadersimportUnstructuredExcelLoaderdefget_file_loader(file_path:str):iffile_path.endswith(.pdf):returnPyPDFLoader(file_path)eliffile_path.endswith(.docx):returnDocx2txtLoader(file_path)eliffile_path.endswith(.xlsx):returnUnstructuredExcelLoader(file_path)else:raiseValueError(f不支持的文件格式:{file_path})文档切片与向量化使用RecursiveCharacterTextSplitter按段落切分文档再通过 BGE‑M3 嵌入模型向量化后存入 Chroma。fromlangchain_text_splittersimportRecursiveCharacterTextSplitterfromlangchain_community.embeddingsimportHuggingFaceBgeEmbeddingsfromlangchain_community.vectorstoresimportChroma# 切片器splitterRecursiveCharacterTextSplitter(chunk_size500,chunk_overlap50)# 国产嵌入模型 BGE-M3需联网下载也可使用 FakeEmbeddings 替代测试embedding_modelHuggingFaceBgeEmbeddings(model_nameBAAI/bge-m3)defbuild_vectorstore(docs):split_docssplitter.split_documents(docs)vectorstoreChroma.from_documents(split_docs,embedding_model,collection_namechatdoc)returnvectorstore基础检索与多重查询优化使用MultiQueryRetriever对用户问题进行改写生成多个精准子问题后再检索从而提高召回率。fromlangchain_community.chat_modelsimportChatOpenAIfromlangchain.retrievers.multi_queryimportMultiQueryRetriever llmChatOpenAI(modelgpt-3.5-turbo)# 可替换为 DeepSeek 等国产模型base_retrievervectorstore.as_retriever(search_kwargs{k:3})multi_retrieverMultiQueryRetriever.from_llm(retrieverbase_retriever,llmllm)resultsmulti_retriever.invoke(公司名称是什么)上下文压缩使用LLMChainExtractor对检索结果进行二次压缩仅保留与问题最相关的核心内容。fromlangchain.retrieversimportContextualCompressionRetrieverfromlangchain.retrievers.document_compressorsimportLLMChainExtractor compressorLLMChainExtractor.from_llm(llm)compression_retrieverContextualCompressionRetriever(base_compressorcompressor,base_retrieverbase_retriever)compressed_resultscompression_retriever.invoke(公司名称是什么)相似性分数过滤与 MMR通过similarity_search_with_score设定阈值如 0.5过滤低分文档。MMR 则可直接通过as_retriever的search_type参数启用。# 相似性分数过滤results_with_scorevectorstore.similarity_search_with_score(公司名称,k5)relevant_docs[docfordoc,scoreinresults_with_scoreifscore0.5]# MMR 搜索mmr_retrievervectorstore.as_retriever(search_typemmr,search_kwargs{k:3,lambda_mult:0.5})mmr_resultsmmr_retriever.invoke(公司名称)封装为对话链最后将检索、压缩与 LLM 组合成一条支持流式输出的对话链。fromlangchain_core.promptsimportChatPromptTemplatefromlangchain_core.runnablesimportRunnablePassthroughfromlangchain_core.output_parsersimportStrOutputParser promptChatPromptTemplate.from_messages([(system,你是一个处理文档的秘书根据提供的上下文用中文回答问题。),(human,上下文{context}\n\n问题{question})])chain({context:compression_retriever,question:RunnablePassthrough()}|prompt|llm|StrOutputParser())forchunkinchain.stream(公司注册地址是哪儿):print(chunk,end)完整可运行代码使用模拟嵌入以下脚本整合了上述核心步骤使用FakeEmbeddings和FakeListChatModel替代真实的模型无需下载模型或 API Key 即可运行。请将sample.docx替换为实际文件路径或直接使用代码中的模拟文档。fromlangchain_community.document_loadersimportDocx2txtLoaderfromlangchain_text_splittersimportRecursiveCharacterTextSplitterfromlangchain_community.embeddings.fakeimportFakeEmbeddingsfromlangchain_community.vectorstoresimportChromafromlangchain_core.promptsimportChatPromptTemplatefromlangchain_core.output_parsersimportStrOutputParserfromlangchain_community.chat_models.fakeimportFakeListChatModelfromlangchain_core.documentsimportDocument# 1. 模拟一个文档如果实际文件存在则使用 Docx2txtLoader 加载# 为方便演示直接构造一个 Document 对象sample_text 公司名称宏图科技发展公司 注册地址江苏省南京市玄武区长江路100号 主营业务人工智能软件开发、大数据分析 docDocument(page_contentsample_text,metadata{source:公司信息})# 2. 切片splitterRecursiveCharacterTextSplitter(chunk_size100,chunk_overlap20)split_docssplitter.split_documents([doc])# 3. 向量化模拟嵌入embeddingsFakeEmbeddings(size128)vectorstoreChroma.from_documents(split_docs,embeddings,collection_namechatdoc)# 4. 基础检索器base_retrievervectorstore.as_retriever(search_kwargs{k:2})# 5. 模拟大模型预设回答fake_llmFakeListChatModel(responses[根据文档内容公司名称为宏图科技发展公司注册地址在江苏省南京市玄武区长江路100号。])# 6. 对话链promptChatPromptTemplate.from_messages([(system,你是一个文档助手根据提供的上下文回答问题。),(human,上下文{context}\n\n问题{question})])chain({context:base_retriever,question:lambdax:x}|prompt|fake_llm|StrOutputParser())# 7. 测试question公司注册地址是哪儿print(用户问题,question)print(助手回答,chain.invoke(question))运行该脚本你将看到助手根据检索到的文档片段给出了正确的注册地址。此模板可以轻松扩展到真实文档、真实嵌入模型和大语言模型并加入多重查询、上下文压缩等优化策略构建强大的文档对话应用。总结ChatDoc 项目完整展示了从文档加载、切片、向量化到检索调优和对话封装的全流程。通过组合MultiQueryRetriever、LLMChainExtractor以及相似性分数/MMR 过滤你可以灵活地提升回答质量。这个骨架稍加扩展就能演变为你自己的知识库问答系统。

相关新闻

OpenSpliceAI-mane.10000常见问题解答:解决RNA剪接预测中的10大难题

OpenSpliceAI-mane.10000常见问题解答:解决RNA剪接预测中的10大难题

2026/8/9 21:56:26

OpenSpliceAI-mane.10000常见问题解答:解决RNA剪接预测中的10大难题 【免费下载链接】openspliceai-mane.10000 项目地址: https://ai.gitcode.com/hf_mirrors/multimolecule/openspliceai-mane.10000 OpenSpliceAI-mane.10000是基于原生PyTorch实现的RNA剪…

AI 应用基础设施构建与可观测性体系:开源方案选型、版本差异与替代关系

AI 应用基础设施构建与可观测性体系:开源方案选型、版本差异与替代关系

2026/8/9 21:56:26

AI 应用基础设施构建与可观测性体系:开源方案选型、版本差异与替代关系 AI 基础设施的关键不是先堆组件,而是先确认请求入口、依赖调用和运行信号采集这条链路由谁维护、何时算完成。题目中的“开源方案选型、版本差异与替代关系”只在这条边界内展开。 …

如何用霞鹜文楷字体提升你的数字阅读和编程体验

如何用霞鹜文楷字体提升你的数字阅读和编程体验

2026/8/9 21:46:26

如何用霞鹜文楷字体提升你的数字阅读和编程体验 【免费下载链接】LxgwWenKai An unprofessional open-source Chinese font derived from Fontworks Klee One. 一款非专业的开源中文字体,基于 FONTWORKS 出品字体 Klee One 衍生。 项目地址: https://gitcode.com…

AI根因分析大变局:别再卷模型,真正瓶颈是上下文工程

AI根因分析大变局:别再卷模型,真正瓶颈是上下文工程

2026/8/10 0:26:34

文章目录1. 别再卷模型了,根因分析的瓶颈早就换地方了1.1 以前大家的执念:模型越强,排障越猛1.2 现在业内共识:喂什么数据,比用什么模型重要2. 两种主流玩法,现在风向明显变了2.1 第一种:代理式…

大模型应用后端底座设计与高并发支撑:并发时先看资源边界

大模型应用后端底座设计与高并发支撑:并发时先看资源边界

2026/8/10 0:26:34

大模型应用后端底座设计与高并发支撑:并发时先看资源边界 当大模型(LLM)应用的用户规模从几十个内部测试人员暴增到上万并发请求时,后端架构师面临的挑战与传统 Web 系统完全不同。 传统 Web 微服务处理一个 HTTP 请求耗时通常在 …

Claude Code重大更新:多会话可互相通信,告别手动复制上下文

Claude Code重大更新:多会话可互相通信,告别手动复制上下文

2026/8/10 0:26:34

文章目录Claude Code重磅更新:AI会话可以互相发消息,告别人工复制传上下文1. 以前多会话开发,纯纯当人工传声筒2. 现在AI自己会跨窗口传小纸条了2.1 动口就行,传话不用你动手2.2 卡壳了还能互相搭把手3. 这功能到底是怎么跑起来的…

AI 云原生后端架构与智能服务网格治理:上下文与工具如何分工

AI 云原生后端架构与智能服务网格治理:上下文与工具如何分工

2026/8/10 0:26:34

AI 云原生后端架构与智能服务网格治理:上下文与工具如何分工 大模型接入云原生微服务体系后,很多团队习惯直接把模型 API 当作普通 HTTP 接口挂在 Envoy 或 Istio 后面。跑了两个月发现 Sidecar 经常频繁触发 OOM Killer,或者 Tool Call 调用…

美团性能优化专项面经:APM实践、列表滑动优化、图片加载优化、编译加速

美团性能优化专项面经:APM实践、列表滑动优化、图片加载优化、编译加速

2026/8/10 0:26:34

上篇聊完Kotlin协程和编译器插件,这篇进入性能优化专项。美团对性能优化重视程度很高——外卖、到店、酒旅每条业务线都有严格性能指标。面试考的不光你会用什么工具,而是能不能从系统层面分析瓶颈并给出方案。 高级岗要求能独立搭建APM体系并推动优化落地。 今天8道题覆盖…

Spring Boot 与源码级原理拆解:接口演进怎样减少返工

Spring Boot 与源码级原理拆解:接口演进怎样减少返工

2026/8/10 0:16:33

Spring Boot 与源码级原理拆解:接口演进怎样减少返工 范围说明: 本文是接口设计演练;异常语义、字段兼容和校验策略须以实际调用方验证。 业务背景与接口重构痛点 在企业级 Spring Boot 应用的开发与演进过程中,API 接口往往是业…

比较好的亚太EMBA,问了6位校友师资差别真的挺大

比较好的亚太EMBA,问了6位校友师资差别真的挺大

2026/8/9 0:05:25

比较好的亚太EMBA核心差异先看什么?对于希望兼顾工作与系统管理能力提升的亚太区高管而言,筛选匹配度高的EMBA项目时,师资配置是决定学习体验与实际收获的核心要素之一。我们结合3-4个公开信息透明、办学历史较长的亚太区主流EMBA项目特点&am…

备考3个月对比6份资料 海外游学的亚洲EMBA面试注意点

备考3个月对比6份资料 海外游学的亚洲EMBA面试注意点

2026/8/9 0:05:25

备考海外游学的亚洲EMBA面试,核心要围绕项目国际化设计逻辑、个人跨文化管理经验匹配度两个维度准备,避免把游学模块等同于普通旅游参访的认知偏差。不少备考者花3个月对比6份资料,却容易忽略面试官对“国际视野落地能力”的考察——比如香港…

比较好的国内EMBA,问了二十位校友聊透人脉价值

比较好的国内EMBA,问了二十位校友聊透人脉价值

2026/8/9 0:05:25

比较好的国内EMBA核心差异体现在哪些方面?比较好的国内EMBA的核心长期价值,很大程度上依托于校友网络的连接质量与资源生态的活跃度,这也是不少高管在择校时优先考量的因素。我们结合3-4个市场关注度较高的项目公开信息,从课程、师…

Prometheus 监控体系深度部署:选型别只看功能清单

Prometheus 监控体系深度部署:选型别只看功能清单

2026/8/10 0:06:33

Prometheus 监控体系深度部署:选型别只看功能清单 选型场景:小规模集群直接部署 Thanos 的代价 如果为解决 15 天本地存储限制,直接部署 Thanos Sidecar、Store Gateway、Querier、Compactor、Ruler、Bucket Web 并接入 S3,就需…

ELK 日志分析平台与全链路追踪:代码评审该盯住哪些细节

ELK 日志分析平台与全链路追踪:代码评审该盯住哪些细节

2026/8/10 0:06:33

ELK 日志分析平台与全链路追踪:代码评审该盯住哪些细节 场景示例:一条 2MB 日志影响 Elasticsearch 写入 一个上传接口若执行 log.Info("Request dumped: ", r.Body),会将 2MB 的二进制 Body 写入日志。高并发下,这类超…

从零到一构建开源项目的完整历程:代码评审该盯住哪些细节

从零到一构建开源项目的完整历程:代码评审该盯住哪些细节

2026/8/10 0:06:33

从零到一构建开源项目的完整历程:代码评审该盯住哪些细节 项目进入稳定版本后,外部 Pull Request(PR)会带来新的协作成本。大范围改动混入风格重构,或修复局部问题时修改公共函数签名,都可能扩大评审和兼容…

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

2026/8/8 5:07:31

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…

导师推荐!2026最新AI论文工具测评与实用推荐

导师推荐!2026最新AI论文工具测评与实用推荐

2026/8/9 13:42:46

2026年真正好用的AI论文工具,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

告别游戏崩溃:XCOM 2模组管理器的智能革命

告别游戏崩溃:XCOM 2模组管理器的智能革命

2026/8/8 2:30:15

告别游戏崩溃:XCOM 2模组管理器的智能革命 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_mirrors/xc/xcom2-lau…