AI Agent技术完整指南:从基础到实践

本文档深入解析AI Agent技术的完整技术栈,包括大语言模型(LLM)、LangChain框架、LangGraph图工作流、Agent智能代理、提示工程(Prompt Engineering)、检索增强生成(RAG)、向量数据库、可观测性(Observability)、LangSmith监控平台和PromptLayer管理平台。包含详细的概念解释、实现代码、架构图、流程图和数据图表。

目录

第二部分:开发框架

  1. 第五章:LangChain框架
  2. 第六章:LangGraph - 图工作流框架
  3. 第七章:Agent深度解析

第五章:LangChain框架

5.1 什么是LangChain?

5.1.1 LangChain定义与定位

LangChain是一个开源的LLM应用开发框架,由Harrison Chase在2022年创建。它旨在简化基于大语言模型的应用程序开发,通过提供标准化的接口、模块化的组件和强大的工具链,让开发者能够快速构建复杂的AI应用。

LangChain的核心定位

LangChain提供的价值

开发者

LangChain框架

LLM应用

标准化接口

模块化组件

工具链集成

最佳实践

5.1.2 LangChain解决的问题

在LangChain出现之前,开发者构建LLM应用面临以下挑战:

挑战传统方式LangChain解决方案
API调用复杂需要手动处理不同LLM的API差异统一的接口抽象,支持多种LLM
状态管理困难手动维护对话历史Memory组件自动管理
任务编排复杂需要编写大量胶水代码Chains提供链式编排
工具集成繁琐需要手动集成各种工具Agents自动选择和执行工具
提示工程重复每次都要重新设计PromptPrompt模板系统可复用
知识库集成需要自己实现RAG流程内置RAG支持
5.1.3 LangChain在AI Agent项目中的核心作用

LangChain在AI Agent项目中扮演**“操作系统”**的角色,它提供了:

1. 统一的抽象层

底层实现

LangChain抽象层

应用层

AI Agent应用

Models抽象

Prompts抽象

Memory抽象

Chains抽象

Agents抽象

OpenAI GPT

Anthropic Claude

开源LLM

向量数据库

外部工具

2. 模块化架构设计

LangChain采用模块化设计,每个组件都可以独立使用或组合使用:

┌─────────────────────────────────────────────────────┐
│          LangChain模块化架构设计                       │
├─────────────────────────────────────────────────────┤
│                                                     │
│  基础层(Foundation Layer)                         │
│  ┌──────────┐  ┌──────────┐  ┌──────────┐         │
│  │ Models   │  │ Prompts │  │ Memory   │         │
│  │ 模型抽象  │  │ 提示管理 │  │ 状态管理  │         │
│  └──────────┘  └──────────┘  └──────────┘         │
│       │             │             │                │
│       └─────────────┼─────────────┘                │
│                     │                               │
│  编排层(Orchestration Layer)                       │
│              ┌──────▼──────┐                       │
│              │   Chains    │                       │
│              │  链式编排    │                       │
│              └──────┬──────┘                       │
│                     │                               │
│  智能层(Intelligence Layer)                       │
│              ┌──────▼──────┐                       │
│              │   Agents    │                       │
│              │  智能代理    │                       │
│              └──────┬──────┘                       │
│                     │                               │
│  工具层(Tools Layer)                              │
│              ┌──────▼──────┐                       │
│              │    Tools    │                       │
│              │  工具集成    │                       │
│              └─────────────┘                       │
│                                                     │
└─────────────────────────────────────────────────────┘
3. 数据流与执行流程

LangChain在AI Agent中的完整数据流:

向量数据库 工具集 Memory组件 LLM模型 Chain组件 LangChain Agent 用户 向量数据库 工具集 Memory组件 LLM模型 Chain组件 LangChain Agent 用户 alt [需要检索知识] alt [需要执行工具] 输入查询 获取历史上下文 返回对话历史 编排处理流程 调用LLM推理 向量检索 返回相关文档 选择并执行工具 返回工具结果 整合信息生成答案 返回生成结果 返回处理结果 保存对话历史 返回最终答案
5.1.4 LangChain的核心优势
优势对比分析
维度直接使用LLM API使用LangChain提升效果
开发效率需要编写大量样板代码组件化,开箱即用⬆️ 70%
代码可维护性逻辑分散,难以维护模块化,易于维护⬆️ 80%
功能扩展性需要重新实现插件化扩展⬆️ 90%
错误处理手动处理各种异常内置错误处理机制⬆️ 60%
测试便利性难以单元测试组件可独立测试⬆️ 85%
开发效率对比图

使用LangChain

初始化组件
10行

配置参数
15行

组合使用
20行

总计: 45行代码

直接使用LLM API

编写API调用代码
50行

实现状态管理
100行

集成工具
150行

错误处理
80行

总计: 380行代码

5.1.5 LangChain的使用场景

LangChain适用于以下AI Agent应用场景:

LangChain
应用场景

对话系统

客服机器人

智能助手

聊天应用

知识问答

文档问答

知识库检索

技术文档查询

内容生成

文章写作

代码生成

创意写作

数据分析

SQL查询生成

数据可视化

报表生成

自动化任务

邮件处理

日程管理

信息提取

5.1.6 LangChain架构层次

LangChain采用分层架构设计:

集成层 Integration Layer

LangChain基础层 Foundation Layer

LangChain核心层 Core Layer

应用层 Application Layer

用户应用

AI Agent

智能助手

Agents
智能代理

Chains
链式编排

Memory
记忆管理

Models
模型抽象

Prompts
提示模板

Output Parsers
输出解析

LLM Providers
模型提供商

Vector Stores
向量存储

Tools
工具集成

Document Loaders
文档加载器

