🧠 LangChain 实战(下):Data Connection + Agents,构建真正的智能应用
一、本章概览
第11章《大模型应用开发框架 LangChain(下)》是 LangChain 系列的收官之章,聚焦两大核心模块——Data Connection(数据处理流) 和 Agents(代理系统)。
核心内容:
-
Data Connection:五大模块完整数据处理流 -
Document Loaders:快速接入各类数据源 -
Document Transformers:文档清洗、拆分与转换 -
Text Embedding Models:文本向量化 -
Vector Stores:向量数据库全景 -
Retrievers:数据检索器 -
Agent 理论基础:ReAct(Reasoning + Acting) -
LangChain Agents 模块设计原理 -
实战:Self-ask-with-search(SerpAPI 搜索) -
实战:ReAct(Google Search + LLM-Math) -
课程项目:openai-quickstart
二、Data Connection:框架原生的数据处理流
完整数据处理链路
Source → Load → Transform → Embed → Store → Retrieve
对应五大组件:
|
|
|
|
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
数据处理流程可视化
加载 转换 向量化 存储 检索
┌──┐ ┌──┐ ┌──┐ ┌──┐ ┌──┐
│ │→ │ │→ │ │→ │ │→ │ │
└──┘ └──┘ └──┘ └──┘ └──┘
原始 文本 向量 向量 相关
文档 片段 嵌入 数据库 片段
三、Document Loaders:快速接入各类数据源
典型数据格式
|
|
|
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
典型数据源
★ArXiv、BiliBili、Discord、Figma、GitHub、Reddit、TensorFlow Datasets 等
BaseLoader 与 Document 类
BaseLoader 统一接口,核心方法:
|
|
|
|---|---|
load() |
|
load_and_split() |
RecursiveCharacterTextSplitter
|
Document 类字段:
|
|
|
|---|---|
page_content |
|
metadata |
|
lookup() |
|
paragraphs |
\n\n 拆分段落
|
summary |
|
四、Document Transformers:数据转换模块
主要转换工具一览:
|
|
|
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
五、Text Embedding Models:文本嵌入模型
工作原理
将文本映射为数值向量(如 [0.5, 0.2, ...]),用于后续语义相似度计算。
支持的模型(部分列举)
|
|
|
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
六、Vector Stores:向量数据库
支持列表(部分)
|
|
|
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
★💡 向量数据库存储的是语义向量而非原始文本,支持近似最近邻(ANN)搜索,是知识库问答的技术基础。
七、Retrievers:数据检索器
支持列表(部分)
|
|
|
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
八、Agent 理论基础:ReAct
三种范式对比
核心问题: 大模型如何与外部世界交互?
Reason-only(仅推理):
Thought → Thought → Thought → Answer
(依赖内部知识,无法获取新信息)
Act-only(仅行动):
Action → Obs → Action → Obs → Answer
(缺少推理,无法综合判断)
ReAct(推理 + 行动)⭐:
Thought → Action → Obs → Thought → Action → Obs → Answer
(推理与行动交替,最佳方案)
|
|
|
|
|
|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
Reasoning + Acting |
|
|
ReAct Prompt 设计
ReAct Prompt 由 few-shot task-solving trajectories 组成,包含三个部分:
-
Thought(推理):人工编写的文本推理过程 -
Act(行动):要执行的动作 -
Obs(观察):环境对动作的反馈
设计直观灵活,在 QA 到在线购物等多种任务上实现了最先进的少样本性能。
ReAct 性能对比表
|
|
|
|
|
|
|---|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| Best ReAct method | 35.1 | 64.6 | — | 40 |
|
|
|
|
|
|
ReAct 的两大优势
1. 获取新数据方面
-
Reason-only 依赖内部知识,容易受错误信息影响(如"Apple Remote"错答为 iPhone/iPad) -
Act-only 缺乏推理无法综合答案 -
ReAct 通过可解释的真实轨迹正确解题,例子:搜索 Apple Remote → Front Row → Front Row (software) → 正确答案:keyboard function keys
2. 微调方面
-
ReAct 是各种模型规模下最好的微调方式 -
ReAct 微调的较小模型胜过了被 prompt 的更大模型
九、LangChain Agents 模块设计原理
核心思想
★与 Chains 中动作序列硬编码不同,Agents 使用 LLM 作为推理引擎,动态决定采取哪些动作及其执行顺序。
模块组成
User Input
↓
Agent(LLM + Prompts)← 推理引擎,决定下一步动作
↕
AgentExecutor(Runtime)← 执行循环
↕
Tools(Tool 1, Tool 2, Tool 3…)→ Toolkits(工具集合)
↓
Observation(环境反馈)
AgentType(Prompting Strategies)
|
|
|
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
AgentExecutor 执行循环
next_action = agent.get_action(...)
while next_action != AgentFinish:
observation = run(next_action)
next_action = agent.get_action(..., next_action, observation)
return next_action
十、实战案例
案例1:Self-ask-with-search(SerpAPI 搜索)
问题: "2023年大运会举办地在哪里?"
Agent 执行过程:
Thought: 我需要知道2023年大运会的信息
Followup: 什么是2023年大运会?
→ 搜索:2023 FISU Summer World University Games
→ 观察:第32届夏季世界大学生运动会,由国际大学生体育联合会(FISU)组织
Followup: 2023年大运会的举办地在哪里?
→ 搜索:成都大运会
→ 观察:第31届世界大学生夏季运动会,开幕式2023年7月28日,闭幕式8月8日
→ 举办地:成都
Final Answer: 成都 ✅
案例2:对比仅 LLM(Reason-only)
llm("2023年大运会举办地在哪里?")
# 输出: "2023年大运会将在日本东京举办" ❌(错误!)
★⚠️ 仅靠 LLM 内部知识容易产生幻觉,ReAct 通过检索外部信息得到正确答案。
案例3:实战 ReAct(Google Search + LLM-Math)
from langchain.llms import OpenAI
from langchain.agents import load_tools, initialize_agent, AgentType
llm = OpenAI(temperature=0)
tools = load_tools(['serpapi', 'llm-math'], llm=llm)
agent = initialize_agent(tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True)
Tools 扩展:更多工具
# Wikipedia 检索
from langchain.tools import WikipediaQueryRun
from langchain.utilities import WikipediaAPIWrapper
wikipedia = WikipediaQueryRun(api_wrapper=WikipediaAPIWrapper())
wikipedia.run("HUNTER X HUNTER")
# Hugging Face 工具
from langchain.agents import load_huggingface_tool
tool = load_huggingface_tool("lysandre/hf-model-downloads")
# DALL-E 图像生成
tools = load_tools(['dalle-image-generator'])
agent = initialize_agent(tools, llm, agent="zero-shot-react-description", verbose=True)
agent.run("Create an image of a halloween night at a haunted museum")
十一、课程项目:GitHub openai-quickstart
|
|
|
|---|---|
| 项目名称 |
|
| 定位 |
|
| 文档 |
|
项目目录
openai-quickstart/
├── openai_api/ # OpenAI API 实战
├── langchain/ # LangChain 集成示例
├── openai-translator/ # OpenAI 翻译工具
├── chatgpt-plugins/ # ChatGPT 插件开发
├── docs/ # 文档与学习资料
└── selected_homework/ # 学员优秀作业
📌 本章核心要点总结
|
|
|
|
|---|---|---|
|
|
Data Connection 五步流 |
|
|
|
Document Loaders |
|
|
|
Vector Stores |
|
|
|
ReAct 核心思想 |
|
|
|
ReAct 性能优势 |
|
|
|
Agents 模块组成 |
|
|
|
AgentExecutor 循环 |
|
|
|
Self-ask-with-search |
|
|
|
ReAct 微调优势 |
|
★📚 下期预告:第12章 —— 实战 LangChain 版 OpenAI-Translator v2.0,用 LangChain 重构翻译应用,敬请期待!

