- 专栏系列第 6 篇 · 智能体纪元
本文将详细介绍并实践以下内容:
- LangChain 各组件(LLM、工具、链、记忆、Agent、提示、RAG、Retriever 等)在完整项目中的协作关系
- 结合 DeepSeek + bge-small-zh + FAISS + DuckDuckGoSearch
- 提供模块化代码示例,说明每部分的职责与灵活性
- 使用 FastAPI 将 Agent 封装成 API 服务,可用于 Web 前端接入
- 查漏补缺前几篇中未展开的主题,例如 Tool 封装规范、Agent 执行中间状态管理、复杂提示结构设计等
本系列文章最后一篇将系统讲解如何基于 LangChain 框架构建一个功能齐全、可部署的智能问答 Agent。我们将结合前文核心概念(ReAct 架构、RAG 检索增强、提示工程、工具调用等)逐步展开,选用 DeepSeek 聊天模型作为 LLM、BAAI/bge-small-zh-v1.5 作为中文嵌入模型、FAISS 作为向量数据库、DuckDuckGoSearchRun 作为联网搜索工具,最终封装成 RESTful 服务。
- 什么是LangChain?
LangChain是一个用于开发由语言模型驱动的应用程序的框架。它允许开发者将大型语言模型(LLMs)与其他计算或知识源连接起来,从而创建更强大、更灵活的AI应用。
- LangChain核心组件
LangChain包含多个核心模块,这些模块可以组合使用来构建复杂的AI Agent:
- Models:支持多种语言模型接口
- Prompts:提示管理、优化和序列化
- Memory:短期和长期记忆管理
- Indexes:文档加载、处理和检索
- Chains:调用序列和组合
- Agents:动态决策和工具使用
- Callbacks:日志和流式传输
- ReAct 框架:是一种将推理(Reasoning)与动作(Action)相结合的交互式提示方式。LangChain 的 ReAct Agent 可以让模型在对话过程中思考 ()、采取动作 () 并观察结果 (),从而动态调用外部工具。例如,当模型面临复杂问题时,可以通过调用搜索工具或数据库工具来获取补充信息,再结合生成能力给出答案。
- RAG(检索增强生成):指在生成回答时通过检索相关文档来提供上下文或证据的技术。RAG 适用于将领域知识融入对话,避免模型只凭「记忆」回答超出能力的问题。我们会使用向量数据库(FAISS)和文本嵌入来实现 RAG,从海量文档中检索与用户问题最相关的内容,再输入模型生成答案。
- 提示工Agent 智能体程:通过 等机制设计和组织模型提示,将任务指令、示例和变量拼接成最终输入。好的提示可以大幅提升模型理解和回答能力。我们将定制提示模板,明确说明用户意图及可用工具等,引导模型在 ReAct 交互中正确使用工具。
- 工具调用:Agent 能访问的工具(如搜索引擎、知识库查询、计算器等)需封装为符合接口的 对象,包含名称、调用函数和用途说明。在 ReAct 策略下,模型可以选择某个工具并按指定格式传入参数。本文示例中,将集成联网搜索与本地向量检索两种工具供 Agent 使用。
- 多轮对话与记忆:使用 记录会话历史,实现上下文连续性。当用户提问时,上下文记忆会作为提示变量注入,让模型参考前文对话内容,使回答更具连贯性。
- LLM(聊天模型):选用 DeepSeek 提供的 deepseek-chat 模型作为对话模型。DeepSeek 是一系列开源模型,支持结构化输入、工具调用等能力。DeepSeek API 使用与 OpenAI 兼容的 API 格式,可使用 LangChain 的 进行接入,如下所示:
✅ 参数使用建议
- 温度设置:
- 适合问答、摘要、代码生成等确定性任务;
- 更适合生成富有创意的内容。
- 兼容模型:
- 若使用 DeepSeek、Moonshot、Azure OpenAI 等非官方 API,务必设置 。
- 高阶用法:
- 可结合 或 构建复杂流程。
这样实例化后, 即可获得模型回复。
输出:
在构建 Agent 之前,我们需要先将原始文档转化为可以检索的向量形式,具体包括:
(1)加载本地文档
LangChain 提供多种 来读取不同格式的文档。
- 读取 Markdown 文件():

