28天Agent开发学习路线(2026年最新版)

28天Agent开发学习路线(2026年最新版)


目录

  1. 第1-3天:Agent基本概念(#第1-3天agent基本概念)

  2. 第4-7天:工具调用与技能(#第4-7天工具调用与技能)

  3. 第8-11天:记忆机制(#第8-11天记忆机制)

  4. 第12-15天:上下文工程(#第12-15天上文工程)

  5. 第16-20天:检索增强RAG(#第16-20天检索增强rag)

  6. 第21-23天:多智能体协作(#第21-23天多智能体协作)

  7. 第24-26天:协议与框架(#第24-26天协议与框架)

  8. 第27-28天:项目实战(#第27-28天项目实战)


第1-3天:Agent基本概念

1.1 什么是AI Agent

**AI Agent定义:**

AI Agent是一个能够感知环境、进行推理、做出决策并执行行动的智能系统。

**核心组成:**

  • **感知模块**:获取环境信息

  • **推理模块**:基于LLM进行思考决策

  • **行动模块**:执行工具调用或输出结果

  • **记忆模块**:存储和检索历史信息

**简单示例:**

```python

from langchain_openai import ChatOpenAI

from langchain_core.prompts import ChatPromptTemplate

创建基础Agent

class SimpleAgent:

def init(self):

self.llm = ChatOpenAI(model="gpt-4o")

self.prompt = ChatPromptTemplate.from_messages([

("system", "你是一个乐于助人的AI助手"),

("user", "{input}")

])

def run(self, input_text):

chain = self.prompt | self.llm

response = chain.invoke({"input": input_text})

return response.content

使用

agent = SimpleAgent()

print(agent.run("你好!"))

```

1.2 Agent vs Workflow

| 特性 | Agent | Workflow |

|------|-------|----------|

| **决策方式** | 动态推理 | 预设流程 |

| **灵活性** | 高 | 低 |

| **适用场景** | 复杂任务、探索性工作 | 重复性任务、固定流程 |

| **学习能力** | 自适应 | 需人工配置 |

1.3 单Agent vs Multi-Agent

**单Agent:**

```python

单Agent架构

class SingleAgent:

def init(self):

self.llm = ChatOpenAI(model="gpt-4o")

def solve(self, task):

return self.llm.invoke(task).content

```

**Multi-Agent:**

```python

Multi-Agent架构(简化版)

class MultiAgentSystem:

def init(self):

self.agents = {

"researcher": ResearchAgent(),

"analyst": AnalysisAgent(),

"writer": WritingAgent()

}

def execute(self, task):

研究阶段

research_result = self.agents"researcher".run(task)

分析阶段

analysis_result = self.agents"analyst".run(research_result)

写作阶段

final_output = self.agents"writer".run(analysis_result)

return final_output

```

1.4 Agent运行流程

```

┌─────────────────────────────────────────────────────────────┐

│ Agent运行流程 │

├─────────────────────────────────────────────────────────────┤

│ 用户输入 → 解析任务 → 计划制定 → 工具调用 → 结果汇总 → 输出 │

│ │

│ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ │

│ │ 输入 │ → │ 解析 │ → │ 计划 │ → │ 执行 │ → │ 输出 │ │

│ └──────┘ └──────┘ └──────┘ └──────┘ └──────┘ │

│ ↓ ↓ │

│ ┌──────┐ ┌──────┐ │

│ │ 记忆 │ │ 工具 │ │

│ └──────┘ └──────┘ │

└─────────────────────────────────────────────────────────────┘

```


第4-7天:工具调用与技能

2.1 Tool Calling基础

**定义工具:**

```python

from langchain_core.tools import tool

from langchain_openai import ChatOpenAI

from langchain.agents import create_agent, AgentExecutor

from langchain_core.prompts import ChatPromptTemplate

@tool

def get_weather(city: str) -> str:

"""获取指定城市的天气信息"""

return f"{city} 天气晴朗,温度25°C"

@tool

def search_web(query: str) -> str:

"""搜索网络信息"""

return f"搜索结果:关于'{query}'的最新信息"

创建Agent

llm = ChatOpenAI(model="gpt-4o")

prompt = ChatPromptTemplate.from_messages([

("system", "使用提供的工具回答问题"),

("user", "{input}"),

("agent_info", "{agent_info}")

])

agent = create_agent(llm, get_weather, search_web, prompt=prompt)

agent_executor = AgentExecutor(agent=agent, tools=get_weather, search_web)

执行

result = agent_executor.invoke({"input": "北京的天气怎么样?"})

print(result"output")

```

2.2 Function Calling

**OpenAI函数调用:**

```python

from langchain_openai import ChatOpenAI

llm = ChatOpenAI(model="gpt-4o")

定义函数

functions = [

{

"name": "get_weather",

"description": "获取天气信息",

"parameters": {

"type": "object",

"properties": {

"city": {"type": "string", "description": "城市名称"}

},

"required": "city"

}

}

]

绑定函数

llm_with_func = llm.bind(functions=functions)

response = llm_with_func.invoke("上海天气")

print(response)

```

2.3 MCP协议(Model Context Protocol)

**MCP标准工具定义:**

```python

from mcpsdk import Tool, ToolParameter

MCP格式定义工具

weather_tool = Tool(

name="get_weather",

description="获取天气信息",

parameters=[

ToolParameter(

name="city",

type="string",

description="城市名称",

required=True

)

]

)

MCP工具调用

async def call_mcp_tool(tool, params):

通过MCP协议调用工具

result = await mcp_client.call_tool(tool.name, params)

return result

```


第8-11天:记忆机制

3.1 Short-Term Memory

**对话历史管理:**

```python

from langchain_openai import ChatOpenAI

from langchain_core.messages import AIMessage, HumanMessage

class ShortTermMemoryAgent:

def init(self):

self.llm = ChatOpenAI(model="gpt-4o")

self.history = \[\]

def chat(self, message):

添加用户消息到历史

self.history.append(HumanMessage(content=message))

调用LLM

response = self.llm.invoke(self.history)

添加AI回复到历史

self.history.append(AIMessage(content=response.content))

限制历史长度(避免token超限)

if len(self.history) > 20:

self.history = self.history-10:

return response.content

使用

agent = ShortTermMemoryAgent()

print(agent.chat("你好"))

print(agent.chat("还记得我是谁吗?"))

```

3.2 Long-Term Memory

**向量记忆系统:**

```python

from langchain_openai import OpenAIEmbeddings

from langchain_community.vectorstores import Chroma

class LongTermMemory:

def init(self):

self.embeddings = OpenAIEmbeddings()

self.vector_store = Chroma(

collection_name="agent_memory",

embedding_function=self.embeddings,

persist_directory="./memory_db"

)

def add_memory(self, content, metadata=None):

self.vector_store.add_texts(content, metadatas=metadata if metadata else None)

self.vector_store.persist()

def retrieve_memory(self, query, k=3):

results = self.vector_store.similarity_search(query, k=k)

return doc.page_content for doc in results

使用

memory = LongTermMemory()

memory.add_memory("用户喜欢科技类话题")

memory.add_memory("用户住在北京")

print(memory.retrieve_memory("用户的兴趣"))

```

3.3 Memory压缩

**记忆压缩技术:**

```python

from langchain_openai import ChatOpenAI

from langchain_core.prompts import ChatPromptTemplate

class MemoryCompressor:

def init(self):

self.llm = ChatOpenAI(model="gpt-4o")

self.prompt = ChatPromptTemplate.from_template(

"压缩以下对话历史,保留关键信息:\n{history}\n\n压缩结果:"

)

def compress(self, history):

chain = self.prompt | self.llm

compressed = chain.invoke({"history": history})

return compressed.content

使用

compressor = MemoryCompressor()

long_history = "用户:你好...(1000字对话)"

compressed = compressor.compress(long_history)

print(compressed)

```


第12-15天:上下文工程

4.1 Prompt Engineering

**有效提示设计:**

```python

from langchain_core.prompts import ChatPromptTemplate

结构化提示

prompt = ChatPromptTemplate.from_messages([

("system", """你是专业的数据分析师,遵循以下步骤:

  1. 分析用户问题

  2. 识别关键数据需求

  3. 提供清晰的分析框架

  4. 使用结构化输出"""),

("user", "{question}")

])

带有示例的提示(Few-shot)

few_shot_prompt = ChatPromptTemplate.from_messages([

("system", "根据例子回答问题"),

("human", "2+2=?"),

("ai", "4"),

("human", "3*5=?"),

("ai", "15"),

("human", "{question}"),

("ai", "")

])

```

4.2 Context Window管理

**上下文窗口管理策略:**

```python

class ContextManager:

def init(self, max_tokens=4096):

self.max_tokens = max_tokens

self.context = \[\]

def add_message(self, role, content):

message = {"role": role, "content": content}

self.context.append(message)

检查token数量

total_tokens = self._count_tokens()

while total_tokens > self.max_tokens and len(self.context) > 1:

移除最早的非系统消息

self.context.pop(1) # 保留系统消息(索引0)

total_tokens = self._count_tokens()

def _count_tokens(self):

简化的token计数

return sum(len(msg"content") // 4 for msg in self.context)

def get_context(self):

return self.context

使用

manager = ContextManager()

manager.add_message("system", "你是助手")

manager.add_message("user", "问题1")

manager.add_message("assistant", "回答1")

... 添加更多消息

```

4.3 历史消息裁剪

**智能裁剪策略:**

```python

def smart_truncate_history(history, max_tokens=8192):

"""

智能裁剪历史消息,保留重要信息

"""

total_tokens = 0

preserved = \[\]

从后往前遍历

for msg in reversed(history):

msg_tokens = len(msg.content) // 4

if total_tokens + msg_tokens <= max_tokens:

preserved.insert(0, msg)

total_tokens += msg_tokens

else:

对长消息进行裁剪

if msg_tokens > max_tokens:

只保留消息的开头和结尾

max_chars = max_tokens * 4

truncated = msg.content:max_chars//2 + "..." + msg.content-max_chars//2:

preserved.insert(0, type(msg)(content=truncated))

break

return preserved

```


第16-20天:检索增强RAG

5.1 Embedding与向量化

**向量化基础:**

```python

from langchain_openai import OpenAIEmbeddings

创建嵌入模型

embeddings = OpenAIEmbeddings(

model="text-embedding-3-small",

dimensions=1536

)

生成向量

text = "AI Agent是一种智能系统"

vector = embeddings.embed_query(text)

print(f"向量维度:{len(vector)}")

print(f"向量前10个值:{vector:10}")

```

5.2 Chunking策略

**文档分割:**

```python

from langchain_text_splitters import RecursiveCharacterTextSplitter

创建分割器

text_splitter = RecursiveCharacterTextSplitter(

chunk_size=500,

chunk_overlap=50,

separators="\\n\\n", "\\n", "。", "!", "?", " ", ""

)

分割文档

document = """人工智能(Artificial Intelligence,AI)...(长文档)"""

chunks = text_splitter.split_text(document)

print(f"分割成 {len(chunks)} 个片段")

```

5.3 Retrieval检索

**完整RAG流程:**

```python

from langchain_openai import ChatOpenAI, OpenAIEmbeddings

from langchain_community.document_loaders import TextLoader

from langchain_text_splitters import RecursiveCharacterTextSplitter

from langchain_community.vectorstores import Chroma

from langchain_core.prompts import ChatPromptTemplate

from langchain_core.runnables import RunnablePassthrough

from langchain_core.output_parsers import StrOutputParser

1. 加载文档

loader = TextLoader("knowledge.txt")

docs = loader.load()

2. 分割

text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)

split_docs = text_splitter.split_documents(docs)

3. 向量化存储

embeddings = OpenAIEmbeddings()

vector_store = Chroma.from_documents(split_docs, embeddings)

4. 创建检索器

retriever = vector_store.as_retriever(k=4)

5. 构建RAG链

prompt = ChatPromptTemplate.from_messages([

("system", "使用以下上下文回答问题:\n{context}"),

("user", "{question}")

])

llm = ChatOpenAI(model="gpt-4o")

rag_chain = (

{"context": retriever, "question": RunnablePassthrough()}

| prompt

| llm

| StrOutputParser()

)

6. 查询

result = rag_chain.invoke("什么是AI Agent?")

print(result)

```

5.4 Rerank重排序

**Cross-Encoder重排序:**

```python

from langchain_community.cross_encoders import CrossEncoderReranker

创建重排序器

reranker = CrossEncoderReranker(

model_name="cross-encoder/ms-marco-MiniLM-L-6-v2"

)

先检索,再重排序

retrieved_docs = retriever.get_relevant_documents(query)

reranked_docs = reranker.rerank(query, retrieved_docs, top_n=3)

```


第21-23天:多智能体协作

6.1 Multi-Agent基础架构

**角色定义:**

```python

from langchain_openai import ChatOpenAI

from langchain_core.prompts import ChatPromptTemplate

class AgentRole:

def init(self, role_name, system_prompt):

self.role_name = role_name

self.llm = ChatOpenAI(model="gpt-4o")

self.prompt = ChatPromptTemplate.from_messages([

("system", system_prompt),

("user", "{input}")

])

def run(self, input_text):

chain = self.prompt | self.llm

response = chain.invoke({"input": input_text})

return response.content

定义不同角色

researcher = AgentRole(

"研究员",

"你是专业研究员,擅长收集和整理信息"

)

analyst = AgentRole(

"分析师",

"你是数据分析专家,擅长分析和总结"

)

writer = AgentRole(

"作家",

"你是专业作家,擅长撰写清晰易懂的报告"

)

```

6.2 Router路由

**任务路由:**

```python

from langchain_core.runnables import RunnableBranch

定义路由条件

router = RunnableBranch(

(lambda x: "研究" in x"task", researcher.run),

(lambda x: "分析" in x"task", analyst.run),

(lambda x: "写" in x"task" or "报告" in x"task", writer.run),

lambda x: f"未知任务类型: {x'task'}"

)

使用

result = router.invoke({"task": "研究AI最新趋势"})

print(result)

```

6.3 Supervisor监督者

**监督者模式:**

```python

class Supervisor:

def init(self):

self.llm = ChatOpenAI(model="gpt-4o")

self.agents = {

"researcher": researcher,

"analyst": analyst,

"writer": writer

}

def assign_task(self, task):

判断应该调用哪个agent

assignment_prompt = ChatPromptTemplate.from_template(

"根据任务判断应该调用哪个agent:{task}\n"

"可选agent:researcher(研究)、analyst(分析)、writer(写作)\n"

"只返回agent名称"

)

chain = assignment_prompt | self.llm

agent_name = chain.invoke({"task": task}).content.strip()

调用对应agent

if agent_name in self.agents:

return self.agentsagent_name.run(task)

else:

return f"无法处理此任务"

使用

supervisor = Supervisor()

result = supervisor.assign_task("分析AI市场报告")

print(result)

```

6.4 Agent通信

**Agent间消息传递:**

```python

class MessagePassing:

@staticmethod

def format_message(sender, receiver, content):

return f"""来自 {sender} 的消息:

{content}

请 {receiver} 处理此信息。

"""

示例:研究员向分析师传递信息

research_result = researcher.run("研究AI趋势")

message = MessagePassing.format_message("研究员", "分析师", research_result)

analysis_result = analyst.run(message)

print(analysis_result)

```


第24-26天:开发框架详解

7.1 LangChain v1.3.0框架详解

**LangChain核心架构:**

LangChain是一个用于构建LLM应用的全面框架,提供了组件化、模块化的开发方式。


🎯 **基本原理(通俗理解)**

**LangChain就像一个"智能管家系统":**

想象你有一个超级智能的管家,他可以:

  • 📝 **理解你的指令**(Prompt模板)

  • 🔧 **使用各种工具**(Tools集成)

  • 💭 **记住之前的对话**(Memory记忆)

  • 🤔 **思考并做决策**(Agents智能体)

  • 🔗 **按流程完成任务**(Chains链式调用)

**核心工作流程:**

```

用户提问 → Prompt模板处理 → LLM理解 →

选择工具执行 → 记忆存储 → 返回结果

```


🔧 **实现逻辑(简单描述)**

**1. 组件化设计(像搭积木)**

  • 每个组件(Models、Prompts、Tools)都是独立的"积木块"

  • 可以自由组合,搭建不同的应用

  • 例如:`Prompt + LLM + Tool = 智能问答系统`

**2. LCEL链式语法(像流水线)**

```python

传统方式(复杂)

result = llm.invoke(prompt.format(question))

LCEL方式(简单,像流水线)

chain = prompt | llm | parser

result = chain.invoke({"question": "..."})

```

  • `|` 操作符就像流水线的传送带

  • 数据自动从一个组件流向下一个组件

**3. Agent决策机制(像人类思考)**

```

观察问题 → 分析需要什么工具 →

调用工具 → 观察结果 →

继续思考或完成任务

```

**4. Memory记忆机制(像笔记本)**

  • 短期记忆:记住最近几轮对话(像便利贴)

  • 长期记忆:存储重要信息到向量数据库(像档案柜)


**核心组件详解:**

1. Models(模型层)

**Models是LangChain的基础,负责与LLM交互。**

**支持的模型类型:**

  • **Chat Models**:对话型模型(GPT-4o、Claude、Gemini)

  • **LLMs**:文本补全模型(旧版API)

  • **Embeddings**:嵌入模型(text-embedding-3-small)

**详细参数解析表:**

| 参数 | 类型 | 默认值 | 说明 | 示例 |

|------|------|--------|------|------|

| `model` | str | "gpt-3.5-turbo" | 模型名称 | "gpt-4o" |

| `temperature` | float | 0.7 | 温度参数(0-2) | 0.0(确定性) |

| `max_tokens` | int | None | 最大输出Token | 4096 |

| `top_p` | float | 1.0 | 核采样参数 | 0.9 |

| `frequency_penalty` | float | 0.0 | 频率惩罚 | 0.5 |

| `presence_penalty` | float | 0.0 | 存在惩罚 | 0.3 |

| `timeout` | int | None | 超时时间(秒) | 30 |

| `api_key` | str | None | API密钥 | os.getenv("KEY") |

| `base_url` | str | None | 自定义API地址 | "https://api.xxx" |

**代码示例:**

```python

from langchain_openai import ChatOpenAI, OpenAIEmbeddings

Chat Model配置

chat_model = ChatOpenAI(

model="gpt-4o",

temperature=0.0, # 确定性输出

max_tokens=4096, # 最大输出长度

timeout=30, # 30秒超时

frequency_penalty=0.5, # 减少重复内容

presence_penalty=0.3 # 鼓励新话题

)

Embedding Model配置

embedding_model = OpenAIEmbeddings(

model="text-embedding-3-small",

dimensions=1536 # 向量维度

)

调用示例

response = chat_model.invoke("你好")

vector = embedding_model.embed_query("AI Agent")

```

2. Prompts(提示模板)

**Prompts负责管理和优化提示词。**

**核心类型:**

  • **ChatPromptTemplate**:对话型提示模板

  • **PromptTemplate**:简单字符串模板

  • **FewShotPromptTemplate**:少样本学习模板

  • **PipelinePromptTemplate**:管道式组合模板

**详细参数解析表:**

| 参数 | 类型 | 说明 | 示例 |

|------|------|------|------|

| `template` | str | 模板字符串 | "你好{name}" |

| `input_variables` | list | 输入变量列表 | "name", "age" |

| `partial_variables` | dict | 预填充变量 | {"name": "张三"} |

| `template_format` | str | 模板格式 | "f-string" / "jinja2" |

| `validate_template` | bool | 是否验证模板 | True |

**代码示例:**

```python

from langchain_core.prompts import ChatPromptTemplate, PromptTemplate

ChatPromptTemplate(推荐)

chat_prompt = ChatPromptTemplate.from_messages([

("system", "你是{role},擅长{skill}"),

("human", "{question}"),

("ai", "{previous_answer}")

])

PromptTemplate(简单场景)

simple_prompt = PromptTemplate(

template="请用{language}翻译:{text}",

input_variables="language", "text"

)

FewShotPromptTemplate(少样本学习)

from langchain_core.prompts import FewShotChatMessagePromptTemplate

examples = [

{"input": "2+2", "output": "4"},

{"input": "3*5", "output": "15"}

]

few_shot_prompt = FewShotChatMessagePromptTemplate(

example_prompt=ChatPromptTemplate.from_messages([

("human", "{input}"),

("ai", "{output}")

]),

examples=examples

)

使用

formatted = chat_prompt.invoke({

"role": "Python专家",

"skill": "编程教学",

"question": "解释装饰器"

})

```

3. Chains(链式调用)

**Chains将多个组件串联成工作流。**

**核心类型:**

  • **LCEL Chain**:使用 `|` 操作符构建(推荐)

  • **Sequential Chain**:顺序执行链

  • **Router Chain**:路由选择链

**LCEL操作符详解:**

| 操作符 | 说明 | 示例 |

|--------|------|------|

| `|` | 链式连接 | `prompt | llm | parser` |

| `RunnablePassthrough` | 透传数据 | `{"query": RunnablePassthrough()}` |

| `RunnableParallel` | 并行执行 | `{"a": chain1, "b": chain2}` |

| `RunnableBranch` | 条件分支 | `branch(condition, chain1, chain2)` |

| `RunnableLambda` | 自定义函数 | `RunnableLambda(lambda x: x.upper())` |

**代码示例:**

```python

from langchain_core.runnables import RunnablePassthrough, RunnableParallel, RunnableLambda

LCEL基础链

chain = prompt | llm | output_parser

RunnablePassthrough(透传)

chain = (

{"context": retriever, "question": RunnablePassthrough()}

| prompt

| llm

)

RunnableParallel(并行)

parallel_chain = RunnableParallel({

"translation": translation_chain,

"summary": summary_chain,

"keywords": keyword_chain

})

RunnableLambda(自定义函数)

def format_output(x):

return f"结果:{x}"

chain = (

prompt

| llm

| RunnableLambda(format_output)

)

RunnableBranch(条件分支)

from langchain_core.runnables import RunnableBranch

branch_chain = RunnableBranch(

(lambda x: "数学" in x, math_chain),

(lambda x: "翻译" in x, translation_chain),

default_chain # 默认分支

)

```

4. Agents(智能代理)

**Agents是动态决策和执行的核心。**

**Agent类型:**

  • **OpenAI Tools Agent**:使用OpenAI工具调用

  • **Structured Chat Agent**:结构化对话Agent

  • **ReAct Agent**:推理-行动循环

  • **Plan-and-Execute Agent**:计划执行Agent

**Agent核心参数:**

| 参数 | 类型 | 说明 | 示例 |

|------|------|------|------|

| `llm` | ChatOpenAI | 语言模型 | ChatOpenAI(model="gpt-4o") |

| `tools` | list | 工具列表 | tool1, tool2 |

| `prompt` | ChatPromptTemplate | 提示模板 | 自定义模板 |

| `agent_type` | str | Agent类型 | "openai-tools" |

| `max_iterations` | int | 最大迭代次数 | 10 |

| `handle_parsing_errors` | bool | 处理解析错误 | True |

**代码示例:**

```python

from langchain.agents import create_agent, AgentExecutor

from langchain_core.tools import tool

定义工具

@tool

def search(query: str) -> str:

"""搜索网络信息"""

return f"搜索结果:{query}"

@tool

def calculate(expression: str) -> str:

"""执行数学计算"""

return str(eval(expression))

创建Agent

llm = ChatOpenAI(model="gpt-4o")

agent = create_agent(llm, search, calculate)

AgentExecutor配置

executor = AgentExecutor(

agent=agent,

tools=search, calculate,

max_iterations=10, # 最大迭代次数

handle_parsing_errors=True, # 处理解析错误

verbose=True, # 显示详细日志

max_execution_time=60 # 最大执行时间(秒)

)

执行

result = executor.invoke({"input": "搜索AI趋势并计算2+3"})

```

5. Memory(记忆管理)

**Memory负责存储和检索对话历史。**

**Memory类型:**

  • **ConversationBufferMemory**:完整对话历史

  • **ConversationBufferWindowMemory**:窗口式记忆

  • **ConversationSummaryMemory**:摘要式记忆

  • **VectorStoreMemory**:向量存储记忆

**详细参数解析表:**

| 参数 | 类型 | 说明 | 示例 |

|------|------|------|------|

| `memory_key` | str | 记忆键名 | "history" |

| `return_messages` | bool | 返回消息对象 | True |

| `max_token_limit` | int | 最大Token限制 | 2000 |

| `k` | int | 窗口大小 | 5 |

| `human_prefix` | str | 用户前缀 | "User" |

| `ai_prefix` | str | AI前缀 | "AI" |

**代码示例:**

```python

from langchain.memory import (

ConversationBufferMemory,

ConversationBufferWindowMemory,

ConversationSummaryMemory

)

ConversationBufferMemory(完整历史)

buffer_memory = ConversationBufferMemory(

memory_key="history",

return_messages=True

)

ConversationBufferWindowMemory(窗口记忆)

window_memory = ConversationBufferWindowMemory(

memory_key="history",

k=5 # 只保留最近5轮对话

)

ConversationSummaryMemory(摘要记忆)

summary_memory = ConversationSummaryMemory(

llm=ChatOpenAI(model="gpt-4o"),

memory_key="history",

max_token_limit=1000

)

使用

memory.save_context({"input": "你好"}, {"output": "你好!"})

history = memory.load_memory_variables({})

print(history"history")

```

6. Tools(工具集成)

**Tools扩展Agent的能力边界。**

**Tool定义方式:**

  • **@tool装饰器**:推荐方式

  • **StructuredTool**:结构化工具

  • **Tool类**:基础工具类

**Tool参数详解:**

| 参数 | 类型 | 说明 | 示例 |

|------|------|------|------|

| `name` | str | 工具名称 | "search" |

| `description` | str | 工具描述 | "搜索网络信息" |

| `func` | callable | 工具函数 | lambda x: search(x) |

| `args_schema` | BaseModel | 参数结构 | SearchArgs |

| `return_direct` | bool | 直接返回结果 | False |

**代码示例:**

```python

from langchain_core.tools import tool, StructuredTool

from pydantic import BaseModel, Field

@tool装饰器(推荐)

@tool

def get_weather(city: str) -> str:

"""获取指定城市的天气

Args:

city: 城市名称(如:北京、上海)

Returns:

天气信息字符串

"""

return f"{city} 天气晴朗,温度25°C"

StructuredTool(复杂参数)

class SearchArgs(BaseModel):

query: str = Field(description="搜索关键词")

num_results: int = Field(default=5, description="返回结果数量")

def search_func(args: SearchArgs) -> str:

return f"搜索'{args.query}',返回{args.num_results}条结果"

search_tool = StructuredTool(

name="search",

description="搜索网络信息",

func=search_func,

args_schema=SearchArgs

)

Tool类(基础方式)

from langchain_core.tools import Tool

basic_tool = Tool(

name="calculator",

description="执行数学计算",

func=lambda x: str(eval(x))

)

```

**基础示例:**

```python

LangChain v1.3.0 基础示例

from langchain_openai import ChatOpenAI

from langchain_core.prompts import ChatPromptTemplate

from langchain_core.output_parsers import StrOutputParser

1. 创建LLM实例

llm = ChatOpenAI(

model="gpt-4o",

temperature=0.7,

api_key="your-api-key"

)

2. 创建提示模板

prompt = ChatPromptTemplate.from_messages([

("system", "你是一个专业的{subject}助手"),

("user", "{question}")

])

3. 创建输出解析器

output_parser = StrOutputParser()

4. 构建LCEL链

chain = prompt | llm | output_parser

5. 执行

result = chain.invoke({

"subject": "Python编程",

"question": "解释什么是装饰器"

})

print(result)

```

**LCEL(LangChain Expression Language):**

```python

from langchain_core.runnables import RunnablePassthrough

LCEL链式构建

chain = (

{"context": retriever, "question": RunnablePassthrough()}

| prompt

| llm

| StrOutputParser()

)

```

**工具调用示例:**

```python

from langchain_core.tools import tool

from langchain.agents import create_agent, AgentExecutor

from langchain_core.prompts import ChatPromptTemplate

定义工具

@tool

def calculate(expression: str) -> str:

"""执行数学计算"""

try:

result = eval(expression)

return str(result)

except Exception as e:

return f"计算错误:{e}"

@tool

def search_browser(query: str) -> str:

"""搜索网页信息"""

return f"搜索结果:关于'{query}'的信息"

创建Agent

llm = ChatOpenAI(model="gpt-4o")

prompt = ChatPromptTemplate.from_messages([

("system", "使用工具回答问题"),

("user", "{input}"),

("agent_info", "{agent_info}")

])

agent = create_agent(llm, calculate, search_browser, prompt=prompt)

executor = AgentExecutor(

agent=agent,

tools=calculate, search_browser,

verbose=True

)

执行

result = executor.invoke({"input": "计算 2+3*5 并搜索相关信息"})

print(result"output")

```

**Memory记忆管理(v1.3.0最新语法):**

```python

from langchain_core.messages import HumanMessage, AIMessage

from langchain_core.runnables import RunnablePassthrough

from langchain_openai import ChatOpenAI

方法1:使用消息列表管理对话历史(推荐)

class ConversationMemory:

def init(self, max_messages=20):

self.messages = \[\]

self.max_messages = max_messages

def add_user_message(self, content):

self.messages.append(HumanMessage(content=content))

self._trim_history()

def add_ai_message(self, content):

self.messages.append(AIMessage(content=content))

self._trim_history()

def _trim_history(self):

if len(self.messages) > self.max_messages:

self.messages = self.messages-self.max_messages:

def get_messages(self):

return self.messages

使用示例

memory = ConversationMemory(max_messages=20)

memory.add_user_message("你好")

memory.add_ai_message("你好!有什么可以帮你的吗?")

memory.add_user_message("我叫张三")

print(memory.get_messages())

方法2:使用LCEL构建带记忆的链(v1.3.0推荐)

llm = ChatOpenAI(model="gpt-4o")

def get_conversation_history(messages):

return "\n".join(f"{m.type}: {m.content}" for m in messages)

memory_chain = (

RunnablePassthrough.assign(

history=lambda x: get_conversation_history(x.get("history", \[\]))

)

| (lambda x: f"对话历史:\n{x'history'}\n\n当前问题:{x'input'}")

| llm

)

执行

result = memory_chain.invoke({

"input": "我叫张三",

"history": HumanMessage(content="你好"), AIMessage(content="你好!")

})

print(result.content)

```

**向量记忆系统(长期记忆):**

```python

from langchain_openai import OpenAIEmbeddings

from langchain_community.vectorstores import Chroma

from langchain_core.documents import Document

class VectorMemory:

def init(self):

self.embeddings = OpenAIEmbeddings()

self.vector_store = Chroma(

collection_name="agent_memory",

embedding_function=self.embeddings,

persist_directory="./memory_db"

)

def add_memory(self, content, metadata=None):

doc = Document(page_content=content, metadata=metadata or {})

self.vector_store.add_documents(doc)

self.vector_store.persist()

def retrieve_memory(self, query, k=3):

results = self.vector_store.similarity_search(query, k=k)

return doc.page_content for doc in results

使用

memory = VectorMemory()

memory.add_memory("用户喜欢科技类话题", {"category": "interest"})

memory.add_memory("用户住在北京", {"category": "location"})

print(memory.retrieve_memory("用户的兴趣爱好"))

```

7.2 LangGraph v1.2.0框架详解

**LangGraph核心概念:**

LangGraph是LangChain的扩展,专门用于构建有状态、多Actor的工作流。


🎯 **基本原理(通俗理解)**

**LangGraph就像一个"智能工厂流水线":**

想象一个现代化的工厂,有多个工作站:

  • 📍 **每个工作站是一个节点**(Node)

  • 🔀 **工作站之间有传送带连接**(Edge)

  • 📊 **每个产品都有状态记录**(State)

  • 🛑 **可以暂停检查质量**(Interrupt)

  • 💾 **生产进度可以保存**(Checkpoint)

**核心工作流程:**

```

输入数据 → 进入状态图 →

经过多个节点处理 →

根据条件选择路径 →

输出结果或继续循环

```


🔧 **实现逻辑(简单描述)**

**1. 状态图设计(像地图导航)**

```python

定义状态(像旅行背包)

class AgentState(TypedDict):

messages: list # 对话记录

current_step: str # 当前位置

result: str # 最终结果

构建图(像绘制地图)

workflow = StateGraph(AgentState)

workflow.add_node("start", start_node) # 起点

workflow.add_node("process", process_node) # 处理站

workflow.add_node("end", end_node) # 终点

```

**2. 条件分支(像路口选择)**

```

到达路口 → 判断条件 →

选择路径A或路径B →

继续前进

```

```python

条件路由(像GPS导航)

workflow.add_conditional_edges(

"router",

check_condition, # 判断函数

{

"path_a": "node_a", # 条件1走A路

"path_b": "node_b" # 条件2走B路

}

)

```

**3. 状态持久化(像游戏存档)**

  • **Checkpoint**:保存当前进度(像游戏存档点)

  • **恢复执行**:从存档点继续(像加载游戏)

  • **断点续传**:中断后可以继续(像下载续传)

**4. 人工介入(像质检环节)**

```python

在关键节点暂停,等待人工确认

app = workflow.compile(

interrupt_before="approval" # 在审批节点前暂停

)

```


**核心组件详解:**

1. StateGraph(状态图)

**StateGraph是LangGraph的核心,管理整个工作流的状态。**

**StateGraph参数详解:**

| 参数 | 类型 | 说明 | 示例 |

|------|------|------|------|

| `state_schema` | TypedDict | 状态定义 | AgentState |

| `input_schema` | TypedDict | 输入定义 | Optional |

| `output_schema` | TypedDict | 输出定义 | Optional |

| `config_schema` | TypedDict | 配置定义 | Optional |

**状态定义详解:**

```python

from typing import TypedDict, Annotated

from operator import add

基础状态定义

class BasicState(TypedDict):

query: str

result: str

使用Annotated的Reducer状态

class ReducerState(TypedDict):

Annotatedlist, add 表示列表会自动合并

messages: Annotatedlist\[str, add]

每个节点返回的list会自动追加到messages

errors: Annotatedlist\[str, add]

复杂状态定义

class ComplexState(TypedDict):

普通字段(每次更新会覆盖)

current_step: str

iteration: int

approved: bool

Reducer字段(自动合并)

history: Annotatedlist\[dict, add]

嵌套状态

metadata: dictstr, str

```

**StateGraph构建流程:**

```python

from langgraph.graph import StateGraph, END

步骤1:定义状态

class WorkflowState(TypedDict):

input: str

processed: bool

output: str

步骤2:创建StateGraph

workflow = StateGraph(WorkflowState)

步骤3:添加节点

workflow.add_node("process", process_node)

workflow.add_node("validate", validate_node)

步骤4:设置入口点

workflow.set_entry_point("process")

步骤5:添加边

workflow.add_edge("process", "validate")

workflow.add_edge("validate", END)

步骤6:编译

app = workflow.compile()

步骤7:执行

result = app.invoke({"input": "test", "processed": False, "output": ""})

```

2. Nodes(节点)

**Nodes是StateGraph中的处理单元,执行具体任务。**

**Node类型:**

  • **Function Node**:普通函数节点

  • **LLM Node**:LLM调用节点

  • **Tool Node**:工具调用节点

  • **Human Node**:人工介入节点

**Node参数详解:**

| 参数 | 类型 | 说明 | 示例 |

|------|------|------|------|

| `name` | str | 节点名称 | "research" |

| `action` | callable | 节点函数 | def process(state) |

| `retry` | int | 重试次数 | 3 |

| `timeout` | TimeoutPolicy | 超时策略 | TimeoutPolicy(60) |

**Node定义示例:**

```python

from langgraph.pregel import TimeoutPolicy

Function Node(基础节点)

def process_node(state: WorkflowState) -> dict:

"""处理节点"""

processed_data = f"Processed: {state'input'}"

return {

"processed": True,

"output": processed_data

}

LLM Node(LLM调用节点)

from langchain_openai import ChatOpenAI

llm = ChatOpenAI(model="gpt-4o")

def llm_node(state: WorkflowState) -> dict:

"""LLM处理节点"""

response = llm.invoke(state"input")

return {"output": response.content}

Tool Node(工具调用节点)

def tool_node(state: WorkflowState) -> dict:

"""工具执行节点"""

result = search_tool.invoke(state"input")

return {"output": result}

添加节点(带超时)

workflow.add_node(

"process",

process_node,

timeout=TimeoutPolicy(

run_timeout=60, # 执行超时60秒

overall_timeout=120 # 总超时120秒

)

)

添加节点(带重试)

workflow.add_node(

"process",

process_node,

retry=3 # 失败后重试3次

)

```

3. Edges(边)

**Edges连接节点,定义工作流路径。**

**Edge类型:**

  • **Normal Edge**:固定连接

  • **Conditional Edge**:条件分支

  • **Dynamic Edge**:动态路由

**Edge参数详解:**

| 方法 | 参数 | 说明 | 示例 |

|------|------|------|------|

| `add_edge` | start, end | 添加固定边 | add_edge("a", "b") |

| `add_conditional_edges` | start, condition, mapping | 条件边 | 见下方示例 |

**Edge定义示例:**

```python

Normal Edge(固定边)

workflow.add_edge("process", "validate")

workflow.add_edge("validate", END)

Conditional Edge(条件边)

def should_continue(state: WorkflowState) -> str:

"""判断是否继续"""

if state"iteration" < 5:

return "continue"

else:

return "end"

workflow.add_conditional_edges(

"process",

should_continue,

{

"continue": "process", # 继续循环

"end": END # 结束

}

)

Dynamic Edge(动态路由)

def route_by_type(state: WorkflowState) -> str:

"""根据类型动态路由"""

query_type = classify_query(state"input")

return query_type

workflow.add_conditional_edges(

"router",

route_by_type,

{

"research": "research_node",

"analysis": "analysis_node",

"write": "write_node"

}

)

```

4. Checkpointer(持久化)

**Checkpointer保存和恢复状态,支持断点续传。**

**Checkpointer类型:**

  • **MemorySaver**:内存保存(开发测试)

  • **PostgresSaver**:PostgreSQL持久化(生产环境)

  • **RedisSaver**:Redis持久化(分布式)

**Checkpointer参数详解:**

| 参数 | 类型 | 说明 | 示例 |

|------|------|------|------|

| `connection` | Connection | 数据库连接 | psycopg2.connect() |

| `table_name` | str | 表名 | "checkpoints" |

| `thread_id` | str | 会话ID | "user_123" |

**Checkpointer使用示例:**

```python

from langgraph.checkpoint.memory import MemorySaver

from langgraph.checkpoint.postgres import PostgresSaver

import psycopg2

MemorySaver(开发测试)

memory_checkpointer = MemorySaver()

app = workflow.compile(checkpointer=memory_checkpointer)

执行并保存状态

result = app.invoke(

{"input": "test"},

config={"configurable": {"thread_id": "session_1"}}

)

恢复状态

restored = app.invoke(

None, # 不传输入,使用保存的状态

config={"configurable": {"thread_id": "session_1"}}

)

PostgresSaver(生产环境)

conn = psycopg2.connect(

host="localhost",

database="langgraph",

user="user",

password="password"

)

postgres_checkpointer = PostgresSaver(conn)

app = workflow.compile(checkpointer=postgres_checkpointer)

执行

result = app.invoke(

{"input": "production"},

config={"configurable": {"thread_id": "user_123"}}

)

```

5. Interrupt(人工介入)

**Interrupt在特定节点暂停,等待人工确认。**

**Interrupt参数详解:**

| 参数 | 类型 | 说明 | 示例 |

|------|------|------|------|

| `interrupt_before` | list | 在节点前暂停 | "approval" |

| `interrupt_after` | list | 在节点后暂停 | "process" |

**Interrupt使用示例:**

```python

在approval节点前暂停

app = workflow.compile(

checkpointer=checkpointer,

interrupt_before="approval" # 在approval节点前暂停

)

第一次执行(会暂停在approval前)

result = app.invoke(

{"input": "test"},

config={"configurable": {"thread_id": "user_123"}}

)

此时状态:current_step = "approval"(暂停)

人工确认后继续执行

result = app.invoke(

None,

config={"configurable": {"thread_id": "user_123"}}

)

```

6. TimeoutPolicy(超时策略)

**TimeoutPolicy控制节点执行时间。**

**TimeoutPolicy参数详解:**

| 参数 | 类型 | 说明 | 示例 |

|------|------|------|------|

| `run_timeout` | int | 单次执行超时(秒) | 60 |

| `overall_timeout` | int | 总超时(秒) | 120 |

| `on_timeout` | str | 超时处理方式 | "raise" / "skip" |

**TimeoutPolicy使用示例:**

```python

from langgraph.pregel import TimeoutPolicy

定义超时策略

timeout_policy = TimeoutPolicy(

run_timeout=60, # 单次执行最多60秒

overall_timeout=120, # 总执行最多120秒

on_timeout="raise" # 超时抛出异常

)

添加节点(带超时)

workflow.add_node(

"long_process",

long_process_node,

timeout=timeout_policy

)

```

**状态图基础示例:**

```python

from langgraph.graph import StateGraph, END

from typing import TypedDict, Annotated

from operator import add

定义状态

class AgentState(TypedDict):

messages: Annotatedlist, add

current_step: str

result: str

定义节点

def node_1(state):

return {"messages": "Node 1 processed", "current_step": "step1"}

def node_2(state):

return {"messages": "Node 2 processed", "current_step": "step2"}

def node_3(state):

return {"messages": "Node 3 processed", "result": "completed"}

构建图

workflow = StateGraph(AgentState)

workflow.add_node("process1", node_1)

workflow.add_node("process2", node_2)

workflow.add_node("finalize", node_3)

添加边

workflow.add_edge("process1", "process2")

workflow.add_edge("process2", "finalize")

workflow.add_edge("finalize", END)

编译

app = workflow.compile()

执行

result = app.invoke({"messages": \[\], "current_step": "start", "result": ""})

print(result)

```

**条件分支示例(v1.2.0最新语法):**

```python

from langgraph.graph import StateGraph, END

from typing import TypedDict

class ConditionalState(TypedDict):

query: str

needs_research: bool

needs_analysis: bool

final_result: str

def check_needs(state: ConditionalState) -> str:

"""路由函数,返回下一个节点的名称"""

query = state"query".lower()

if "分析" in query or "研究" in query:

return "research"

return "direct"

def research_node(state: ConditionalState) -> dict:

return {"needs_research": True, "final_result": "Research completed"}

def direct_node(state: ConditionalState) -> dict:

return {"needs_analysis": False, "final_result": "Direct response"}

def analyze_node(state: ConditionalState) -> dict:

return {"needs_analysis": True, "final_result": "Analysis completed"}

构建工作流

workflow = StateGraph(ConditionalState)

workflow.add_node("router", check_needs)

workflow.add_node("research", research_node)

workflow.add_node("direct", direct_node)

workflow.add_node("analyze", analyze_node)

设置入口点

workflow.set_entry_point("router")

添加条件边(v1.2.0最新语法)

workflow.add_conditional_edges(

"router",

check_needs,

{

"research": "research",

"direct": "direct"

}

)

添加固定边

workflow.add_edge("research", "analyze")

workflow.add_edge("analyze", END)

workflow.add_edge("direct", END)

编译

app = workflow.compile()

执行

result = app.invoke({"query": "分析AI趋势"})

print(result)

```

**持久化和Checkpoint:**

```python

from langgraph.checkpoint.memory import MemorySaver

创建Checkpointer

checkpointer = MemorySaver()

编译时添加Checkpointer

app = workflow.compile(checkpointer=checkpointer)

执行并保存状态

result = app.invoke(

{"query": "分析AI趋势"},

config={"configurable": {"thread_id": "user_123"}}

)

恢复状态

restored = app.invoke(

None, # 不传输入,使用保存的状态

config={"configurable": {"thread_id": "user_123"}}

)

```

7.3 CrewAI框架详解

**CrewAI核心概念:**

CrewAI是一个专注于多Agent协作的框架,通过角色分工实现复杂任务。


🎯 **基本原理(通俗理解)**

**CrewAI就像一个"虚拟团队协作系统":**

想象你组建了一个虚拟团队,每个成员都有明确的角色:

  • 👨‍💼 **研究员**:负责收集信息

  • 📊 **分析师**:负责分析数据

  • ✍️ **作家**:负责撰写报告

  • 🤝 **项目经理**:协调团队工作

**核心工作流程:**

```

定义任务 → 分配给合适的Agent →

Agent执行任务 → 输出结果 →

下一个Agent继续处理 → 最终完成

```


🔧 **实现逻辑(简单描述)**

**1. 角色分工(像公司组织架构)**

```python

每个Agent就像一个员工

researcher = Agent(

role="研究员", # 职位

goal="收集信息", # 工作目标

backstory="专业研究员" # 个人背景

)

```

  • 每个Agent有明确的职责范围

  • 不同Agent擅长不同领域

  • 互相协作完成复杂任务

**2. 任务分配(像项目管理)**

```python

Task就像工作任务

research_task = Task(

description="研究AI趋势", # 任务描述

agent=researcher, # 分配给研究员

context=previous_task # 依赖前置任务

)

```

  • 任务有明确的描述和预期输出

  • 可以设置任务依赖关系

  • 支持顺序执行或并行执行

**3. 团队协作(像团队会议)**

```python

Crew就像团队

crew = Crew(

agents=researcher, analyst, writer,

tasks=task1, task2, task3,

process=Process.sequential # 顺序执行

)

```

**4. 执行流程(像工作流程)**

  • **Sequential**:按顺序执行(像流水线)

  • **Hierarchical**:Manager分配任务(像公司管理)

  • **Parallel**:并行执行(像多人同时工作)


**核心组件详解:**

1. Agent(智能体)

**Agent是CrewAI的核心,定义具有特定角色的智能体。**

**Agent参数详解表:**

| 参数 | 类型 | 必填 | 说明 | 示例 |

|------|------|------|------|------|

| `role` | str | ✓ | 角色名称 | "研究员" |

| `goal` | str | ✓ | 目标描述 | "收集信息" |

| `backstory` | str | ✓ | 背景故事 | "你是专业研究员" |

| `verbose` | bool | ✗ | 详细日志 | True |

| `allow_delegation` | bool | ✗ | 允许委托任务 | False |

| `tools` | list | ✗ | 工具列表 | search_tool |

| `llm` | ChatOpenAI | ✗ | 语言模型 | ChatOpenAI() |

| `max_iter` | int | ✗ | 最大迭代次数 | 15 |

| `max_rpm` | int | ✗ | 每分钟最大请求 | 100 |

| `memory` | bool | ✗ | 启用记忆 | True |

**Agent定义示例:**

```python

from crewai import Agent

from langchain_openai import ChatOpenAI

from langchain_core.tools import tool

定义工具

@tool

def search_tool(query: str) -> str:

"""搜索工具"""

return f"搜索结果:{query}"

创建基础Agent

researcher = Agent(

role="研究员",

goal="收集并整理相关信息",

backstory="你是专业的研究员,擅长收集和分析信息",

verbose=True

)

创建带工具的Agent

tool_agent = Agent(

role="搜索专家",

goal="使用工具搜索信息",

backstory="你是搜索专家,擅长使用各种工具",

tools=search_tool,

verbose=True

)

创建带LLM配置的Agent

custom_llm_agent = Agent(

role="分析师",

goal="深度分析数据",

backstory="你是资深分析师",

llm=ChatOpenAI(

model="gpt-4o",

temperature=0.3

),

max_iter=20, # 最大迭代次数

max_rpm=100 # 每分钟最多100次请求

)

创建可委托任务的Agent

manager_agent = Agent(

role="项目经理",

goal="协调团队成员完成任务",

backstory="你是项目经理,擅长协调团队",

allow_delegation=True, # 允许委托任务给其他Agent

verbose=True

)

创建带记忆的Agent

memory_agent = Agent(

role="客服",

goal="提供优质客户服务",

backstory="你是客服专家",

memory=True, # 启用记忆功能

verbose=True

)

```

2. Task(任务)

**Task定义具体的工作内容和预期输出。**

**Task参数详解表:**

| 参数 | 类型 | 必填 | 说明 | 示例 |

|------|------|------|------|------|

| `description` | str | ✓ | 任务描述 | "研究AI趋势" |

| `expected_output` | str | ✗ | 预期输出 | "500字报告" |

| `agent` | Agent | ✓ | 执行Agent | researcher |

| `tools` | list | ✗ | 任务工具 | search_tool |

| `context` | list | ✗ | 依赖任务 | task1 |

| `async_execution` | bool | ✗ | 异步执行 | False |

| `output_file` | str | ✗ | 输出文件 | "report.md" |

| `callback` | callable | ✗ | 完成回调 | lambda x: print(x) |

**Task定义示例:**

```python

from crewai import Task

基础Task

research_task = Task(

description="研究AI Agent的最新发展趋势",

expected_output="一份包含5个关键趋势的简要报告",

agent=researcher

)

带工具的Task

search_task = Task(

description="搜索AI领域的最新论文",

expected_output="列出10篇重要论文",

agent=researcher,

tools=search_tool

)

带上下文依赖的Task

analysis_task = Task(

description="分析收集到的信息",

expected_output="识别3个关键趋势",

agent=analyst,

context=research_task # 依赖research_task的输出

)

异步执行的Task

async_task = Task(

description="收集市场数据",

expected_output="市场数据报告",

agent=researcher,

async_execution=True # 异步执行

)

输出到文件的Task

file_task = Task(

description="撰写完整报告",

expected_output="Markdown格式报告",

agent=writer,

output_file="ai_trends_report.md" # 输出到文件

)

带回调的Task

def task_callback(output):

print(f"任务完成:{output}")

callback_task = Task(

description="生成摘要",

expected_output="200字摘要",

agent=writer,

callback=task_callback # 完成后调用回调

)

```

3. Crew(团队)

**Crew管理多个Agent和Task,协调执行流程。**

**Crew参数详解表:**

| 参数 | 类型 | 必填 | 说明 | 示例 |

|------|------|------|------|------|

| `agents` | list | ✓ | Agent列表 | researcher, writer |

| `tasks` | list | ✓ | Task列表 | task1, task2 |

| `process` | str | ✗ | 执行流程 | "sequential" |

| `verbose` | bool | ✗ | 详细日志 | True |

| `memory` | bool | ✗ | 团队记忆 | False |

| `manager_llm` | ChatOpenAI | ✗ | 管理LLM | ChatOpenAI() |

| `max_rpm` | int | ✗ | 每分钟最大请求 | 100 |

| `share_agent_output` | bool | ✗ | 共享输出 | False |

**Process执行流程详解:**

| Process类型 | 说明 | 适用场景 |

|-------------|------|----------|

| `sequential` | 顺序执行(默认) | 有依赖关系的任务 |

| `hierarchical` | 层级管理(需要Manager Agent) | 复杂协作任务 |

| `parallel` | 并行执行(无依赖) | 独立任务 |

**Crew定义示例:**

```python

from crewai import Crew, Process

Sequential Process(顺序执行)

sequential_crew = Crew(

agents=researcher, analyst, writer,

tasks=research_task, analysis_task, write_task,

process=Process.sequential, # 顺序执行

verbose=True

)

Hierarchical Process(层级管理)

manager_agent = Agent(

role="项目经理",

goal="协调团队完成任务",

backstory="你是项目经理",

allow_delegation=True

)

hierarchical_crew = Crew(

agents=researcher, analyst, writer,

tasks=research_task, analysis_task, write_task,

process=Process.hierarchical, # 层级管理

manager_llm=ChatOpenAI(model="gpt-4o"), # Manager LLM

verbose=True

)

Parallel Process(并行执行)

parallel_tasks = [

Task(description="搜索新闻", agent=researcher),

Task(description="搜索论文", agent=researcher),

Task(description="搜索市场数据", agent=researcher)

]

parallel_crew = Crew(

agents=researcher,

tasks=parallel_tasks,

process=Process.parallel, # 并行执行

verbose=True

)

带记忆的Crew

memory_crew = Crew(

agents=researcher, writer,

tasks=research_task, write_task,

memory=True, # 启用团队记忆

verbose=True

)

执行Crew

result = crew.kickoff()

print(result)

```

4. Process(执行流程)

**Process定义Agent和Task的执行方式。**

**Process详细对比:**

| 特性 | Sequential | Hierarchical | Parallel |

|------|------------|--------------|----------|

| **执行顺序** | 按Task顺序 | Manager动态分配 | 同时执行 |

| **依赖处理** | 自动处理 | Manager判断 | 无依赖 |

| **适用场景** | 流程化任务 | 复杂协作 | 独立任务 |

| **需要Manager** | 否 | 是 | 否 |

| **输出质量** | 稳定 | 高(有协调) | 快速 |

**Process使用示例(v0.6.0最新语法):**

```python

from crewai import Crew, Process

from langchain_openai import ChatOpenAI

Sequential示例(推荐用于有依赖的任务)

sequential_crew = Crew(

agents=agent1, agent2, agent3,

tasks=task1, task2, task3,

process=Process.sequential # v0.6.0使用字符串或Process.sequential

)

Hierarchical示例(推荐用于复杂协作)

hierarchical_crew = Crew(

agents=agent1, agent2, agent3,

tasks=task1, task2, task3,

process=Process.hierarchical, # 层级管理

manager_llm=ChatOpenAI(model="gpt-4o"), # 指定Manager的LLM

verbose=True

)

Parallel示例(推荐用于独立任务)

parallel_crew = Crew(

agents=agent1, agent2,

tasks=task1, task2, # task1和task2无依赖

process=Process.parallel # 并行执行

)

执行Crew(v0.6.0新语法)

result = crew.kickoff()

print(result)

或者使用异步执行(v0.6.0新语法)

async_result = await crew.kickoff_async()

print(async_result)

```

**CrewAI v0.6.0完整示例:**

```python

from crewai import Agent, Task, Crew

from langchain_openai import ChatOpenAI

from crewai.tools import Tool

定义工具

search_tool = Tool(

name="web_search",

func=lambda x: f"搜索结果:{x}",

description="用于搜索网络信息"

)

创建Agent(v0.6.0语法)

researcher = Agent(

role="高级研究员",

goal="收集{topic}领域的最新信息和趋势",

backstory="""你是一位经验丰富的行业研究员,

擅长收集、整理和分析各类信息。

你的研究以严谨和全面著称。""",

verbose=True,

allow_delegation=True,

tools=search_tool

)

创建Task(v0.6.0语法)

research_task = Task(

description="深入研究{topic}的最新发展趋势",

expected_output="一份详细的研究报告,包含关键发现和数据支持",

agent=researcher,

async_execution=False

)

创建Crew(v0.6.0语法)

crew = Crew(

agents=researcher,

tasks=research_task,

process=Process.sequential,

memory=True, # 启用团队记忆

embedder={

"provider": "openai",

"model": "text-embedding-3-small"

}

)

启动Crew

result = crew.kickoff(inputs={"topic": "人工智能"})

print(result)

```

**基础示例:**

```python

from crewai import Agent, Task, Crew

创建Agent

researcher = Agent(

role="研究员",

goal="收集并整理相关信息",

backstory="你是专业的研究员,擅长收集和分析信息",

verbose=True

)

analyst = Agent(

role="分析师",

goal="深入分析数据并得出结论",

backstory="你是资深分析师,擅长数据分析和洞察",

verbose=True

)

writer = Agent(

role="作家",

goal="撰写清晰易懂的报告",

backstory="你是专业作家,擅长撰写高质量报告",

verbose=True

)

创建Task

research_task = Task(

description="研究AI Agent的最新发展趋势",

agent=researcher

)

analysis_task = Task(

description="分析收集到的信息,识别关键趋势",

agent=analyst,

context=research_task

)

write_task = Task(

description="撰写完整的研究报告",

agent=writer,

context=analysis_task

)

创建Crew

crew = Crew(

agents=researcher, analyst, writer,

tasks=research_task, analysis_task, write_task,

process="sequential" # 顺序执行

)

启动

result = crew.kickoff()

print(result)

```

**并行执行示例:**

```python

并行Task

parallel_tasks = [

Task(description="搜索AI新闻", agent=researcher),

Task(description="搜索市场数据", agent=researcher),

Task(description="搜索技术文档", agent=researcher)

]

crew_parallel = Crew(

agents=researcher,

tasks=parallel_tasks,

process="processes" # 并行执行

)

results = crew_parallel.kickoff()

```

7.4 AutoGen框架详解

**AutoGen核心概念:**

AutoGen是微软开发的多Agent协作框架,支持人机交互和复杂对话。


🎯 **基本原理(通俗理解)**

**AutoGen就像一个"智能聊天室系统":**

想象一个智能聊天室,多个AI助手在里面对话:

  • 💬 **每个Agent是聊天室成员**

  • 🗣️ **Agent之间可以互相对话**

  • 👥 **可以组建群聊(GroupChat)**

  • 🤖 **有管理员协调对话(Manager)**

  • 👨‍💻 **人类可以随时介入(Human-in-the-loop)**

**核心工作流程:**

```

用户提问 → Agent接收 →

思考并回复 → 其他Agent看到 →

继续对话或完成任务

```


🔧 **实现逻辑(简单描述)**

**1. Agent对话机制(像聊天室)**

```python

每个Agent就像聊天室的一个用户

assistant = ConversableAgent(

name="assistant", # 用户名

system_message="你是助手", # 个人简介

llm_config={"model": "gpt-4o"} # 大脑配置

)

Agent之间对话(像私聊)

user_proxy.initiate_chat(

assistant,

message="你好"

)

```

**2. 群聊协作(像多人会议)**

```python

创建群聊(像会议室)

group_chat = GroupChat(

agents=researcher, analyst, writer,

max_round=10 # 最多10轮对话

)

管理员协调(像会议主持人)

manager = GroupChatManager(groupchat=group_chat)

```

**3. 人工介入(像邀请专家)**

```python

Human-in-the-loop(人类可以随时加入)

human_agent = ConversableAgent(

name="human",

human_input_mode="ALWAYS" # 每次都需要人类输入

)

```

**4. 代码执行(像程序员助手)**

```python

Agent可以写代码并执行

coder_agent = ConversableAgent(

name="coder",

code_execution_config={

"work_dir": "coding", # 工作目录

"use_docker": False # 本地执行

}

)

```


**核心组件详解:**

1. ConversableAgent(对话型Agent)

**ConversableAgent是AutoGen的核心Agent类型。**

**ConversableAgent参数详解表:**

| 参数 | 类型 | 必填 | 说明 | 示例 |

|------|------|------|------|------|

| `name` | str | ✓ | Agent名称 | "assistant" |

| `system_message` | str | ✗ | 系统消息 | "你是AI助手" |

| `llm_config` | dict | ✗ | LLM配置 | {"model": "gpt-4o"} |

| `human_input_mode` | str | ✗ | 人工输入模式 | "NEVER" / "ALWAYS" / "TERMINATE" |

| `max_consecutive_auto_reply` | int | ✗ | 最大连续回复 | 10 |

| `is_termination_msg` | callable | ✗ | 终止判断函数 | lambda x: x.endswith("TERMINATE") |

| `code_execution_config` | dict | ✗ | 代码执行配置 | {"work_dir": "coding"} |

| `default_auto_reply` | str | ✗ | 默认自动回复 | "继续" |

**ConversableAgent定义示例(v0.2.0最新语法):**

```python

from autogen import ConversableAgent

基础Agent(v0.2.0语法)

assistant = ConversableAgent(

name="assistant",

system_message="你是一个专业的AI助手",

llm_config={

"model": "gpt-4o",

"api_key": "your-api-key",

"temperature": 0.7,

"max_tokens": 2000

}

)

User Proxy Agent(用户代理)

user_proxy = ConversableAgent(

name="user_proxy",

system_message="你是用户代理,代表用户与助手交互",

human_input_mode="NEVER", # 不需要人工输入

max_consecutive_auto_reply=10, # 最大连续回复10次

is_termination_msg=lambda x: x.get("content", "").rstrip().endswith("TERMINATE")

)

Human-in-the-loop Agent(人工介入)

human_agent = ConversableAgent(

name="human",

system_message="你是人工审核员",

human_input_mode="ALWAYS" # 每次都需要人工输入

)

Code Execution Agent(代码执行)

coder_agent = ConversableAgent(

name="coder",

system_message="你是Python程序员,可以编写和执行代码",

llm_config={"model": "gpt-4o", "api_key": "your-key"},

code_execution_config={

"work_dir": "coding", # 工作目录

"use_docker": False # 不使用Docker

}

)

自定义终止条件的Agent

custom_termination_agent = ConversableAgent(

name="reviewer",

system_message="你是审核员",

is_termination_msg=lambda x: "审核通过" in x.get("content", "")

)

v0.2.0新增:带工具调用的Agent

tool_agent = ConversableAgent(

name="tool_agent",

system_message="你是一个助手,可以调用工具完成任务",

llm_config={"model": "gpt-4o", "api_key": "your-key"},

function_map={

"get_weather": lambda city: f"{city}天气晴朗",

"calculate": lambda expr: str(eval(expr))

}

)

```

2. GroupChat(群聊)

**GroupChat管理多个Agent的群聊协作。**

**GroupChat参数详解表:**

| 参数 | 类型 | 必填 | 说明 | 示例 |

|------|------|------|------|------|

| `agents` | list | ✓ | Agent列表 | agent1, agent2 |

| `messages` | list | ✗ | 消息历史 | \[\] |

| `max_round` | int | ✗ | 最大轮数 | 10 |

| `admin_name` | str | ✗ | 管理员名称 | "Admin" |

| `func_call_filter` | bool | ✗ | 函数调用过滤 | True |

**GroupChat定义示例(v0.2.0最新语法):**

```python

from autogen import GroupChat

基础群聊(v0.2.0语法)

group_chat = GroupChat(

agents=researcher, analyst, writer,

messages=\[\], # 初始消息历史为空

max_round=10 # 最多10轮对话

)

带管理员的群聊

admin_group_chat = GroupChat(

agents=manager, researcher, analyst,

messages=\[\],

max_round=20,

admin_name="Manager" # Manager作为管理员

)

v0.2.0新增:自定义发言人选择

custom_group_chat = GroupChat(

agents=agent1, agent2, agent3,

messages=\[\],

max_round=15,

speaker_selection_method="auto", # 自动选择

allow_repeat_speaker=False # 不允许连续重复发言

)

```

**GroupChatManager定义示例(v0.2.0最新语法):**

```python

from autogen import GroupChatManager

基础管理器

manager = GroupChatManager(

groupchat=group_chat,

llm_config={"model": "gpt-4o", "api_key": "your-key"}

)

带终止条件的管理器

termination_manager = GroupChatManager(

groupchat=group_chat,

is_termination_msg=lambda x: "完成" in x.get("content", "")

)

带LLM配置的管理器

custom_manager = GroupChatManager(

groupchat=group_chat,

llm_config={

"model": "gpt-4o",

"temperature": 0.5,

"max_tokens": 2000

},

max_consecutive_auto_reply=15

)

v0.2.0:创建并启动群聊

result = researcher.initiate_chat(

manager,

message="请协作完成一份AI趋势研究报告"

)

```

4. Human Input Mode(人工输入模式)

**Human Input Mode定义人工介入的方式。**

**Human Input Mode详解:**

| 模式 | 说明 | 适用场景 | 示例 |

|------|------|----------|------|

| `NEVER` | 不需要人工输入 | 自动化任务 | user_proxy |

| `ALWAYS` | 每次都需要人工输入 | 完全人工控制 | human_agent |

| `TERMINATE` | 终止时需要人工输入 | 半自动化任务 | reviewer |

**Human Input Mode使用示例:**

```python

from autogen import ConversableAgent

NEVER模式(完全自动化)

auto_agent = ConversableAgent(

name="auto_agent",

human_input_mode="NEVER"

)

ALWAYS模式(完全人工)

human_agent = ConversableAgent(

name="human_agent",

human_input_mode="ALWAYS"

)

TERMINATE模式(终止时人工介入)

semi_auto_agent = ConversableAgent(

name="semi_auto",

human_input_mode="TERMINATE",

is_termination_msg=lambda x: "需要确认" in x.get("content", "")

)

```

5. Code Execution(代码执行)

**Code Execution允许Agent生成和执行代码。**

**Code Execution参数详解:**

| 参数 | 类型 | 说明 | 示例 |

|------|------|------|------|

| `work_dir` | str | 工作目录 | "coding" |

| `use_docker` | bool | 使用Docker | False |

| `timeout` | int | 执行超时(秒) | 60 |

| `last_n_messages` | int | 检查最近N条消息 | 3 |

**Code Execution使用示例:**

```python

from autogen import ConversableAgent

代码执行Agent

coder = ConversableAgent(

name="coder",

system_message="你是Python程序员,编写和执行代码",

llm_config={"model": "gpt-4o"},

code_execution_config={

"work_dir": "coding", # 代码保存目录

"use_docker": False, # 不使用Docker(本地执行)

"timeout": 60 # 执行超时60秒

}

)

User Proxy(执行代码)

user_proxy = ConversableAgent(

name="user_proxy",

human_input_mode="NEVER",

max_consecutive_auto_reply=10,

code_execution_config={

"work_dir": "coding",

"use_docker": False,

"last_n_messages": 3 # 检查最近3条消息中的代码

}

)

对话并执行代码

user_proxy.initiate_chat(

coder,

message="写一个Python脚本计算斐波那契数列"

)

```

**基础示例:**

```python

from autogen import ConversableAgent, GroupChat, GroupChatManager

创建Agent

assistant = ConversableAgent(

name="assistant",

system_message="你是一个专业的AI助手",

llm_config={"model": "gpt-4o", "api_key": "your-key"}

)

user_proxy = ConversableAgent(

name="user_proxy",

system_message="你是用户代理,代表用户与助手交互",

is_termination_msg=lambda x: x.get("content", "").rstrip().endswith("TERMINATE"),

human_input_mode="NEVER"

)

直接对话

response = user_proxy.initiate_chat(

assistant,

message="解释什么是机器学习"

)

print(response)

```

**群聊协作示例:**

```python

from autogen import GroupChat, GroupChatManager

创建多个Agent

researcher = ConversableAgent(name="researcher", system_message="研究员")

analyst = ConversableAgent(name="analyst", system_message="分析师")

writer = ConversableAgent(name="writer", system_message="作家")

创建群聊

group_chat = GroupChat(

agents=researcher, analyst, writer,

messages=\[\],

max_round=10

)

创建管理器

manager = GroupChatManager(groupchat=group_chat)

启动群聊

result = researcher.initiate_chat(

manager,

message="请协作完成一份AI趋势研究报告"

)

```

7.5 框架对比与选型

| 框架 | 优点 | 缺点 | 适用场景 | 最新版本 |

|------|------|------|----------|----------|

| **LangChain** | 生态完善、组件丰富 | 学习曲线陡 | 通用场景 | v1.3.0 |

| **LangGraph** | 状态管理强大 | 配置复杂 | 复杂工作流 | v1.2.0 |

| **CrewAI** | 角色分明、易上手 | 灵活性受限 | 多角色任务 | v0.6.0 |

| **AutoGen** | 微软支持、人机交互 | 文档较少 | 对话系统 | v0.2.0 |

| **LlamaIndex** | RAG优化、索引强大 | 通用性一般 | 文档检索 | v0.10.0 |

**选型建议:**

```

场景选型指南:

├── 通用应用开发

│ └── LangChain v1.3.0

├── 复杂工作流/状态机

│ └── LangGraph v1.2.0

├── 多角色协作任务

│ └── CrewAI v0.6.0

├── 人机对话/交互系统

│ └── AutoGen v0.2.0

└── 文档检索/RAG应用

└── LlamaIndex v0.10.0

```

7.6 项目案例:智能客服系统

**使用LangChain + CrewAI构建完整客服系统:**

```python

from crewai import Agent, Task, Crew

from langchain_openai import ChatOpenAI

初始化LLM

llm = ChatOpenAI(model="gpt-4o")

创建客服Agent

greeting_agent = Agent(

role="接待员",

goal="友好地问候用户并了解需求",

backstory="你是热情的客服接待员",

llm=llm

)

qa_agent = Agent(

role="问答专家",

goal="准确回答用户问题",

backstory="你是产品专家,熟悉所有产品细节",

llm=llm

)

escalation_agent = Agent(

role="升级处理",

goal="处理复杂问题或投诉",

backstory="你是高级客服,擅长处理棘手问题",

llm=llm

)

创建Task

greeting_task = Task(

description="问候用户并了解咨询内容",

agent=greeting_agent

)

qa_task = Task(

description="回答用户的具体问题",

agent=qa_agent,

context=greeting_task

)

escalation_task = Task(

description="处理无法解决的问题",

agent=escalation_agent,

context=qa_task

)

创建Crew

customer_service_crew = Crew(

agents=greeting_agent, qa_agent, escalation_agent,

tasks=greeting_task, qa_task, escalation_task,

process="sequential"

)

启动客服系统

result = customer_service_crew.kickoff()

print(result)

```

7.7 项目案例:代码审查Agent

**使用LangGraph构建代码审查工作流:**

```python

from langgraph.graph import StateGraph, END

from typing import TypedDict, Annotated

from operator import add

from langchain_openai import ChatOpenAI

class CodeReviewState(TypedDict):

code: str

issues: Annotatedlist, add

suggestions: list

approved: bool

llm = ChatOpenAI(model="gpt-4o")

def lint_node(state):

issues = "缺少类型注解", "函数过长"

return {"issues": issues}

def review_node(state):

prompt = f"审查以下代码问题:{state'issues'}"

response = llm.invoke(prompt)

return {"suggestions": response.content}

def approve_node(state):

approved = len(state"issues") < 3

return {"approved": approved}

workflow = StateGraph(CodeReviewState)

workflow.add_node("lint", lint_node)

workflow.add_node("review", review_node)

workflow.add_node("approve", approve_node)

workflow.add_edge("lint", "review")

workflow.add_edge("review", "approve")

workflow.add_edge("approve", END)

app = workflow.compile()

result = app.invoke({

"code": "def add(a,b):return a+b",

"issues": \[\],

"suggestions": \[\],

"approved": False

})

print(f"审查通过:{result'approved'}")

```

7.8 项目案例:多Agent协作研究助手

**使用多种框架构建研究助手:**

```python

from crewai import Agent, Task, Crew

from langgraph.graph import StateGraph, END

from langchain_openai import ChatOpenAI

CrewAI处理协作

researcher = Agent(

role="研究员",

goal="收集AI领域最新资讯",

backstory="你是AI领域的研究员"

)

writer = Agent(

role="作家",

goal="撰写研究报告",

backstory="你是专业科技作家"

)

LangGraph处理工作流

class ResearchState:

def init(self):

self.topic = ""

self.findings = \[\]

self.report = ""

research_flow = StateGraph(ResearchState)

research_flow.add_node("research", researcher)

research_flow.add_node("write", writer)

research_flow.add_edge("research", "write")

research_flow.add_edge("write", END)

app = research_flow.compile()

执行完整研究流程

result = app.invoke({"topic": "2026年AI发展趋势"})

print(result"report")

```


第24-26天:协议与框架

8.1 MCP协议

**MCP工具注册:**

```python

from mcpsdk import MCPConfig, ToolRegistry

配置MCP

config = MCPConfig(

host="localhost",

port=8080,

api_key="your-api-key"

)

注册工具

registry = ToolRegistry(config)

@registry.register_tool

def get_stock_price(symbol: str) -> str:

"""获取股票价格"""

return f"{symbol} 当前价格:$100"

启动MCP服务

registry.start()

```

8.2 A2A协议(Agent-to-Agent)

**Agent通信协议:**

```python

from a2a_protocol import AgentMessage, MessageType

创建消息

message = AgentMessage(

sender_id="agent-1",

receiver_id="agent-2",

message_type=MessageType.TASK_REQUEST,

content="请分析这份数据",

metadata={"priority": "high"}

)

发送消息

await message.send()

接收消息

received = await AgentMessage.receive("agent-2")

print(received.content)

```

8.3 主流框架对比

| 框架 | 特点 | 适用场景 | 最新版本 |

|------|------|----------|----------|

| **LangChain** | 通用框架,组件丰富 | 大多数场景 | v1.3.0 |

| **LangGraph** | 状态机驱动 | 复杂工作流 | v1.2.0 |

| **AutoGen** | 多Agent协作 | 团队协作场景 | v0.2.0 |

| **CrewAI** | 角色分工 | 多角色任务 | v0.6.0 |

| **LlamaIndex** | RAG优化 | 文档检索 | v0.10.0 |


第27-28天:项目实战

8.1 Coding Agent

**代码生成Agent:**

```python

from langchain_openai import ChatOpenAI

from langchain_core.prompts import ChatPromptTemplate

class CodingAgent:

def init(self):

self.llm = ChatOpenAI(model="gpt-4o")

self.prompt = ChatPromptTemplate.from_messages([

("system", """你是专业Python程序员,遵循以下规则:

  1. 编写清晰、可维护的代码

  2. 添加必要的注释

  3. 处理异常情况

  4. 返回完整的可运行代码"""),

("user", "{request}")

])

def generate_code(self, request):

chain = self.prompt | self.llm

response = chain.invoke({"request": request})

return response.content

使用

coder = CodingAgent()

code = coder.generate_code("写一个Python函数,计算斐波那契数列")

print(code)

```

8.2 Browser Agent

**浏览器自动化Agent:**

```python

from langchain_community.tools import PlaywrightBrowserTool

from langchain_openai import ChatOpenAI

from langchain.agents import create_agent, AgentExecutor

from langchain_core.prompts import ChatPromptTemplate

初始化浏览器工具

browser_tool = PlaywrightBrowserTool()

创建Agent

llm = ChatOpenAI(model="gpt-4o")

prompt = ChatPromptTemplate.from_messages([

("system", "你可以使用浏览器工具访问网页"),

("user", "{input}"),

("agent_info", "{agent_info}")

])

agent = create_agent(llm, browser_tool, prompt=prompt)

agent_executor = AgentExecutor(agent=agent, tools=browser_tool)

执行

result = agent_executor.invoke({"input": "打开百度首页"})

print(result"output")

```

8.3 Deep Research Agent

**深度研究Agent:**

```python

class DeepResearchAgent:

def init(self):

self.llm = ChatOpenAI(model="gpt-4o")

self.search_tool = search_web

self.analysis_tool = analyze_text

def research(self, topic, depth=3):

results = \[\]

for i in range(depth):

搜索相关信息

search_query = f"{topic} 第{i+1}轮搜索"

search_result = self.search_tool.invoke(search_query)

results.append(search_result)

分析结果

analysis = self.analysis_tool.invoke(search_result)

results.append(analysis)

汇总报告

summary_prompt = ChatPromptTemplate.from_template(

"汇总以下研究结果,生成详细报告:\n{results}"

)

chain = summary_prompt | self.llm

report = chain.invoke({"results": "\n".join(results)})

return report.content

使用

researcher = DeepResearchAgent()

report = researcher.research("AI Agent最新进展", depth=3)

print(report)

```

8.4 Workflow Agent

**工作流Agent:**

```python

from langgraph.graph import StateGraph, END

from typing import TypedDict

定义状态

class WorkflowState(TypedDict):

task: str

research_done: bool

analysis_done: bool

report_done: bool

result: str

定义节点

def research_node(state):

研究阶段

result = researcher.run(state"task")

return {"research_done": True, "result": result}

def analysis_node(state):

分析阶段

result = analyst.run(state"result")

return {"analysis_done": True, "result": result}

def write_node(state):

写作阶段

result = writer.run(state"result")

return {"report_done": True, "result": result}

构建工作流

workflow = StateGraph(WorkflowState)

workflow.add_node("research", research_node)

workflow.add_node("analysis", analysis_node)

workflow.add_node("write", write_node)

workflow.add_edge("research", "analysis")

workflow.add_edge("analysis", "write")

workflow.add_edge("write", END)

编译并运行

app = workflow.compile()

result = app.invoke({"task": "AI趋势报告", "research_done": False})

print(result"result")

```


企业级项目实战(新增)

8.5 企业级OA审批Agent系统

📋 项目介绍

**项目背景:**

企业OA(Office Automation)审批流程是企业日常运营的核心环节,涉及请假、报销、采购等多种审批场景。传统审批流程存在效率低、流程复杂、人工干预多等问题。

**解决方案:**

使用LangGraph构建智能审批Agent系统,实现:

  • 🤖 **自动审批决策**:基于规则和AI判断

  • 📊 **流程状态管理**:实时跟踪审批进度

  • 👨‍💼 **人工介入机制**:关键节点人工确认

  • 📝 **审批记录存储**:完整审批历史

  • 🔔 **通知提醒系统**:自动发送审批通知

🏗️ 技术架构

**架构设计:**

```

用户提交申请 → 审批Agent接收 →

规则引擎判断 → AI辅助决策 →

(需要人工?)→ 自动审批或人工审批 →

通知相关人员 → 记录审批结果

```

**核心技术栈:**

  • **LangGraph v1.2.0**:状态图管理审批流程

  • **LangChain v1.3.0**:LLM决策和工具调用

  • **PostgreSQL**:审批记录持久化

  • **Redis**:实时状态缓存

💻 完整代码实现

**1. 状态定义:**

```python

from typing import TypedDict, Annotated

from operator import add

from langgraph.graph import StateGraph, END

from langgraph.checkpoint.postgres import PostgresSaver

from langgraph.pregel import TimeoutPolicy

from langchain_openai import ChatOpenAI

from langchain_core.tools import tool

from langchain_core.prompts import ChatPromptTemplate

import psycopg2

from datetime import datetime

审批状态定义

class ApprovalState(TypedDict):

"""OA审批系统状态"""

application_id: str # 申请ID

applicant: str # 申请人

application_type: str # 申请类型(请假/报销/采购)

application_data: dict # 申请详情

current_approver: str # 当前审批人

approval_level: int # 审批层级(1-3级)

auto_approved: bool # 是否自动审批

needs_human_review: bool # 是否需要人工审核

approval_result: str # 审批结果(approved/rejected/pending)

approval_history: Annotatedlist\[dict, add] # 审批历史

notifications: Annotatedlist\[str, add] # 通知记录

errors: Annotatedlist\[str, add] # 错误记录

```

**2. 工具定义:**

```python

审批规则工具

@tool

def check_approval_rules(application_type: str, amount: float, days: int) -> dict:

"""检查审批规则

Args:

application_type: 申请类型(请假/报销/采购)

amount: 金额(报销/采购)

days: 天数(请假)

Returns:

审批规则结果(是否自动审批、审批层级)

"""

rules = {

"请假": {

"auto_threshold": 3, # 3天以下自动审批

"levels": {1: 3, 2: 7, 3: 30} # 审批层级对应天数

},

"报销": {

"auto_threshold": 500, # 500元以下自动审批

"levels": {1: 500, 2: 2000, 3: 10000}

},

"采购": {

"auto_threshold": 1000, # 1000元以下自动审批

"levels": {1: 1000, 2: 5000, 3: 20000}

}

}

rule = rules.get(application_type)

if not rule:

return {"error": "未知的申请类型"}

判断是否自动审批

threshold = rule"auto_threshold"

value = amount if application_type in "报销", "采购" else days

auto_approved = value <= threshold

确定审批层级

level = 1

for l, threshold in rule"levels".items():

if value <= threshold:

level = l

break

return {

"auto_approved": auto_approved,

"approval_level": level,

"needs_human_review": not auto_approved

}

通知工具

@tool

def send_notification(recipient: str, message: str, notification_type: str) -> str:

"""发送审批通知

Args:

recipient: 接收人

message: 通知内容

notification_type: 通知类型(email/sms/app)

Returns:

通知发送结果

"""

实际应用中集成邮件/短信/APP推送

timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")

notification_record = f"{timestamp} 发送{notification_type}通知给{recipient}: {message}"

return notification_record

记录审批工具

@tool

def record_approval(application_id: str, approver: str, result: str, comment: str) -> str:

"""记录审批结果

Args:

application_id: 申请ID

approver: 审批人

result: 审批结果

comment: 审批意见

Returns:

记录结果

"""

timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")

record = {

"timestamp": timestamp,

"approver": approver,

"result": result,

"comment": comment

}

return f"审批记录已保存:{record}"

```

**3. Agent节点定义:**

```python

初始化LLM

llm = ChatOpenAI(model="gpt-4o", temperature=0.3)

规则检查节点

def rule_check_node(state: ApprovalState) -> dict:

"""规则检查节点"""

app_type = state"application_type"

app_data = state"application_data"

获取申请参数

amount = app_data.get("amount", 0)

days = app_data.get("days", 0)

调用规则工具

rule_result = check_approval_rules.invoke({

"application_type": app_type,

"amount": amount,

"days": days

})

return {

"auto_approved": rule_result.get("auto_approved", False),

"approval_level": rule_result.get("approval_level", 1),

"needs_human_review": rule_result.get("needs_human_review", True)

}

AI辅助决策节点

def ai_decision_node(state: ApprovalState) -> dict:

"""AI辅助决策节点"""

prompt = ChatPromptTemplate.from_messages([

("system", """你是企业审批助手,基于以下信息做出审批建议:

申请类型:{application_type}

申请人:{applicant}

申请详情:{application_data}

审批层级:{approval_level}

请分析申请的合理性,给出审批建议(approved/rejected)和理由。"""),

("user", "请给出审批建议")

])

chain = prompt | llm

response = chain.invoke({

"application_type": state"application_type",

"applicant": state"applicant",

"application_data": str(state"application_data"),

"approval_level": state"approval_level"

})

解析AI建议

ai_suggestion = response.content

简单解析(实际应用中需要更复杂的解析逻辑)

if "批准" in ai_suggestion or "approved" in ai_suggestion.lower():

result = "approved"

elif "拒绝" in ai_suggestion or "rejected" in ai_suggestion.lower():

result = "rejected"

else:

result = "pending"

return {

"approval_result": result,

"approval_history": [{

"approver": "AI系统",

"result": result,

"comment": ai_suggestion,

"timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S")

}]

}

自动审批节点

def auto_approval_node(state: ApprovalState) -> dict:

"""自动审批节点"""

自动批准

result = "approved"

comment = "系统自动审批通过"

记录审批

record = record_approval.invoke({

"application_id": state"application_id",

"approver": "系统自动审批",

"result": result,

"comment": comment

})

发送通知

notification = send_notification.invoke({

"recipient": state"applicant",

"message": f"您的{state'application_type'}申请已自动审批通过",

"notification_type": "app"

})

return {

"approval_result": result,

"approval_history": [{

"approver": "系统自动审批",

"result": result,

"comment": comment,

"timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S")

}],

"notifications": notification

}

人工审批节点(暂停等待人工)

def human_approval_node(state: ApprovalState) -> dict:

"""人工审批节点"""

发送通知给审批人

notification = send_notification.invoke({

"recipient": state"current_approver",

"message": f"您有新的{state'application_type'}申请需要审批,申请ID:{state'application_id'}",

"notification_type": "email"

})

return {

"notifications": notification,

"approval_result": "pending" # 等待人工审批

}

```

**4. 构建审批工作流:**

```python

构建状态图

workflow = StateGraph(ApprovalState)

添加节点

workflow.add_node("rule_check", rule_check_node)

workflow.add_node("ai_decision", ai_decision_node)

workflow.add_node("auto_approval", auto_approval_node)

workflow.add_node("human_approval", human_approval_node)

设置入口点

workflow.set_entry_point("rule_check")

添加条件边(根据审批类型路由)

def route_by_approval_type(state: ApprovalState) -> str:

"""根据审批结果路由"""

if state"auto_approved":

return "auto"

else:

return "human"

workflow.add_conditional_edges(

"rule_check",

route_by_approval_type,

{

"auto": "ai_decision", # 自动审批路径

"human": "human_approval" # 人工审批路径

}

)

AI决策后可以自动审批或继续人工审批

workflow.add_conditional_edges(

"ai_decision",

lambda state: "auto" if state"approval_result" == "approved" else "human",

{

"auto": "auto_approval",

"human": "human_approval"

}

)

所有审批完成后结束

workflow.add_edge("auto_approval", END)

workflow.add_edge("human_approval", END)

创建PostgreSQL Checkpointer

conn = psycopg2.connect(

host="localhost",

database="oa_approval",

user="admin",

password="password"

)

checkpointer = PostgresSaver(conn)

编译工作流(带人工介入)

app = workflow.compile(

checkpointer=checkpointer,

interrupt_before="human_approval" # 在人工审批节点前暂停

)

```

**5. 使用示例:**

```python

提交请假申请(自动审批)

leave_application = {

"application_id": "APP-2026-001",

"applicant": "张三",

"application_type": "请假",

"application_data": {"days": 2, "reason": "个人事务"},

"current_approver": "",

"approval_level": 0,

"auto_approved": False,

"needs_human_review": False,

"approval_result": "",

"approval_history": \[\],

"notifications": \[\],

"errors": \[\]

}

result = app.invoke(leave_application)

print(f"审批结果:{result'approval_result'}")

print(f"审批历史:{result'approval_history'}")

提交报销申请(需要人工审批)

expense_application = {

"application_id": "APP-2026-002",

"applicant": "李四",

"application_type": "报销",

"application_data": {"amount": 5000, "reason": "差旅费用"},

"current_approver": "财务主管",

"approval_level": 0,

"auto_approved": False,

"needs_human_review": False,

"approval_result": "",

"approval_history": \[\],

"notifications": \[\],

"errors": \[\]

}

第一次执行(会暂停在human_approval节点)

result1 = app.invoke(

expense_application,

config={"configurable": {"thread_id": "APP-2026-002"}}

)

人工审批后继续执行(模拟人工审批)

实际应用中,人工审批后更新状态

expense_application"approval_result" = "approved"

expense_application"current_approver" = "财务主管"

result2 = app.invoke(

None, # 不传输入,使用保存的状态

config={"configurable": {"thread_id": "APP-2026-002"}}

)

print(f"人工审批结果:{result2'approval_result'}")

```

🧪 测试用例

**测试用例1:请假自动审批测试**

```python

import unittest

class TestLeaveApproval(unittest.TestCase):

"""请假审批测试"""

def setUp(self):

"""测试初始化"""

self.app = workflow.compile(checkpointer=MemorySaver())

def test_auto_approval_short_leave(self):

"""测试短期请假自动审批"""

2天请假(应自动审批)

application = {

"application_id": "TEST-001",

"applicant": "测试用户",

"application_type": "请假",

"application_data": {"days": 2, "reason": "测试"},

"current_approver": "",

"approval_level": 0,

"auto_approved": False,

"needs_human_review": False,

"approval_result": "",

"approval_history": \[\],

"notifications": \[\],

"errors": \[\]

}

result = self.app.invoke(application)

验证结果

self.assertEqual(result"approval_result", "approved")

self.assertTrue(result"auto_approved")

self.assertEqual(result"approval_level", 1)

self.assertTrue(len(result"approval_history") > 0)

self.assertTrue(len(result"notifications") > 0)

def test_human_approval_long_leave(self):

"""测试长期请假人工审批"""

10天请假(需要人工审批)

application = {

"application_id": "TEST-002",

"applicant": "测试用户",

"application_type": "请假",

"application_data": {"days": 10, "reason": "长假"},

"current_approver": "部门经理",

"approval_level": 0,

"auto_approved": False,

"needs_human_review": False,

"approval_result": "",

"approval_history": \[\],

"notifications": \[\],

"errors": \[\]

}

result = self.app.invoke(

application,

config={"configurable": {"thread_id": "TEST-002"}}

)

验证结果

self.assertEqual(result"approval_result", "pending")

self.assertFalse(result"auto_approved")

self.assertEqual(result"approval_level", 2)

self.assertTrue(result"needs_human_review")

def test_rule_check_function(self):

"""测试规则检查函数"""

测试请假规则

result = check_approval_rules.invoke({

"application_type": "请假",

"amount": 0,

"days": 2

})

self.assertTrue(result"auto_approved")

self.assertEqual(result"approval_level", 1)

if name == "main":

unittest.main()

```

**测试用例2:报销审批测试**

```python

class TestExpenseApproval(unittest.TestCase):

"""报销审批测试"""

def test_auto_approval_small_expense(self):

"""测试小额报销自动审批"""

application = {

"application_id": "TEST-003",

"applicant": "测试用户",

"application_type": "报销",

"application_data": {"amount": 300, "reason": "办公用品"},

"current_approver": "",

"approval_level": 0,

"auto_approved": False,

"needs_human_review": False,

"approval_result": "",

"approval_history": \[\],

"notifications": \[\],

"errors": \[\]

}

result = self.app.invoke(application)

self.assertEqual(result"approval_result", "approved")

self.assertTrue(result"auto_approved")

def test_human_approval_large_expense(self):

"""测试大额报销人工审批"""

application = {

"application_id": "TEST-004",

"applicant": "测试用户",

"application_type": "报销",

"application_data": {"amount": 5000, "reason": "差旅费用"},

"current_approver": "财务主管",

"approval_level": 0,

"auto_approved": False,

"needs_human_review": False,

"approval_result": "",

"approval_history": \[\],

"notifications": \[\],

"errors": \[\]

}

result = self.app.invoke(application)

self.assertEqual(result"approval_result", "pending")

self.assertFalse(result"auto_approved")

self.assertEqual(result"approval_level", 3)

if name == "main":

unittest.main()

```

**测试用例3:采购审批测试**

```python

class TestPurchaseApproval(unittest.TestCase):

"""采购审批测试"""

def test_multi_level_purchase(self):

"""测试多层级采购审批"""

测试不同金额的采购审批层级

test_cases = [

{"amount": 800, "expected_level": 1, "expected_auto": True},

{"amount": 3000, "expected_level": 2, "expected_auto": False},

{"amount": 15000, "expected_level": 3, "expected_auto": False}

]

for case in test_cases:

result = check_approval_rules.invoke({

"application_type": "采购",

"amount": case"amount",

"days": 0

})

self.assertEqual(result"approval_level", case"expected_level")

self.assertEqual(result"auto_approved", case"expected_auto")

if name == "main":

unittest.main()

```


8.6 企业级知识库Agent系统

📋 项目介绍

**项目背景:**

企业知识库是企业信息管理的核心,包含文档、手册、政策、流程等各类知识。传统知识库存在检索效率低、知识更新慢、无法智能问答等问题。

**解决方案:**

使用LangChain + RAG构建智能知识库Agent系统,实现:

  • 📚 **智能文档检索**:基于语义相似度搜索

  • 💬 **智能问答系统**:自然语言问答

  • 🔄 **知识自动更新**:实时同步最新文档

  • 📊 **知识图谱构建**:自动关联相关知识

  • 🎯 **个性化推荐**:根据用户需求推荐知识

🏗️ 技术架构

**架构设计:**

```

用户提问 → 知识库Agent接收 →

向量检索相关文档 → LLM生成答案 →

引用来源文档 → 返回答案

```

**核心技术栈:**

  • **LangChain v1.3.0**:RAG链构建

  • **LangGraph v1.2.0**:问答流程管理

  • **Chroma/FAISS**:向量数据库

  • **OpenAI Embeddings**:文档向量化

💻 完整代码实现

**1. 知识库系统核心代码:**

```python

from langchain_openai import ChatOpenAI, OpenAIEmbeddings

from langchain_community.vectorstores import Chroma

from langchain_core.documents import Document

from langchain_core.prompts import ChatPromptTemplate

from langchain_core.runnables import RunnablePassthrough, RunnableParallel

from langchain_core.output_parsers import StrOutputParser

from langchain_text_splitters import RecursiveCharacterTextSplitter

from typing import TypedDict, Annotated

from operator import add

from langgraph.graph import StateGraph, END

import os

知识库状态定义

class KnowledgeBaseState(TypedDict):

"""知识库问答状态"""

query: str # 用户问题

retrieved_docs: list # 检索到的文档

answer: str # 生成的答案

sources: Annotatedlist\[str, add] # 来源文档列表

confidence: float # 答案置信度

related_questions: list # 相关问题推荐

feedback: str # 用户反馈

```

**2. 文档处理和向量化:**

```python

class EnterpriseKnowledgeBase:

"""企业知识库系统"""

def init(self, persist_directory: str = "./knowledge_db"):

self.llm = ChatOpenAI(model="gpt-4o")

self.embeddings = OpenAIEmbeddings(model="text-embedding-3-small")

self.vector_store = Chroma(

collection_name="enterprise_kb",

embedding_function=self.embeddings,

persist_directory=persist_directory

)

self.text_splitter = RecursiveCharacterTextSplitter(

chunk_size=1000,

chunk_overlap=200

)

def add_document(self, file_path: str, metadata: dict = None):

"""添加文档到知识库

Args:

file_path: 文档路径

metadata: 文档元数据(作者、部门、类型等)

"""

读取文档

with open(file_path, 'r', encoding='utf-8') as f:

content = f.read()

分割文档

chunks = self.text_splitter.split_text(content)

创建Document对象

documents = [

Document(

page_content=chunk,

metadata=metadata or {

"source": file_path,

"timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S")

}

)

for chunk in chunks

]

添加到向量数据库

self.vector_store.add_documents(documents)

self.vector_store.persist()

return f"已添加{len(documents)}个文档片段到知识库"

def add_batch_documents(self, documents: listdict):

"""批量添加文档

Args:

documents: 文档列表 {"path": "...", "metadata": {...}}, ...

"""

results = \[\]

for doc in documents:

result = self.add_document(doc"path", doc.get("metadata"))

results.append(result)

return results

def search(self, query: str, k: int = 5):

"""搜索相关文档

Args:

query: 搜索查询

k: 返回文档数量

Returns:

相关文档列表

"""

results = self.vector_store.similarity_search(query, k=k)

return results

def search_with_scores(self, query: str, k: int = 5):

"""搜索相关文档(带相似度分数)

Args:

query: 搜索查询

k: 返回文档数量

Returns:

(文档, 相似度分数)列表

"""

results = self.vector_store.similarity_search_with_score(query, k=k)

return results

```

**3. RAG问答链构建:**

```python

class KnowledgeBaseRAG:

"""知识库RAG问答系统"""

def init(self, knowledge_base: EnterpriseKnowledgeBase):

self.kb = knowledge_base

self.llm = knowledge_base.llm

创建RAG链

self.rag_chain = self._build_rag_chain()

def _build_rag_chain(self):

"""构建RAG链"""

定义提示模板

prompt = ChatPromptTemplate.from_messages([

("system", """你是企业知识库助手,基于以下文档回答用户问题。

文档内容:

{context}

回答要求:

  1. 基于文档内容回答,不要编造信息

  2. 如果文档中没有相关信息,明确说明

  3. 引用文档来源

  4. 回答简洁准确"""),

("user", "{question}")

])

构建RAG链(v1.3.0最新语法)

retriever = self.kb.vector_store.as_retriever(

search_type="similarity",

search_kwargs={"k": 5}

)

chain = (

RunnableParallel(

{

"context": retriever | (lambda docs: self._format_docs(docs)),

"question": RunnablePassthrough()

}

)

| prompt

| self.llm

| StrOutputParser()

)

return chain

def _format_docs(self, docs: listDocument) -> str:

"""格式化文档内容"""

formatted = \[\]

for i, doc in enumerate(docs):

source = doc.metadata.get("source", "未知来源")

content = doc.page_content

formatted.append(f"文档{i+1} 来源:{source}\n内容:{content}\n")

return "\n".join(formatted)

def ask(self, question: str):

"""问答

Args:

question: 用户问题

Returns:

答案和来源文档

"""

检索相关文档

retrieved_docs = self.kb.search(question, k=5)

生成答案

answer = self.rag_chain.invoke(question)

获取来源

sources = doc.metadata.get("source", "未知") for doc in retrieved_docs

return {

"answer": answer,

"sources": sources,

"retrieved_docs": retrieved_docs

}

def ask_with_confidence(self, question: str):

"""带置信度的问答

Args:

question: 用户问题

Returns:

答案、来源、置信度

"""

检索相关文档(带分数)

results = self.kb.search_with_scores(question, k=5)

计算置信度(基于相似度分数)

scores = score for _, score in results

avg_score = sum(scores) / len(scores) if scores else 0

confidence = min(avg_score / 10, 1.0) # 归一化到0-1

生成答案

docs = doc for doc, _ in results

answer = self.rag_chain.invoke(question)

获取来源

sources = doc.metadata.get("source", "未知") for doc in docs

return {

"answer": answer,

"sources": sources,

"confidence": confidence,

"retrieved_docs": docs

}

```

**4. 知识库Agent工作流:**

```python

定义Agent节点

def retrieve_node(state: KnowledgeBaseState) -> dict:

"""文档检索节点"""

query = state"query"

检索文档

results = kb.search_with_scores(query, k=5)

docs = doc for doc, _ in results

scores = score for _, score in results

计算置信度

avg_score = sum(scores) / len(scores) if scores else 0

confidence = min(avg_score / 10, 1.0)

获取来源

sources = doc.metadata.get("source", "未知") for doc in docs

return {

"retrieved_docs": docs,

"confidence": confidence,

"sources": sources

}

def generate_answer_node(state: KnowledgeBaseState) -> dict:

"""生成答案节点"""

query = state"query"

docs = state"retrieved_docs"

格式化文档

context = "\n".join(doc.page_content for doc in docs)

生成答案

prompt = ChatPromptTemplate.from_messages([

("system", "基于以下文档回答问题:\n{context}"),

("user", "{question}")

])

chain = prompt | llm | StrOutputParser()

answer = chain.invoke({

"context": context,

"question": query

})

return {"answer": answer}

def recommend_related_node(state: KnowledgeBaseState) -> dict:

"""推荐相关问题节点"""

query = state"query"

使用LLM生成相关问题

prompt = ChatPromptTemplate.from_messages([

("system", "基于用户的问题,生成3个相关的延伸问题"),

("user", "{question}")

])

chain = prompt | llm | StrOutputParser()

related = chain.invoke({"question": query})

解析相关问题(简化处理)

questions = q.strip() for q in related.split("\\n") if q.strip()

return {"related_questions": questions:3}

构建知识库工作流

kb_workflow = StateGraph(KnowledgeBaseState)

kb_workflow.add_node("retrieve", retrieve_node)

kb_workflow.add_node("generate", generate_answer_node)

kb_workflow.add_node("recommend", recommend_related_node)

kb_workflow.set_entry_point("retrieve")

kb_workflow.add_edge("retrieve", "generate")

kb_workflow.add_edge("generate", "recommend")

kb_workflow.add_edge("recommend", END)

kb_app = kb_workflow.compile()

```

**5. 使用示例:**

```python

初始化知识库

kb = EnterpriseKnowledgeBase(persist_directory="./enterprise_kb")

添加企业文档

documents = [

{

"path": "./docs/company_policy.txt",

"metadata": {"type": "政策", "department": "人事部", "author": "HR"}

},

{

"path": "./docs/technical_manual.txt",

"metadata": {"type": "手册", "department": "技术部", "author": "Tech"}

},

{

"path": "./docs/process_guide.txt",

"metadata": {"type": "流程", "department": "运营部", "author": "Ops"}

}

]

kb.add_batch_documents(documents)

创建RAG问答系统

rag = KnowledgeBaseRAG(kb)

问答

result = rag.ask_with_confidence("公司的请假政策是什么?")

print(f"答案:{result'answer'}")

print(f"置信度:{result'confidence'}")

print(f"来源:{result'sources'}")

使用Agent工作流

kb_result = kb_app.invoke({

"query": "技术部门的工作流程是什么?",

"retrieved_docs": \[\],

"answer": "",

"sources": \[\],

"confidence": 0.0,

"related_questions": \[\],

"feedback": ""

})

print(f"答案:{kb_result'answer'}")

print(f"相关问题:{kb_result'related_questions'}")

```

🧪 测试用例

**测试用例1:文档添加和检索测试**

```python

import unittest

class TestKnowledgeBase(unittest.TestCase):

"""知识库测试"""

def setUp(self):

"""测试初始化"""

self.kb = EnterpriseKnowledgeBase(persist_directory="./test_kb")

添加测试文档

test_doc = "./test_docs/sample.txt"

with open(test_doc, 'w', encoding='utf-8') as f:

f.write("这是测试文档内容。公司政策规定员工每年有15天年假。")

self.kb.add_document(test_doc, {"type": "测试", "department": "测试部"})

def test_document_addition(self):

"""测试文档添加"""

验证文档已添加

results = self.kb.search("年假", k=1)

self.assertTrue(len(results) > 0)

self.assertIn("年假", results0.page_content)

def test_similarity_search(self):

"""测试相似度搜索"""

results = self.kb.search("假期政策", k=3)

验证搜索结果

self.assertTrue(len(results) > 0)

for doc in results:

self.assertTrue(hasattr(doc, 'page_content'))

self.assertTrue(hasattr(doc, 'metadata'))

def test_search_with_scores(self):

"""测试带分数的搜索"""

results = self.kb.search_with_scores("年假", k=5)

验证分数

self.assertTrue(len(results) > 0)

for doc, score in results:

self.assertTrue(hasattr(doc, 'page_content'))

self.assertTrue(isinstance(score, (int, float)))

def test_batch_addition(self):

"""测试批量添加文档"""

创建多个测试文档

test_docs = [

{"path": "./test_docs/doc1.txt", "metadata": {"type": "政策"}},

{"path": "./test_docs/doc2.txt", "metadata": {"type": "手册"}}

]

for doc in test_docs:

with open(doc"path", 'w', encoding='utf-8') as f:

f.write(f"测试文档{doc'metadata''type'}")

results = self.kb.add_batch_documents(test_docs)

self.assertEqual(len(results), 2)

if name == "main":

unittest.main()

```

**测试用例2:RAG问答测试**

```python

class TestRAGQA(unittest.TestCase):

"""RAG问答测试"""

def setUp(self):

"""测试初始化"""

self.kb = EnterpriseKnowledgeBase(persist_directory="./test_kb")

self.rag = KnowledgeBaseRAG(self.kb)

添加测试文档

test_content = """

公司请假政策:

  1. 年假:每年15天

  2. 病假:每年10天

  3. 事假:需提前申请

审批流程:

  • 3天以下:部门主管审批

  • 3-7天:部门经理审批

  • 7天以上:总经理审批

"""

with open("./test_docs/policy.txt", 'w', encoding='utf-8') as f:

f.write(test_content)

self.kb.add_document("./test_docs/policy.txt", {"type": "政策"})

def test_basic_question(self):

"""测试基础问答"""

result = self.rag.ask("公司年假有多少天?")

验证答案

self.assertTrue(len(result'answer') > 0)

self.assertTrue(len(result'sources') > 0)

self.assertIn("15天", result'answer')

def test_confidence_question(self):

"""测试带置信度的问答"""

result = self.rag.ask_with_confidence("请假审批流程是什么?")

验证结果

self.assertTrue(len(result'answer') > 0)

self.assertTrue(0 <= result'confidence' <= 1)

self.assertTrue(len(result'sources') > 0)

def test_no_answer_question(self):

"""测试无答案问题"""

result = self.rag.ask("公司的股票代码是什么?")

验证答案(应该说明文档中没有相关信息)

self.assertTrue(len(result'answer') > 0)

可能包含"没有"或"未知"等关键词

def test_multi_hop_question(self):

"""测试多跳问答"""

result = self.rag.ask("请假7天需要谁审批?")

验证答案

self.assertTrue(len(result'answer') > 0)

self.assertIn("总经理", result'answer')

if name == "main":

unittest.main()

```

**测试用例3:知识库Agent工作流测试**

```python

class TestKnowledgeBaseWorkflow(unittest.TestCase):

"""知识库Agent工作流测试"""

def test_workflow_execution(self):

"""测试工作流执行"""

initial_state = {

"query": "年假政策",

"retrieved_docs": \[\],

"answer": "",

"sources": \[\],

"confidence": 0.0,

"related_questions": \[\],

"feedback": ""

}

result = kb_app.invoke(initial_state)

验证结果

self.assertTrue(len(result'retrieved_docs') > 0)

self.assertTrue(len(result'answer') > 0)

self.assertTrue(len(result'sources') > 0)

self.assertTrue(0 <= result'confidence' <= 1)

self.assertTrue(len(result'related_questions') > 0)

def test_related_questions_generation(self):

"""测试相关问题生成"""

state = {

"query": "请假流程",

"retrieved_docs": \[\],

"answer": "",

"sources": \[\],

"confidence": 0.0,

"related_questions": \[\],

"feedback": ""

}

result = kb_app.invoke(state)

验证相关问题

self.assertTrue(len(result'related_questions') <= 3)

for question in result'related_questions':

self.assertTrue(isinstance(question, str))

self.assertTrue(len(question) > 0)

if name == "main":

unittest.main()

```


8.7 企业级流水线Agent系统

📋 项目介绍

**项目背景:**

企业流水线系统涵盖CI/CD(持续集成/持续部署)、数据处理流水线、业务流程自动化等多种场景。传统流水线系统配置复杂、缺乏智能决策、故障处理能力弱。

**解决方案:**

使用LangGraph构建智能流水线Agent系统,实现:

  • 🔄 **自动化流程编排**:动态构建流水线

  • 🤖 **智能决策执行**:AI判断下一步操作

  • 🛠️ **故障自动修复**:自动处理常见错误

  • 📊 **实时监控告警**:流水线状态实时监控

  • 📝 **执行日志记录**:完整执行历史

🏗️ 技术架构

**架构设计:**

```

触发流水线 → Agent接收任务 →

执行阶段1 → 检查结果 →

(成功?)→ 继续下一阶段 →

(失败?)→ 自动修复或人工介入 →

完成流水线

```

**核心技术栈:**

  • **LangGraph v1.2.0**:流水线状态管理

  • **LangChain v1.3.0**:工具调用和决策

  • **Docker/Kubernetes**:容器化部署

  • **Prometheus/Grafana**:监控告警

💻 完整代码实现

**1. 流水线状态定义:**

```python

from typing import TypedDict, Annotated

from operator import add

from langgraph.graph import StateGraph, END

from langgraph.checkpoint.memory import MemorySaver

from langgraph.pregel import TimeoutPolicy

from langchain_openai import ChatOpenAI

from langchain_core.tools import tool

from langchain_core.prompts import ChatPromptTemplate

from datetime import datetime

import subprocess

import json

流水线状态定义

class PipelineState(TypedDict):

"""企业流水线状态"""

pipeline_id: str # 流水线ID

pipeline_name: str # 流水线名称

pipeline_type: str # 流水线类型(ci_cd/data_processing/business)

current_stage: str # 当前阶段

stages: list # 流水线阶段列表

stage_results: Annotatedlist\[dict, add] # 阶段执行结果

status: str # 流水线状态(running/success/failed/paused)

errors: Annotatedlist\[str, add] # 错误记录

retry_count: int # 重试次数

max_retries: int # 最大重试次数

notifications: Annotatedlist\[str, add] # 通知记录

metrics: dict # 性能指标

```

**2. 流水线工具定义:**

```python

执行命令工具

@tool

def execute_command(command: str, timeout: int = 60) -> dict:

"""执行Shell命令

Args:

command: Shell命令

timeout: 执行超时时间(秒)

Returns:

执行结果(stdout, stderr, return_code)

"""

try:

result = subprocess.run(

command,

shell=True,

capture_output=True,

text=True,

timeout=timeout

)

return {

"success": result.returncode == 0,

"stdout": result.stdout,

"stderr": result.stderr,

"return_code": result.returncode,

"timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S")

}

except subprocess.TimeoutExpired:

return {

"success": False,

"error": f"命令执行超时({timeout}秒)",

"timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S")

}

except Exception as e:

return {

"success": False,

"error": str(e),

"timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S")

}

发送通知工具

@tool

def send_pipeline_notification(recipient: str, message: str, level: str) -> str:

"""发送流水线通知

Args:

recipient: 接收人

message: 通知内容

level: 通知级别(info/warning/error)

Returns:

通知发送结果

"""

timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")

notification = f"{timestamp} {level.upper} 发送给{recipient}: {message}"

return notification

记录指标工具

@tool

def record_metrics(pipeline_id: str, stage: str, metrics: dict) -> str:

"""记录流水线指标

Args:

pipeline_id: 流水线ID

stage: 当前阶段

metrics: 性能指标

Returns:

记录结果

"""

timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")

record = {

"pipeline_id": pipeline_id,

"stage": stage,

"metrics": metrics,

"timestamp": timestamp

}

return f"指标已记录:{json.dumps(record)}"

```

**3. CI/CD流水线示例:**

```python

CI/CD流水线阶段定义

class CICDPipeline:

"""CI/CD流水线"""

def init(self):

self.llm = ChatOpenAI(model="gpt-4o", temperature=0.3)

self.workflow = self._build_workflow()

def _build_workflow(self):

"""构建CI/CD流水线工作流"""

定义阶段节点

def checkout_node(state: PipelineState) -> dict:

"""代码检出阶段"""

result = execute_command.invoke({

"command": "git clone https://github.com/example/repo.git",

"timeout": 30

})

return {

"current_stage": "checkout",

"stage_results": [{

"stage": "checkout",

"success": result"success",

"output": result.get("stdout", ""),

"timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S")

}],

"status": "checkout_success" if result"success" else "checkout_failed"

}

def build_node(state: PipelineState) -> dict:

"""构建阶段"""

result = execute_command.invoke({

"command": "cd repo && python setup.py build",

"timeout": 120

})

return {

"current_stage": "build",

"stage_results": [{

"stage": "build",

"success": result"success",

"output": result.get("stdout", ""),

"timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S")

}],

"status": "build_success" if result"success" else "build_failed"

}

def test_node(state: PipelineState) -> dict:

"""测试阶段"""

result = execute_command.invoke({

"command": "cd repo && python -m pytest tests/",

"timeout": 180

})

return {

"current_stage": "test",

"stage_results": [{

"stage": "test",

"success": result"success",

"output": result.get("stdout", ""),

"timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S")

}],

"status": "test_success" if result"success" else "test_failed"

}

def deploy_node(state: PipelineState) -> dict:

"""部署阶段"""

result = execute_command.invoke({

"command": "cd repo && docker build -t app:latest .",

"timeout": 300

})

发送部署通知

notification = send_pipeline_notification.invoke({

"recipient": "运维团队",

"message": f"流水线{state'pipeline_id'}部署完成",

"level": "info"

})

return {

"current_stage": "deploy",

"stage_results": [{

"stage": "deploy",

"success": result"success",

"output": result.get("stdout", ""),

"timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S")

}],

"status": "success" if result"success" else "deploy_failed",

"notifications": notification

}

def error_handler_node(state: PipelineState) -> dict:

"""错误处理节点"""

发送错误通知

notification = send_pipeline_notification.invoke({

"recipient": "开发团队",

"message": f"流水线{state'pipeline_id'}在{state'current_stage'}阶段失败",

"level": "error"

})

AI分析错误

prompt = ChatPromptTemplate.from_messages([

("system", "分析流水线错误并给出修复建议"),

("user", "错误信息:{errors}")

])

chain = prompt | self.llm

analysis = chain.invoke({"errors": str(state"errors")})

return {

"status": "failed",

"notifications": notification, analysis.content

}

构建状态图

workflow = StateGraph(PipelineState)

添加节点

workflow.add_node("checkout", checkout_node, timeout=TimeoutPolicy(run_timeout=30))

workflow.add_node("build", build_node, timeout=TimeoutPolicy(run_timeout=120))

workflow.add_node("test", test_node, timeout=TimeoutPolicy(run_timeout=180))

workflow.add_node("deploy", deploy_node, timeout=TimeoutPolicy(run_timeout=300))

workflow.add_node("error_handler", error_handler_node)

设置入口点

workflow.set_entry_point("checkout")

添加条件边(根据执行结果路由)

def route_by_status(state: PipelineState) -> str:

"""根据状态路由"""

if state"status".endswith("_success"):

return "next"

elif state"status".endswith("_failed"):

return "error"

else:

return "end"

Checkout -> Build or Error

workflow.add_conditional_edges(

"checkout",

route_by_status,

{

"next": "build",

"error": "error_handler",

"end": END

}

)

Build -> Test or Error

workflow.add_conditional_edges(

"build",

route_by_status,

{

"next": "test",

"error": "error_handler",

"end": END

}

)

Test -> Deploy or Error

workflow.add_conditional_edges(

"test",

route_by_status,

{

"next": "deploy",

"error": "error_handler",

"end": END

}

)

Deploy -> End

workflow.add_edge("deploy", END)

Error Handler -> End

workflow.add_edge("error_handler", END)

return workflow

def run(self, pipeline_config: dict):

"""运行流水线

Args:

pipeline_config: 流水线配置

Returns:

流水线执行结果

"""

初始化状态

initial_state = {

"pipeline_id": pipeline_config.get("pipeline_id", "PIPELINE-001"),

"pipeline_name": pipeline_config.get("pipeline_name", "CI/CD Pipeline"),

"pipeline_type": "ci_cd",

"current_stage": "",

"stages": "checkout", "build", "test", "deploy",

"stage_results": \[\],

"status": "running",

"errors": \[\],

"retry_count": 0,

"max_retries": 3,

"notifications": \[\],

"metrics": {}

}

编译工作流

app = self.workflow.compile(checkpointer=MemorySaver())

执行流水线

result = app.invoke(

initial_state,

config={"configurable": {"thread_id": initial_state"pipeline_id"}}

)

return result

```

**4. 数据处理流水线示例:**

```python

class DataProcessingPipeline:

"""数据处理流水线"""

def init(self):

self.llm = ChatOpenAI(model="gpt-4o")

self.workflow = self._build_workflow()

def _build_workflow(self):

"""构建数据处理流水线"""

def extract_node(state: PipelineState) -> dict:

"""数据提取阶段"""

模拟数据提取

result = execute_command.invoke({

"command": "python extract_data.py --source database",

"timeout": 60

})

return {

"current_stage": "extract",

"stage_results": [{

"stage": "extract",

"success": result"success",

"records": 1000, # 模拟提取记录数

"timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S")

}]

}

def transform_node(state: PipelineState) -> dict:

"""数据转换阶段"""

result = execute_command.invoke({

"command": "python transform_data.py --input extracted_data.csv",

"timeout": 120

})

return {

"current_stage": "transform",

"stage_results": [{

"stage": "transform",

"success": result"success",

"transformed_records": 950, # 模拟转换记录数

"timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S")

}]

}

def load_node(state: PipelineState) -> dict:

"""数据加载阶段"""

result = execute_command.invoke({

"command": "python load_data.py --input transformed_data.csv --target warehouse",

"timeout": 180

})

记录指标

metrics = record_metrics.invoke({

"pipeline_id": state"pipeline_id",

"stage": "load",

"metrics": {

"total_records": 950,

"load_time": 180,

"success_rate": 0.95

}

})

return {

"current_stage": "load",

"stage_results": [{

"stage": "load",

"success": result"success",

"loaded_records": 950,

"timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S")

}],

"metrics": {"record": metrics}

}

构建工作流

workflow = StateGraph(PipelineState)

workflow.add_node("extract", extract_node)

workflow.add_node("transform", transform_node)

workflow.add_node("load", load_node)

workflow.set_entry_point("extract")

workflow.add_edge("extract", "transform")

workflow.add_edge("transform", "load")

workflow.add_edge("load", END)

return workflow

def run(self, pipeline_config: dict):

"""运行数据处理流水线"""

initial_state = {

"pipeline_id": pipeline_config.get("pipeline_id", "DATA-001"),

"pipeline_name": pipeline_config.get("pipeline_name", "Data Processing"),

"pipeline_type": "data_processing",

"current_stage": "",

"stages": "extract", "transform", "load",

"stage_results": \[\],

"status": "running",

"errors": \[\],

"retry_count": 0,

"max_retries": 3,

"notifications": \[\],

"metrics": {}

}

app = self.workflow.compile()

result = app.invoke(initial_state)

return result

```

**5. 使用示例:**

```python

CI/CD流水线示例

cicd = CICDPipeline()

pipeline_config = {

"pipeline_id": "CI-2026-001",

"pipeline_name": "Python项目CI/CD"

}

result = cicd.run(pipeline_config)

print(f"流水线状态:{result'status'}")

print(f"执行阶段:{result'stage_results'}")

数据处理流水线示例

data_pipeline = DataProcessingPipeline()

data_config = {

"pipeline_id": "DATA-2026-001",

"pipeline_name": "用户数据处理"

}

data_result = data_pipeline.run(data_config)

print(f"数据处理状态:{data_result'status'}")

print(f"处理记录数:{data_result'metrics'}")

```

🧪 测试用例

**测试用例1:CI/CD流水线测试**

```python

import unittest

class TestCICDPipeline(unittest.TestCase):

"""CI/CD流水线测试"""

def setUp(self):

"""测试初始化"""

self.pipeline = CICDPipeline()

def test_checkout_stage(self):

"""测试代码检出阶段"""

initial_state = {

"pipeline_id": "TEST-CI-001",

"pipeline_name": "测试流水线",

"pipeline_type": "ci_cd",

"current_stage": "",

"stages": "checkout", "build", "test", "deploy",

"stage_results": \[\],

"status": "running",

"errors": \[\],

"retry_count": 0,

"max_retries": 3,

"notifications": \[\],

"metrics": {}

}

app = self.pipeline.workflow.compile()

result = app.invoke(initial_state)

验证检出阶段

checkout_result = r for r in result\['stage_results' if r'stage' == 'checkout']

self.assertTrue(len(checkout_result) > 0)

def test_full_pipeline_success(self):

"""测试完整流水线成功执行"""

pipeline_config = {

"pipeline_id": "TEST-CI-002",

"pipeline_name": "完整测试"

}

result = self.pipeline.run(pipeline_config)

验证流水线完成

self.assertEqual(result'status', 'success')

self.assertTrue(len(result'stage_results') == 4)

def test_pipeline_failure_handling(self):

"""测试流水线失败处理"""

模拟失败场景(实际测试中需要模拟命令失败)

initial_state = {

"pipeline_id": "TEST-CI-003",

"pipeline_name": "失败测试",

"pipeline_type": "ci_cd",

"current_stage": "build",

"stages": "checkout", "build", "test", "deploy",

"stage_results": [{

"stage": "checkout",

"success": True,

"timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S")

}],

"status": "build_failed",

"errors": "构建失败",

"retry_count": 0,

"max_retries": 3,

"notifications": \[\],

"metrics": {}

}

验证错误处理节点被触发

self.assertIn("error_handler", self.pipeline.workflow.nodes)

if name == "main":

unittest.main()

```

**测试用例2:数据处理流水线测试**

```python

class TestDataProcessingPipeline(unittest.TestCase):

"""数据处理流水线测试"""

def setUp(self):

"""测试初始化"""

self.pipeline = DataProcessingPipeline()

def test_extract_stage(self):

"""测试数据提取阶段"""

initial_state = {

"pipeline_id": "TEST-DATA-001",

"pipeline_name": "数据测试",

"pipeline_type": "data_processing",

"current_stage": "",

"stages": "extract", "transform", "load",

"stage_results": \[\],

"status": "running",

"errors": \[\],

"retry_count": 0,

"max_retries": 3,

"notifications": \[\],

"metrics": {}

}

app = self.pipeline.workflow.compile()

result = app.invoke(initial_state)

验证提取阶段

extract_result = r for r in result\['stage_results' if r'stage' == 'extract']

self.assertTrue(len(extract_result) > 0)

def test_full_pipeline_execution(self):

"""测试完整数据处理流水线"""

pipeline_config = {

"pipeline_id": "TEST-DATA-002",

"pipeline_name": "完整数据处理"

}

result = self.pipeline.run(pipeline_config)

验证流水线完成

self.assertTrue(len(result'stage_results') == 3)

self.assertIn('metrics', result)

def test_metrics_recording(self):

"""测试指标记录"""

metrics_result = record_metrics.invoke({

"pipeline_id": "TEST-001",

"stage": "load",

"metrics": {"records": 100, "time": 60}

})

验证指标记录

self.assertIn("指标已记录", metrics_result)

if name == "main":

unittest.main()

```

**测试用例3:流水线工具测试**

```python

class TestPipelineTools(unittest.TestCase):

"""流水线工具测试"""

def test_execute_command_success(self):

"""测试命令执行成功"""

result = execute_command.invoke({

"command": "echo 'Hello World'",

"timeout": 10

})

验证执行成功

self.assertTrue(result'success')

self.assertEqual(result'return_code', 0)

self.assertIn('Hello World', result'stdout')

def test_execute_command_failure(self):

"""测试命令执行失败"""

result = execute_command.invoke({

"command": "ls /nonexistent_directory",

"timeout": 10

})

验证执行失败

self.assertFalse(result'success')

self.assertTrue(result'return_code' != 0)

def test_execute_command_timeout(self):

"""测试命令执行超时"""

result = execute_command.invoke({

"command": "sleep 10", # 睡眠10秒

"timeout": 5 # 超时5秒

})

验证超时

self.assertFalse(result'success')

self.assertIn("超时", result.get('error', ''))

def test_notification_tool(self):

"""测试通知工具"""

result = send_pipeline_notification.invoke({

"recipient": "测试团队",

"message": "测试通知",

"level": "info"

})

验证通知

self.assertIn("发送给测试团队", result)

self.assertIn("INFO", result)

if name == "main":

unittest.main()

```


附录:学习资源推荐

官方文档

学习路径

  1. **基础阶段**:理解Agent概念、LLM调用

  2. **进阶阶段**:工具调用、RAG、记忆机制

  3. **高级阶段**:Multi-Agent、工作流、部署