Skip to main content
本教程将展示如何构建一个智能文档助手,它能够:
  • 自动解析新上传的文档并更新知识库
  • 根据用户问题智能检索相关文档内容
  • 自动决定何时需要解析新文档,何时直接检索回答

什么是智能文档助手?

想象这样一个场景:你的团队每天都会上传新的合同、FAQ、产品手册等文档到云存储。你希望有一个 AI 助手能够:
  1. 自动处理新文档:当有新文档上传时,自动解析并存入知识库
  2. 智能回答问题:当用户提问时,自动从知识库中找到相关内容并回答
  3. 自动判断:如果知识库中没有相关信息,自动触发文档解析;如果有,直接检索回答
这就是我们要构建的智能文档助手。

工作原理

整个系统的工作流程如下:

环境准备

首先安装必要的依赖:
创建 .env 文件存储配置:
提示:TEXTIN_APP_IDTEXTIN_SECRET_CODE 参考 API Key,请登录 Textin 工作台 获取。示例中使用 通义千问 的大模型能力,其他模型用法类似。

完整代码示例

代码说明

Step 1: xParse SDK 客户端初始化

XParseClient 用于初始化 xParse 客户端,它会从环境变量中读取 TEXTIN_APP_IDTEXTIN_SECRET_CODE 进行认证。调用 client.parse.run() 即可将文档解析为 Markdown,然后使用 LangChain 的 MarkdownHeaderTextSplitter 按标题层级分块,再用 RecursiveCharacterTextSplitter 控制块的大小,最后通过 DashScopeEmbeddings 向量化后存入 Milvus。 重要XParseClient 只需要初始化一次,可以在全局复用。

Step 2: 向量数据库

向量数据库用于存储文档的向量表示,支持语义搜索。关键点:检索时必须使用与构建知识库时相同的 embedding 模型,否则语义空间不一致,检索效果会变差。

Step 3: LangChain Tools

Tools 是 Agent 可以调用的函数。我们定义了两个工具:
  1. run_xparse_client:处理文档的工具
    • 如果输入是文件路径,处理单个文件
    • 如果输入是更新指令,处理整个目录
  2. vector_search:检索知识库的工具
    • 根据用户问题在向量库中搜索相关内容
    • 返回格式化的结果,包含文档来源

Step 4: Agent 初始化

Agent 是”大脑”,它会:
  • 理解用户的问题
  • 决定调用哪个工具
  • 根据工具返回结果组织最终回答

Step 5: 使用

Agent 会自动判断:
  • 用户提问 → 先检索知识库
  • 知识库没有答案 → 调用解析工具更新知识库,再检索
  • 用户要求更新 → 直接调用解析工具

实际应用场景

场景 1: 客服助手

需求:客服团队经常收到产品相关问题,需要快速从 FAQ 和产品手册中找到答案。 实现
  • 将 FAQ 和产品手册放在 ./documents/faqs/ 目录
  • 用户提问时,Agent 自动检索并回答
  • 有新版本文档时,Agent 自动更新知识库

场景 2: 合同管理

需求:法务团队需要快速查找合同中的特定条款。 实现
  • 将合同文档放在 ./documents/contracts/ 目录
  • xParse 解析后按 Markdown 标题分块,保持章节完整性
  • 用户提问”违约条款”,Agent 自动检索相关章节

场景 3: 知识库维护

需求:定期更新知识库,确保信息是最新的。 实现
  • 设置定时任务,定期调用 build_knowledge_base()
  • 或者通过 Agent 接口,用户说”更新文档库”,Agent 自动处理

进阶优化

1. 添加对话历史

让 Agent 记住之前的对话:

2. 添加限流保护

避免频繁调用文档解析:

3. 添加引用来源

在回答中标注信息来源:

常见问题

Q: 长文档解析时间长,会影响用户体验吗? A: 是的,如果文档很大,解析可能需要一些时间。建议:
  • 对于大文档,使用异步处理,先返回”任务已提交”
  • 或者限制单次处理的文件数量
Q: 如何让 Agent 只检索,不自动触发解析? A: 修改 Tool 的 description,明确说明使用场景,或者添加一个开关参数。 Q: 向量数据库中的数据会过期吗? A: 不会自动过期。如果需要更新,需要重新调用 build_knowledge_base() 构建知识库,新数据会追加到向量库中。 Q: 可以使用其他 LLM 吗? A: 可以。LangChain 支持多种 LLM,只需替换 ChatTongyi(通义千问) 为对应的类,如 ChatOpenAI(OpenAI)、ChatZhipuAI(智谱AI)等。 Q: 如何实现增量处理? A: 可以通过 process_single_file() 逐个处理新增文档,也可以自行维护已处理文件列表来实现增量逻辑。

总结

通过本教程,你已经学会了如何构建一个智能文档助手。核心思路是:
  1. xParse SDK 负责解析:调用 client.parse.run() 将文档解析为 Markdown,再通过 LangChain 进行分块、向量化并存入数据库
  2. Agent 负责决策:根据用户问题,决定调用哪个工具
  3. Tools 负责执行:具体的文档处理和检索操作
这样,你就有了一个”能自己跑文档”的 AI 助手!