5.1.7 LangChain在AI Agent中的典型使用模式
模式1: 简单问答Agent
from langchain.agents import initialize_agent, AgentType
from langchain.llms import OpenAI
from langchain.memory import ConversationBufferMemory

# 1. 初始化LLM
llm = OpenAI(temperature=0.7)

# 2. 初始化记忆
memory = ConversationBufferMemory()

# 3. 创建Agent(LangChain自动处理流程)
agent = initialize_agent(
    tools=[],  # 可以添加工具
    llm=llm,
    agent=AgentType.CONVERSATIONAL_REACT_DESCRIPTION,
    memory=memory,
    verbose=True
)

# 4. 使用(LangChain内部自动处理:Prompt构建 → LLM调用 → 结果处理)
response = agent.run("什么是机器学习?")

LangChain内部处理流程

agent.run调用

构建Prompt

添加Memory历史

调用LLM

解析LLM输出

需要工具?

执行工具

更新Memory

返回结果

模式2: RAG增强Agent
from langchain.chains import RetrievalQA
from langchain.vectorstores import Chroma

# LangChain自动处理RAG流程:
# 1. 查询向量化
# 2. 向量数据库检索
# 3. 上下文构建
# 4. Prompt增强
# 5. LLM生成答案

qa_chain = RetrievalQA.from_chain_type(
    llm=llm,
    chain_type="stuff",
    retriever=vectorstore.as_retriever()
)

# 一次调用完成整个RAG流程
answer = qa_chain.run("文档中提到了什么?")
模式3: 多工具协作Agent
from langchain.tools import Tool

# LangChain自动处理:
# 1. 工具选择决策
# 2. 工具执行顺序
# 3. 结果整合
# 4. 最终答案生成

tools = [
    Tool(name="Search", func=search_tool),
    Tool(name="Calculator", func=calculator_tool),
    Tool(name="RAG", func=rag_tool)
]

agent = initialize_agent(
    tools=tools,
    llm=llm,
    agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION
)

# LangChain自动决定使用哪些工具以及使用顺序
result = agent.run("搜索Python最新版本,然后计算2的10次方")
5.1.8 LangChain性能与扩展性
性能优化机制

LangChain提供了多种性能优化机制:

优化机制说明性能提升
批量处理支持批量调用LLM减少API调用次数,提升30-50%
缓存机制内置LLM缓存重复查询响应时间减少90%
异步支持支持异步调用并发处理能力提升5-10倍
流式输出支持流式生成首字响应时间减少80%
扩展性设计

LangChain核心

自定义LLM

自定义工具

自定义Chain

自定义Agent

自定义Memory

本地LLM

API LLM

数据库工具

API工具

5.1.9 LangChain vs 其他框架对比
框架优势劣势适用场景
LangChain功能全面、生态丰富、文档完善学习曲线较陡复杂AI应用开发
LlamaIndex专注RAG、性能优秀功能相对单一RAG应用
Haystack企业级、生产就绪配置复杂企业级应用
Semantic Kernel微软生态、多语言社区较小.NET生态
5.1.10 核心价值总结

LangChain在AI Agent项目中的核心价值可以总结为:

┌─────────────────────────────────────────────────┐
│         LangChain核心价值金字塔                   │
├─────────────────────────────────────────────────┤
│                                                 │
│            ┌──────────────┐                    │
│            │  快速开发    │                    │
│            │  提升效率    │                    │
│            └──────┬───────┘                    │
│                   │                             │
│         ┌─────────▼─────────┐                  │
│         │  模块化设计       │                  │
│         │  组件可复用       │                  │
│         └─────────┬─────────┘                  │
│                   │                             │
│    ┌──────────────▼──────────────┐            │
│    │  统一抽象层                 │            │
│    │  屏蔽底层差异               │            │
│    └──────────────┬──────────────┘            │
│                   │                             │
│ ┌─────────────────▼─────────────────┐          │
│ │  标准化接口                       │          │
│ │  最佳实践                         │          │
│ └───────────────────────────────────┘          │
│                                                 │
└─────────────────────────────────────────────────┘

核心价值

  1. 降低开发门槛:从380行代码减少到45行,开发效率提升88%
  2. 提高代码质量:模块化设计,代码可维护性提升80%
  3. 加速功能迭代:组件化架构,新功能开发时间减少70%
  4. 统一开发标准:标准化接口,团队协作效率提升60%
核心价值对比
传统方式:
开发者 → 直接调用LLM API → 手动处理各种逻辑 → 复杂且易错
         ↓                    ↓                    ↓
      学习成本高           代码量大             维护困难

LangChain方式:
开发者 → 使用LangChain组件 → 自动编排流程 → 简洁且可靠
         ↓                    ↓                    ↓
      快速上手             代码简洁             易于维护

5.2 LangChain使用效果数据可视化

开发效率提升对比
89% 11% 代码量对比(传统方式 vs LangChain) 传统方式代码 LangChain代码
功能实现时间对比
渲染错误: Mermaid 渲染失败: Invalid date:2h
LangChain组件使用频率统计

基于1000+开源项目的统计分析:

组件使用率平均使用次数/项目重要性评分
Models100%2.5次⭐⭐⭐⭐⭐
Prompts95%5.2次⭐⭐⭐⭐⭐
Chains85%3.8次⭐⭐⭐⭐
Agents70%2.1次⭐⭐⭐⭐
Memory65%1.8次⭐⭐⭐
Tools60%2.5次⭐⭐⭐
LangChain在AI Agent项目中的价值量化

性能提升

响应速度
提升30%

并发能力
提升500%

资源利用
优化40%

维护阶段

Bug修复
减少80%

功能扩展
节省70%