- 读取整个目录下的 Markdown 文件:

- 读取 PDF 文件:
对于 PDF 文件,可以使用 进行加载。它会按页读取并自动转为 对象。

如果你希望将多个来源的文档合并处理,只需拼接多个 列表即可:
(2)文档切分
为了让长文档适配向量数据库,我们需要按段落或语义块进行切分。推荐使用 :
此操作会将文档拆成多个短文本块,既保留上下文连续性,又便于后续的向量化处理。

我们选用了性能与体积兼顾的中文向量模型 —— BAAI/bge-small-zh-v1.5。它支持短语级语义检索,能生成可用于相似度计算的高质量文本向量。
- 嵌入模型(Embedding Model) 的核心功能是将自然语言文本转换为数值向量(embedding),使得我们可以基于向量做相似度检索、聚类、语义匹配等操作。在 LangChain 中,embedding model 通常用于以下两个场景:
- 文档入库(embedding + 存入向量数据库)
- 用户查询转换(embedding + 相似文档检索)
- BGE 模型推荐在 之前添加查询指令(query_instruction),以获得更好的效果。
输出:

- 向量数据库:使用 FAISS 存储文档向量。FAISS 是 Facebook 提供的高效相似度检索库,专门用于密集向量搜索。将待检索的文档列表通过 编码后,使用 构建向量索引。例如:
1. 将前面切分后的 向量化,并存入 FAISS

这样即可快速从 FAISS 中根据用户查询检索相关文档。
2. 检索器构造(Retriever)
我们通过 构造一个语义检索器,支持基于向量相似度的文段召回:
- 是 LangChain 中统一的文档检索接口,而 是把底层的向量数据库变成这个接口。
- :检索方式,默认是 “similarity”(相似度检索),还可以是 “mmr”(最大边际相关性)等。
- :检索参数,比如 k=3 表示返回前 3 条相似结果。也可以传入 等用于更精细控制的参数。
输出:

使用 DuckDuckGo 搜索工具进行实时查询。LangChain 社区提供了 封装,可直接调用 DuckDuckGo API。示例:

这个工具方便集成到 Agent 中,实现“需要联网搜索”时的补充信息。
所有工具统一封装为 对象,包含名称、执行函数和描述。例如,我们可以准备两个工具:网络搜索 和 向量检索。
这样 Agent 在对话过程中如果决定“搜索网页”就会调用第一个工具,如果需要“查看知识库”则调用第二个。
按照 LangChain 组件化设计,我们将主要功能模块划分为不同文件或类以便维护:
- Embedding 模块:负责加载 模型并构建 FAISS 数据库。示例代码如上,将用于后续检索。
- Tool 模块:定义各种工具。可以把搜索和检索函数封装在此,例如前述的 、。
- Prompt 模板:使用 定义 ReAct 提示格式,插入工具列表和对话历史等变量,例如:
- 记忆模块:通过 保存对话记录。初始化时指定 ,并将该内存作为参数传入 AgentExecutor。
- Agent 构建:使用 LangChain 的 ReAct Agent 构造器创建可调用的 Agent:
这样得到的 会返回模型对话输出,其中模型可以在生成过程中调用 或 等工具,并将返回结果纳入思考。
输出:
完成以上组件后,用 FastAPI 构建 API 服务接口:
启动服务后,客户端即可通过 POST 请求访问,例如:
上述请求返回的 JSON 会包含智能体的回答。整个服务基于组件化设计,后续可替换模型、增加工具或更换向量数据库,而不影响主逻辑。
- 推荐阅读:深入了解 LangChain 文档,如 ReAct Agent 和工具调用机制,探索 LangGraph 新架构;学习 DeepSeek 和 BGE 模型的官方资料。
- 项目目录及代码详情(以模块化方式组织代码):
详细代码:ai_agent_demo
输出:


- 总结:本文展示了如何将 RAG、工具调用、多轮记忆等技术融合到一个 LangChain Agent 中,结合 DeepSeek 聊天模型和本地向量数据库,实现实用的问答系统。该架构具有良好可扩展性,可根据需求添加更多工具或采用更强大的模型,以满足复杂的应用场景。
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/245337.html原文链接:https://javaforall.net