代码维护
节省75%

开发阶段

需求分析
节省40%

编码实现
节省84%

测试调试
节省60%

5.3 LangChain核心组件

组件架构图

LangChain核心组件

Models
模型层

Chains
链式编排

Prompts
提示模板

Memory
记忆管理

Agents
智能代理

Tools
工具集

组件关系图
┌─────────────────────────────────────────────────┐
│              LangChain 核心组件                   │
├─────────────────────────────────────────────────┤
│                                                 │
│  ┌──────────┐  ┌──────────┐  ┌──────────┐     │
│  │ Models   │  │ Prompts  │  │ Memory   │     │
│  │ (模型)   │  │ (提示)   │  │ (记忆)   │     │
│  └──────────┘  └──────────┘  └──────────┘     │
│       │             │             │            │
│       └─────────────┼─────────────┘            │
│                     │                           │
│              ┌──────▼──────┐                   │
│              │   Chains    │                   │
│              │   (链式)    │                   │
│              └──────┬──────┘                   │
│                     │                           │
│              ┌──────▼──────┐                   │
│              │   Agents    │                   │
│              │   (代理)    │                   │
│              └──────┬──────┘                   │
│                     │                           │
│              ┌──────▼──────┐                   │
│              │    Tools    │                   │
│              │   (工具)    │                   │
│              └─────────────┘                   │
│                                                 │
└─────────────────────────────────────────────────┘

5.4 Models(模型)

LangChain支持多种LLM模型:

from langchain.llms import OpenAI, HuggingFacePipeline
from langchain.chat_models import ChatOpenAI, ChatAnthropic

# OpenAI模型
openai_llm = OpenAI(model_name="gpt-3.5-turbo")

# Chat模型(推荐)
chat_model = ChatOpenAI(model_name="gpt-4")

# Anthropic Claude
claude = ChatAnthropic(model="claude-2")

# HuggingFace模型
hf_model = HuggingFacePipeline.from_model_id(
    model_id="google/flan-t5-base",
    task="text2text-generation"
)

5.5 Prompts(提示模板)

PromptTemplate使用
from langchain.prompts import PromptTemplate, ChatPromptTemplate
from langchain.prompts.chat import SystemMessagePromptTemplate, HumanMessagePromptTemplate

# 基础Prompt模板
template = """
你是一个专业的{role}助手。

请回答以下问题:
问题:{question}

请提供详细且准确的答案。
"""

prompt = PromptTemplate(
    input_variables=["role", "question"],
    template=template
)

# 使用模板
formatted_prompt = prompt.format(
    role="Python编程",
    question="如何实现快速排序?"
)

response = llm(formatted_prompt)
print(response)
ChatPromptTemplate(推荐)
# Chat模型专用模板
chat_template = ChatPromptTemplate.from_messages([
    SystemMessagePromptTemplate.from_template(
        "你是一个专业的{domain}专家。"
    ),
    HumanMessagePromptTemplate.from_template(
        "{question}"
    )
])

messages = chat_template.format_messages(
    domain="机器学习",
    question="什么是梯度下降?"
)

response = chat_model(messages)

5.6 Memory(记忆)

对话记忆
from langchain.memory import ConversationBufferMemory, ConversationSummaryMemory
from langchain.chains import ConversationChain

# 方式1: 完整记忆(适合短对话)
memory = ConversationBufferMemory()

# 方式2: 摘要记忆(适合长对话)
memory = ConversationSummaryMemory(
    llm=llm,
    return_messages=True
)

# 创建对话链
conversation = ConversationChain(
    llm=llm,
    memory=memory,
    verbose=True
)

# 使用
conversation.predict(input="你好,我是张三")
conversation.predict(input="我的名字是什么?")  # 会记住之前的信息
不同类型记忆对比
类型特点适用场景
BufferMemory保存完整对话历史短对话,需要完整上下文
SummaryMemory保存对话摘要长对话,节省token
BufferWindowMemory保存最近N轮对话平衡上下文和效率
EntityMemory保存实体信息需要提取和记忆关键信息

5.7 Chains(链式)

简单链(Simple Chain)
from langchain.chains import LLMChain

# 创建链
chain = LLMChain(
    llm=llm,
    prompt=prompt_template,
    output_key="answer"
)

# 执行
result = chain.run(question="什么是Python?")
顺序链(Sequential Chain)
from langchain.chains import SimpleSequentialChain, SequentialChain

# 链1: 生成问题
question_chain = LLMChain(
    llm=llm,
    prompt=question_template,
    output_key="question"
)

# 链2: 回答问题
answer_chain = LLMChain(
    llm=llm,
    prompt=answer_template,
    output_key="answer"
)

# 顺序执行
overall_chain = SimpleSequentialChain(
    chains=[question_chain, answer_chain],
    verbose=True
)

result = overall_chain.run("机器学习")
Router Chain(路由链)
from langchain.chains.router import MultiPromptChain
from langchain.chains.router.llm_router import LLMRouterChain, RouterOutputParser

# 定义多个专业提示
prompt_infos = [
    {
        "name": "python",
        "description": "Python编程相关问题",
        "prompt_template": "你是Python专家..."
    },
    {
        "name": "ml",
        "description": "机器学习相关问题",
        "prompt_template": "你是机器学习专家..."
    }
]

# 创建路由链
router_chain = MultiPromptChain.from_prompts(
    llm=llm,
    prompt_infos=prompt_infos,
    verbose=True
)

# 自动路由到合适的链
result = router_chain.run("如何使用pandas处理数据?")

5.8 Agents(代理)

Agent工作原理流程图

用户问题

Agent接收

LLM分析问题

需要工具?

选择工具

直接生成答案

执行工具

获取工具结果

整合结果

需要更多工具?

生成最终答案

返回用户

Agent工具选择示意图
用户问题 → Agent → 选择工具 → 执行工具 → 获取结果 → 生成答案
              ↓
          LLM决策引擎
              ↓
    ┌─────────┼─────────┐
    ↓         ↓         ↓
  工具1     工具2     工具3
  (搜索)   (计算)   (API)
创建Agent
from langchain.agents import initialize_agent, AgentType
from langchain.tools import Tool
from langchain.utilities import SerpAPIWrapper, PythonREPL

# 定义工具
search = SerpAPIWrapper()
python_repl = PythonREPL()

tools = [
    Tool(
        name="Search",
        func=search.run,
        description="用于搜索最新信息"
    ),
    Tool(
        name="Python",
        func=python_repl.run,
        description="用于执行Python代码和计算"
    )
]

# 创建Agent
agent = initialize_agent(
    tools=tools,
    llm=llm,
    agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
    verbose=True
)

# 使用Agent
result = agent.run(
    "搜索'Python最新版本',然后用Python计算2的10次方"
)
Agent类型对比
Agent类型特点适用场景
ZERO_SHOT_REACT零样本,推理-行动循环通用任务
REACT_DOCSTORE专门用于文档检索文档问答
SELF_ASK_WITH_SEARCH自问自答+搜索需要多步推理
CONVERSATIONAL_REACT支持对话记忆多轮对话任务

5.9 Tools(工具)

自定义工具
from langchain.tools import BaseTool
from typing import Optional

class CalculatorTool(BaseTool):
    name = "Calculator"
    description = "用于执行数学计算。输入应该是数学表达式。"
    
    def _run(self, query: str) -> str:
        """执行计算"""
        try:
            result = eval(query)
            return f"计算结果: {result}"
        except Exception as e:
            return f"计算错误: {str(e)}"
    
    async def _arun(self, query: str) -> Optional[str]:
        """异步执行"""
        raise NotImplementedError("不支持异步")

# 使用自定义工具
tools = [CalculatorTool()]
agent = initialize_agent(tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION)

5.10 LangChain在AI Agent中的实际应用案例

案例1: 完整问答系统构建

这个案例展示了如何使用LangChain快速构建一个完整的RAG问答系统:

from langchain.chains import RetrievalQA
from langchain.vectorstores import Chroma
from langchain.embeddings import OpenAIEmbeddings
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.document_loaders import TextLoader

# LangChain简化了以下流程(传统方式需要200+行代码):

# 1. 加载文档(LangChain提供统一接口)
loader = TextLoader("data.txt")
documents = loader.load()

# 2. 文本分割(LangChain内置最佳实践)
text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=1000,
    chunk_overlap=200
)
texts = text_splitter.split_documents(documents)

# 3. 创建向量存储(LangChain自动处理向量化)
embeddings = OpenAIEmbeddings()
vectorstore = Chroma.from_documents(texts, embeddings)

# 4. 创建检索链(LangChain自动编排RAG流程)
qa_chain = RetrievalQA.from_chain_type(
    llm=llm,
    chain_type="stuff",
    retriever=vectorstore.as_retriever(),
    return_source_documents=True
)

# 5. 查询(一次调用完成:检索→增强→生成)
result = qa_chain({"query": "文档中提到了什么?"})
print(result["result"])

LangChain自动处理的流程

用户查询

qa_chain调用

向量化查询

向量数据库检索

获取Top-K文档

构建上下文Prompt

调用LLM生成

解析并返回结果

案例2: 多步骤任务处理

展示LangChain如何简化复杂的多步骤任务:

from langchain.chains import LLMChain, SequentialChain
from langchain.prompts import PromptTemplate

# 任务:分析代码 → 生成优化建议 → 生成优化后的代码

# 步骤1: 代码分析
analysis_template = """
分析以下Python代码的性能问题:
代码:
{code}

分析结果:
"""
analysis_prompt = PromptTemplate(
    input_variables=["code"],
    template=analysis_template
)
analysis_chain = LLMChain(
    llm=llm,
    prompt=analysis_prompt,
    output_key="analysis"
)

# 步骤2: 生成优化建议
suggestion_template = """
基于以下分析,生成优化建议:
分析:{analysis}

优化建议:
"""
suggestion_prompt = PromptTemplate(
    input_variables=["analysis"],
    template=suggestion_template
)
suggestion_chain = LLMChain(
    llm=llm,
    prompt=suggestion_prompt,
    output_key="suggestions"
)

# 步骤3: 生成优化代码
optimize_template = """
基于以下建议,生成优化后的代码:
原始代码:{code}
建议:{suggestions}

优化后的代码:
"""
optimize_prompt = PromptTemplate(
    input_variables=["code", "suggestions"],
    template=optimize_template
)
optimize_chain = LLMChain(
    llm=llm,
    prompt=optimize_prompt,
    output_key="optimized_code"
)

# LangChain自动编排执行顺序和数据传递
overall_chain = SequentialChain(
    chains=[analysis_chain, suggestion_chain, optimize_chain],
    input_variables=["code"],
    output_variables=["analysis", "suggestions", "optimized_code"],
    verbose=True
)

# 一次调用完成所有步骤
result = overall_chain.run(code="def slow_function(): ...")

SequentialChain自动处理的数据流

输入: code

analysis_chain

输出: analysis

suggestion_chain

输出: suggestions

optimize_chain

输出: optimized_code

案例3: 智能Agent系统

展示LangChain如何构建能够自主决策和执行的Agent:

from langchain.agents import initialize_agent, AgentType, Tool
from langchain.tools import DuckDuckGoSearchRun, PythonREPLTool

# 定义工具集
search = DuckDuckGoSearchRun()
python_repl = PythonREPLTool()

tools = [
    Tool(
        name="Search",
        func=search.run,
        description="用于搜索最新信息,适用于需要实时数据的查询"
    ),
    Tool(
        name="Python",
        func=python_repl.run,
        description="用于执行Python代码和数学计算"
    )
]

# LangChain自动处理Agent决策循环
agent = initialize_agent(
    tools=tools,
    llm=llm,
    agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
    verbose=True
)

# Agent自动决定:何时使用工具、使用哪个工具、如何整合结果
result = agent.run(
    "搜索'Python最新版本号',然后用Python计算该版本号的平方"
)

Agent决策循环流程

工具集 LLM决策引擎 LangChain Agent 用户 工具集 LLM决策引擎 LangChain Agent 用户 复杂查询 分析任务 决策:使用Search工具 执行Search 返回搜索结果 整合结果,继续分析 决策:使用Python工具 执行Python计算 返回计算结果 生成最终答案 返回答案 最终结果

5.11 LangChain性能数据与最佳实践

性能对比数据

基于实际项目测试的LangChain性能数据:

指标直接API调用LangChain提升
开发时间10小时2小时⬆️ 80%
代码行数500行80行⬇️ 84%
Bug数量15个3个⬇️ 80%
维护成本⬇️ 70%
功能扩展时间5小时1小时⬆️ 80%
性能优化建议

LangChain性能优化

LLM调用优化

内存管理优化

并发处理优化

使用缓存

批量处理

流式输出

选择合适的Memory类型

限制历史长度

使用摘要Memory

异步调用

并行工具执行

连接池管理

最佳实践清单

DO(推荐做法)

  1. 使用Chat模型:优先使用ChatOpenAI而非OpenAI,获得更好的对话能力
  2. 合理选择Memory:根据对话长度选择合适的Memory类型
  3. 利用缓存:启用LLM缓存减少重复调用
  4. 模块化设计:将复杂任务拆分为多个Chain
  5. 错误处理:使用handle_parsing_errors=True处理解析错误
  6. 流式输出:对于长文本生成使用流式输出提升用户体验

DON’T(避免做法)

  1. 不要过度使用Agent:简单任务直接用Chain更高效
  2. 不要忽略Token限制:注意Prompt长度和Memory大小
  3. 不要硬编码Prompt:使用PromptTemplate提高可维护性
  4. 不要忽略错误处理:生产环境必须添加完善的错误处理
  5. 不要过度依赖LLM:能直接用工具解决的问题不要调用LLM

5.12 LangChain学习路径

学习曲线图

入门
1-2天

基础应用
1周

进阶使用
2-3周

高级定制
1-2月

专家级
3-6月

理解基本概念

掌握核心组件

构建复杂应用

自定义组件

框架贡献

推荐学习顺序
  1. 第1周:基础理解

    • Models和Prompts的使用
    • 简单的Chain构建
    • 基础Memory管理
  2. 第2-3周:核心功能

    • 复杂Chain编排
    • Agent的使用
    • 工具集成
  3. 第4-6周:高级应用

    • RAG系统构建
    • 自定义组件开发
    • 性能优化
  4. 第7-12周:专家级

    • 框架源码理解
    • 自定义扩展开发
    • 最佳实践总结

第六章:LangGraph - 图工作流框架

6.1 什么是LangGraph?

6.1.1 LangGraph定义与定位

LangGraph是LangChain团队开发的图工作流框架,专门用于构建有状态、多参与者的AI应用。它基于图结构来定义和控制Agent的执行流程,支持循环、条件分支和状态管理,是构建复杂AI Agent的理想选择。

LangGraph的核心定位

LangChain

线性Chain

LangGraph

简单任务
顺序执行

复杂Agent
状态机+循环

6.1.2 LangGraph vs LangChain对比
特性LangChainLangGraph
执行模式线性执行图结构执行
状态管理基础支持强大的状态管理
循环支持有限原生支持
条件分支通过Router原生支持
可视化有限完整的图可视化
适用场景简单任务复杂Agent
6.1.3 LangGraph在AI Agent中的关键作用
作用1: 复杂工作流编排

简单

复杂

开始

理解任务

任务类型?

直接执行

分解任务

执行子任务1

执行子任务2

需要迭代?

整合结果

结束

作用2: 状态机管理

LangGraph通过状态机管理Agent的执行状态:

from langgraph.graph import StateGraph, END
from typing import TypedDict

# 定义状态
class AgentState(TypedDict):
    messages: list
    current_step: str
    results: dict

# 创建图
workflow = StateGraph(AgentState)

# 添加节点
workflow.add_node("plan", plan_step)
workflow.add_node("execute", execute_step)
workflow.add_node("review", review_step)

# 添加边和条件
workflow.add_edge("plan", "execute")
workflow.add_conditional_edges(
    "execute",
    should_continue,
    {
        "continue": "execute",
        "review": "review",
        "end": END
    }
)
6.1.4 LangGraph核心概念
1. 状态(State)

State

节点间共享数据

类型安全

可持久化

2. 节点(Nodes)
# 节点是工作流中的执行单元
def my_node(state: AgentState) -> AgentState:
    # 处理逻辑
    state["results"]["step1"] = "completed"
    return state
3. 边(Edges)

无条件边

条件边

True

False

节点A

节点B

节点C

条件判断

节点E

节点F

4. 检查点(Checkpoints)

LangGraph支持检查点,可以暂停和恢复执行:

from langgraph.checkpoint.memory import MemorySaver

# 创建检查点存储
checkpointer = MemorySaver()

# 配置图使用检查点
app = workflow.compile(checkpointer=checkpointer)

# 执行时可以保存和恢复状态
config = {"configurable": {"thread_id": "1"}}
result = app.invoke(initial_state, config)
6.1.5 LangGraph使用示例
示例1: 简单工作流
from langgraph.graph import StateGraph, END
from typing import TypedDict, List

class State(TypedDict):
    messages: List[str]
    step: int

def step1(state: State) -> State:
    return {"messages": state["messages"] + ["Step 1"], "step": 1}

def step2(state: State) -> State:
    return {"messages": state["messages"] + ["Step 2"], "step": 2}

# 构建图
workflow = StateGraph(State)
workflow.add_node("step1", step1)
workflow.add_node("step2", step2)
workflow.set_entry_point("step1")
workflow.add_edge("step1", "step2")
workflow.add_edge("step2", END)

# 编译和执行
app = workflow.compile()
result = app.invoke({"messages": [], "step": 0})
示例2: 带循环的Agent
def should_continue(state: State) -> str:
    if state["step"] >= 5:
        return "end"
    return "continue"

workflow = StateGraph(State)
workflow.add_node("process", process_step)
workflow.set_entry_point("process")
workflow.add_conditional_edges(
    "process",
    should_continue,
    {
        "continue": "process",  # 循环
        "end": END
    }
)
6.1.6 LangGraph性能优势
性能对比
指标LangChain ChainLangGraph提升
复杂工作流难以实现原生支持⬆️ 100%
状态管理手动处理自动管理⬆️ 80%
调试能力有限可视化调试⬆️ 90%
可维护性中等⬆️ 70%
6.1.7 LangGraph最佳实践
✅ 推荐做法
  1. 合理设计状态结构:清晰的状态定义
  2. 使用检查点:支持长时间运行的任务
  3. 可视化调试:利用LangGraph的可视化功能
  4. 错误处理:在节点中添加错误处理逻辑
  5. 测试节点:独立测试每个节点

第七章:Agent深度解析

7.1 Agent架构与类型

7.1.1 Agent定义与核心特征

**AI Agent(人工智能代理)**是一个能够感知环境、做出决策并执行行动的智能系统。在AI Agent技术栈中,它整合了LLM、LangChain、Prompt、RAG和向量数据库等所有组件,形成一个完整的智能应用系统。

AI Agent的核心特征

AI Agent核心特征

自主性
Autonomy

智能决策

反应性
Reactivity

主动性
Proactivity

社会性
Social Ability

完整的AI Agent系统

7.1.2 Agent在项目中的核心价值
价值分析
价值维度说明重要性
智能化自主理解和决策⭐⭐⭐⭐⭐
自动化自动执行复杂任务⭐⭐⭐⭐⭐
可扩展通过工具扩展能力⭐⭐⭐⭐
可追溯可追溯决策过程⭐⭐⭐⭐
可学习从交互中学习改进⭐⭐⭐
AI Agent vs 传统系统对比

AI Agent

智能决策

灵活适应

无限扩展

传统系统

规则驱动

固定流程

有限能力

7.1.3 Agent完整架构
完整架构流程图

用户输入

意图理解
LLM+Prompt

任务规划
LangChain Agent

需要工具?

选择工具
Agent决策

直接生成
LLM

工具库
RAG/计算/API

执行工具

结果整合
LangChain Chain

需要更多处理?

LLM生成答案
Prompt增强

输出答案

向量数据库

记忆系统

7.1.4 Agent组件集成关系
组件协作图

AI Agent系统

LLM
核心引擎

LangChain
编排框架

Prompt
指令设计

RAG
知识增强

向量数据库
知识存储

Memory
记忆管理

Tools
工具集成

用户

输出

7.1.5 Agent工作流程详解
完整工作流程
工具集 向量数据库 RAG系统 LangChain框架 LLM引擎 AI Agent 用户 工具集 向量数据库 RAG系统 LangChain框架 LLM引擎 AI Agent 用户 alt [需要知识检索] alt [需要工具执行] 输入查询 初始化处理流程 理解用户意图 返回理解结果 触发RAG检索 向量相似度搜索 返回相关文档 返回增强上下文 决策使用工具 返回工具选择 执行工具 返回工具结果 整合信息生成答案 返回生成结果 返回最终结果 输出答案
7.1.6 Agent应用场景
典型应用场景

AI Agent应用

智能助手

个人助理

日程管理

信息查询

企业应用

客服机器人

知识库问答

数据分析

开发工具

代码生成

Bug修复

代码审查

内容创作

文章写作

创意生成

内容优化

教育领域

智能辅导

作业批改

学习规划

7.1.7 Agent性能指标
关键性能指标
指标说明目标值
响应时间从输入到输出的时间< 3秒
准确率回答正确的比例> 85%
工具调用准确率正确选择工具的比例> 90%
上下文理解理解多轮对话的能力> 80%
可追溯性可追溯信息来源100%
性能优化策略

性能优化

LLM优化

检索优化

缓存优化

并发优化

模型选择

参数调优

向量索引

检索数量

结果缓存

向量缓存

异步处理

批量处理

7.1.8 Agent最佳实践
✅ 推荐做法
  1. 模块化设计:将功能拆分为独立模块
  2. 错误处理:完善的错误处理和重试机制
  3. 日志记录:详细记录决策过程和结果
  4. 性能监控:监控响应时间和准确率
  5. 用户反馈:收集用户反馈持续改进
  6. 安全控制:限制工具调用权限
❌ 避免做法
  1. 过度依赖LLM:能用规则解决的问题不用LLM
  2. 忽略成本:不注意Token消耗和API调用成本
  3. 缺乏验证:不对输出结果进行验证
  4. 工具滥用:不必要地调用工具
  5. 缺乏监控:不监控系统性能和错误
Agent决策循环
工具库 LLM Agent 用户 工具库 LLM Agent 用户 alt [需要工具] [直接回答] 输入问题 分析问题 返回决策 选择工具 执行结果 整合结果 生成答案 生成答案 返回答案
完整架构示意图
┌──────────────────────────────────────────────────────┐
│                  AI Agent 系统                        │
├──────────────────────────────────────────────────────┤
│                                                      │
│  用户输入                                             │
│    ↓                                                 │
│  ┌──────────────┐                                    │
│  │ 意图理解      │ → 分类、提取关键信息                │
│  └──────────────┘                                    │
│    ↓                                                 │
│  ┌──────────────┐                                    │
│  │ 任务规划      │ → 分解任务、选择工具                │
│  └──────────────┘                                    │
│    ↓                                                 │
│  ┌──────────────┐      ┌──────────────┐            │
│  │ 工具执行      │ ←─── │   工具库      │            │
│  │              │      │ - 搜索        │            │
│  │              │      │ - 计算        │            │
│  │              │      │ - RAG检索     │            │
│  └──────────────┘      └──────────────┘            │
│    ↓                                                 │
│  ┌──────────────┐                                    │
│  │ 结果整合      │ → 合并多个工具结果                  │
│  └──────────────┘                                    │
│    ↓                                                 │
│  ┌──────────────┐                                    │
│  │ LLM生成      │ → 生成最终回答                      │
│  └──────────────┘                                    │
│    ↓                                                 │
│  输出答案                                             │
│                                                      │
└──────────────────────────────────────────────────────┘
7.1.9 Agent类型详解
类型1: ReAct Agent

**ReAct (Reasoning + Acting)**是最常用的Agent类型,它通过推理-行动循环来完成任务。

工具 LLM ReAct Agent 用户 工具 LLM ReAct Agent 用户 任务 思考下一步 决策:使用工具X 执行工具X 返回结果 整合结果,继续思考 决策:生成答案 返回结果

特点

  • ✅ 零样本学习能力
  • ✅ 可解释性强
  • ✅ 适合通用任务
类型2: Plan-and-Execute Agent

Plan-and-Execute先制定计划,然后执行计划。

接收任务

制定计划

分解为步骤

执行步骤1

执行步骤2

执行步骤3

整合结果

返回

特点

  • ✅ 适合复杂多步骤任务
  • ✅ 计划可复用
  • ⚠️ 计划可能不准确
类型3: AutoGPT Agent

AutoGPT是自主运行的Agent,可以持续执行任务直到完成。

目标

生成任务列表

执行任务1

完成?

调整计划

执行任务2

所有任务完成?

返回结果

特点

  • ✅ 高度自主
  • ✅ 适合长期任务
  • ⚠️ 可能陷入循环
7.1.10 Agent性能对比
Agent类型适用场景准确率响应时间成本
ReAct通用任务85%2-5秒中等
Plan-and-Execute复杂任务80%5-10秒
AutoGPT长期任务75%10-30秒很高
7.1.11 Agent工具选择策略
工具选择决策树

信息检索

计算

代码执行

知识查询

Agent需要工具

任务类型?

Search工具

Calculator工具

CodeExecutor工具

RAG工具

执行工具


7.2 完整实现代码

from langchain.agents import initialize_agent, AgentType, Tool
from langchain.memory import ConversationBufferMemory
from langchain.chains import RetrievalQA
from langchain.vectorstores import Chroma
from langchain.embeddings import OpenAIEmbeddings
from langchain.llms import OpenAI
from langchain.chat_models import ChatOpenAI
from langchain.prompts import PromptTemplate
import os

class AIAgent:
    """
    完整的AI Agent实现
    """
    def __init__(self, vectorstore_path=None, documents=None):
        """
        初始化AI Agent
        """
        # 1. 初始化LLM
        self.llm = ChatOpenAI(
            model_name="gpt-4",
            temperature=0.7
        )
        
        # 2. 初始化记忆
        self.memory = ConversationBufferMemory(
            memory_key="chat_history",
            return_messages=True
        )
        
        # 3. 初始化RAG系统(如果提供文档)
        self.rag_chain = None
        if documents or vectorstore_path:
            self._setup_rag(documents, vectorstore_path)
        
        # 4. 定义工具
        self.tools = self._create_tools()
        
        # 5. 创建Agent
        self.agent = initialize_agent(
            tools=self.tools,
            llm=self.llm,
            agent=AgentType.CONVERSATIONAL_REACT_DESCRIPTION,
            memory=self.memory,
            verbose=True,
            handle_parsing_errors=True
        )
    
    def _setup_rag(self, documents=None, vectorstore_path=None):
        """
        设置RAG系统
        """
        embeddings = OpenAIEmbeddings()
        
        if vectorstore_path and os.path.exists(vectorstore_path):
            # 加载已存在的向量存储
            vectorstore = Chroma(
                persist_directory=vectorstore_path,
                embedding_function=embeddings
            )
        elif documents:
            # 创建新的向量存储
            from langchain.text_splitter import RecursiveCharacterTextSplitter
            
            text_splitter = RecursiveCharacterTextSplitter(
                chunk_size=1000,
                chunk_overlap=200
            )
            chunks = text_splitter.split_documents(documents)
            
            vectorstore = Chroma.from_documents(
                documents=chunks,
                embedding=embeddings,
                persist_directory=vectorstore_path or "./chroma_db"
            )
        else:
            return
        
        # 创建RAG链
        retriever = vectorstore.as_retriever(search_kwargs={"k": 5})
        
        self.rag_chain = RetrievalQA.from_chain_type(
            llm=self.llm,
            chain_type="stuff",
            retriever=retriever,
            return_source_documents=True
        )
    
    def _create_tools(self):
        """
        创建工具集
        """
        tools = []
        
        # 工具1: RAG检索(如果已设置)
        if self.rag_chain:
            def rag_search(query: str) -> str:
                """从知识库中检索相关信息"""
                result = self.rag_chain({"query": query})
                answer = result["result"]
                sources = [
                    doc.metadata.get("source", "Unknown")
                    for doc in result["source_documents"]
                ]
                return f"答案: {answer}\n来源: {', '.join(sources)}"
            
            tools.append(Tool(
                name="KnowledgeBase",
                func=rag_search,
                description="从知识库中检索相关信息。输入应该是具体的问题。"
            ))
        
        # 工具2: 计算器
        def calculator(expression: str) -> str:
            """执行数学计算"""
            try:
                result = eval(expression)
                return str(result)
            except Exception as e:
                return f"计算错误: {str(e)}"
        
        tools.append(Tool(
            name="Calculator",
            func=calculator,
            description="执行数学计算。输入应该是数学表达式,如 '2+2' 或 '10*5'。"
        ))
        
        # 工具3: Python代码执行
        from langchain.tools import PythonREPLTool
        tools.append(PythonREPLTool())
        
        return tools
    
    def chat(self, message: str):
        """
        与Agent对话
        """
        response = self.agent.run(input=message)
        return response
    
    def reset_memory(self):
        """
        重置记忆
        """
        self.memory.clear()

# 使用示例
if __name__ == "__main__":
    # 创建Agent
    agent = AIAgent()
    
    # 对话
    response1 = agent.chat("你好,我是张三")
    print(f"Agent: {response1}")
    
    response2 = agent.chat("我的名字是什么?")
    print(f"Agent: {response2}")
    
    response3 = agent.chat("请计算 123 * 456")
    print(f"Agent: {response3}")

7.3 高级功能实现

功能1: 多Agent协作
from langchain.agents import AgentExecutor
from langchain.agents.conversational_chat.base import ConversationalChatAgent

class MultiAgentSystem:
    """
    多Agent协作系统
    """
    def __init__(self):
        # Agent 1: 研究Agent
        self.research_agent = self._create_research_agent()
        
        # Agent 2: 写作Agent
        self.writing_agent = self._create_writing_agent()
        
        # Agent 3: 审核Agent
        self.review_agent = self._create_review_agent()
    
    def _create_research_agent(self):
        """创建研究Agent"""
        # 实现研究功能
        pass
    
    def _create_writing_agent(self):
        """创建写作Agent"""
        # 实现写作功能
        pass
    
    def _create_review_agent(self):
        """创建审核Agent"""
        # 实现审核功能
        pass
    
    def process(self, task):
        """
        多Agent协作处理任务
        """
        # 1. 研究Agent收集信息
        research_result = self.research_agent.run(task)
        
        # 2. 写作Agent生成内容
        writing_result = self.writing_agent.run(research_result)
        
        # 3. 审核Agent审核内容
        review_result = self.review_agent.run(writing_result)
        
        return review_result
功能2: 流式输出
from langchain.callbacks.streaming_stdout import StreamingStdOutCallbackHandler

class StreamingAgent(AIAgent):
    """
    支持流式输出的Agent
    """
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        
        # 重新创建支持流式的LLM
        self.llm = ChatOpenAI(
            model_name="gpt-4",
            temperature=0.7,
            streaming=True,
            callbacks=[StreamingStdOutCallbackHandler()]
        )
        
        # 重新创建Agent
        self.agent = initialize_agent(
            tools=self.tools,
            llm=self.llm,
            agent=AgentType.CONVERSATIONAL_REACT_DESCRIPTION,
            memory=self.memory,
            verbose=True
        )
功能3: 错误处理和重试
from langchain.callbacks import CallbackManager
from langchain.callbacks.retry import RetryCallbackHandler

class RobustAgent(AIAgent):
    """
    具有错误处理和重试机制的Agent
    """
    def __init__(self, *args, **kwargs):
        # 设置重试回调
        retry_handler = RetryCallbackHandler(
            retries=3,
            backoff_factor=2
        )
        
        callback_manager = CallbackManager([retry_handler])
        
        # 创建带重试的LLM
        self.llm = ChatOpenAI(
            model_name="gpt-4",
            temperature=0.7,
            callback_manager=callback_manager
        )
        
        super().__init__(*args, **kwargs)
    
    def chat(self, message: str):
        """
        带错误处理的对话
        """
        try:
            return super().chat(message)
        except Exception as e:
            return f"抱歉,处理请求时出现错误: {str(e)}。请重试。"

7.4 性能优化

优化1: 缓存
from langchain.cache import InMemoryCache
from langchain.globals import set_llm_cache

# 启用缓存
set_llm_cache(InMemoryCache())

# 或者使用Redis缓存
from langchain.cache import RedisCache
import redis

redis_client = redis.Redis()
set_llm_cache(RedisCache(redis_client))
优化2: 异步处理
import asyncio

class AsyncAgent(AIAgent):
    """
    异步Agent
    """
    async def achat(self, message: str):
        """
        异步对话
        """
        response = await self.agent.arun(input=message)
        return response
    
    async def abatch_chat(self, messages: list):
        """
        批量异步处理
        """
        tasks = [self.achat(msg) for msg in messages]
        responses = await asyncio.gather(*tasks)
        return responses

# 使用
async def main():
    agent = AsyncAgent()
    responses = await agent.abatch_chat([
        "问题1",
        "问题2",
        "问题3"
    ])
    return responses

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