阶段 6:成熟 Agent 框架实践
📖 本阶段目标
- 掌握主流 Agent 开发框架
- 学习 LangChain/LlamaIndex 的核心功能
- 理解框架的工具、记忆、执行器等组件
- 实践用框架构建复杂 Agent 应用
🚀 主流框架概览
框架对比
| 框架 | 特点 | 适用场景 | 学习曲线 |
|---|---|---|---|
| LangChain | 功能全面,生态丰富 | 通用 Agent 开发 | 中等 |
| LlamaIndex | 专注数据索引和 RAG | 知识库问答 | 较低 |
| AutoGen | 多 Agent 对话 | 复杂协作系统 | 中等 |
| CrewAI | 角色化 Agent 团队 | 任务导向协作 | 较低 |
| LangGraph | 状态图流程控制 | 复杂工作流 | 较高 |
🔗 LangChain 实践
1. 基础概念
# examples/stage6/langchain_basics.py
from langchain_openai import ChatOpenAI
from langchain.prompts import ChatPromptTemplate
from langchain.schema.output_parser import StrOutputParser
from langchain.schema.runnable import RunnablePassthrough
# 1. 创建 LLM
llm = ChatOpenAI(model="gpt-4", temperature=0.7)
# 2. 创建 Prompt 模板
prompt = ChatPromptTemplate.from_messages([
("system", "你是一个{role}。"),
("user", "{input}")
])
# 3. 创建输出解析器
output_parser = StrOutputParser()
# 4. 构建链(Chain)
chain = prompt | llm | output_parser
# 5. 运行
result = chain.invoke({
"role": "Python 编程助手",
"input": "如何读取 JSON 文件?"
})
print(result)
2. 工具集成
# examples/stage6/langchain_tools.py
from langchain.agents import Tool, AgentExecutor, create_openai_functions_agent
from langchain_openai import ChatOpenAI
from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder
import requests
# 定义工具函数
def get_weather(city: str) -> str:
"""获取天气信息"""
# 实际应调用真实API
return f"{city}的天气:晴,温度25°C"
def search_web(query: str) -> str:
"""网络搜索"""
# 实际应调用搜索API
return f"关于'{query}'的搜索结果..."
def calculate(expression: str) -> str:
"""计算数学表达式"""
try:
result = eval(expression, {"__builtins__": {}}, {})
return str(result)
except:
return "计算错误"
# 创建工具列表
tools = [
Tool(
name="get_weather",
func=get_weather,
description="获取指定城市的天气信息。输入应该是城市名称。"
),
Tool(
name="search_web",
func=search_web,
description="在网络上搜索信息。输入应该是搜索查询。"
),
Tool(
name="calculate",
func=calculate,
description="计算数学表达式。输入应该是数学表达式,如 '2 + 2'。"
)
]
# 创建 Agent
llm = ChatOpenAI(model="gpt-4", temperature=0)
prompt = ChatPromptTemplate.from_messages([
("system", "你是一个有帮助的助手,可以使用工具来回答问题。"),
("user", "{input}"),
MessagesPlaceholder(variable_name="agent_scratchpad")
])
agent = create_openai_functions_agent(llm, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
# 使用 Agent
if __name__ == "__main__":
result = agent_executor.invoke({
"input": "北京的天气怎么样?如果温度超过20度,帮我计算 (25 + 5) * 2"
})
print("\n最终结果:")
print(result["output"])
3. 记忆系统
# examples/stage6/langchain_memory.py
from langchain_openai import ChatOpenAI
from langchain.memory import ConversationBufferMemory, ConversationSummaryMemory
from langchain.chains import ConversationChain
# 1. 缓冲记忆(保存所有历史)
def demo_buffer_memory():
llm = ChatOpenAI(temperature=0.7)
memory = ConversationBufferMemory()
conversation = ConversationChain(
llm=llm,
memory=memory,
verbose=True
)
# 对话
print(conversation.predict(input="你好,我叫张三"))
print(conversation.predict(input="我喜欢编程"))
print(conversation.predict(input="我叫什么名字?"))
# 查看记忆
print("\n记忆内容:")
print(memory.load_memory_variables({}))
# 2. 摘要记忆(自动总结历史)
def demo_summary_memory():
llm = ChatOpenAI(temperature=0)
memory = ConversationSummaryMemory(llm=llm)
conversation = ConversationChain(
llm=llm,
memory=memory,
verbose=True
)
# 长对话
conversation.predict(input="介绍一下 Python")
conversation.predict(input="它有什么优点?")
conversation.predict(input="适合做什么项目?")
# 查看摘要
print("\n对话摘要:")
print(memory.load_memory_variables({}))
if __name__ == "__main__":
print("=" * 60)
print("缓冲记忆示例")
print("=" * 60)
demo_buffer_memory()
print("\n" + "=" * 60)
print("摘要记忆示例")
print("=" * 60)
demo_summary_memory()
4. RAG 实现
# examples/stage6/langchain_rag.py
from langchain_openai import ChatOpenAI, OpenAIEmbeddings
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.vectorstores import FAISS
from langchain.chains import RetrievalQA
from langchain.document_loaders import TextLoader
# 1. 加载文档
def load_documents():
"""加载文档(示例使用文本)"""
documents = [
"Python 是一种高级编程语言,由 Guido van Rossum 创建于 1991 年。",
"Python 的设计哲学强调代码的可读性和简洁的语法。",
"Python 拥有丰富的标准库和第三方包生态系统。",
"Django 是一个用 Python 编写的高级 Web 框架。",
"Flask 是一个轻量级的 Python Web 框架。",
]
from langchain.schema import Document
return [Document(page_content=doc) for doc in documents]
# 2. 构建 RAG 系统
def build_rag_system():
# 加载文档
docs = load_documents()
# 分割文档
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=100,
chunk_overlap=20
)
splits = text_splitter.split_documents(docs)
# 创建向量存储
embeddings = OpenAIEmbeddings()
vectorstore = FAISS.from_documents(splits, embeddings)
# 创建检索器
retriever = vectorstore.as_retriever(
search_type="similarity",
search_kwargs={"k": 3}
)
# 创建 QA 链
llm = ChatOpenAI(model="gpt-4", temperature=0)
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=retriever,
return_source_documents=True
)
return qa_chain
# 使用示例
if __name__ == "__main__":
qa_system = build_rag_system()
questions = [
"Python 是什么时候创建的?",
"有哪些 Python Web 框架?",
"Python 的设计哲学是什么?"
]
for question in questions:
print(f"\n问题: {question}")
print("-" * 60)
result = qa_system.invoke({"query": question})
print(f"答案: {result['result']}")
print(f"\n来源文档:")
for i, doc in enumerate(result['source_documents'], 1):
print(f"{i}. {doc.page_content}")
print()
📊 LlamaIndex 实践
1. 基础索引
# examples/stage6/llamaindex_basics.py
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader, Settings
from llama_index.llms.openai import OpenAI
from llama_index.embeddings.openai import OpenAIEmbedding
# 配置
Settings.llm = OpenAI(model="gpt-4", temperature=0.1)
Settings.embed_model = OpenAIEmbedding()
# 1. 加载文档
def create_index_from_documents():
"""从文档创建索引"""
# 方式1:从目录加载
# documents = SimpleDirectoryReader('data').load_data()
# 方式2:手动创建文档
from llama_index.core import Document
documents = [
Document(text="Python 是一种高级编程语言,创建于 1991 年。"),
Document(text="LlamaIndex 是一个用于构建 LLM 应用的数据框架。"),
Document(text="向量数据库用于存储和检索文本嵌入。")
]
# 创建索引
index = VectorStoreIndex.from_documents(documents)
return index
# 2. 查询索引
def query_index(index, question):
"""查询索引"""
query_engine = index.as_query_engine()
response = query_engine.query(question)
return response
# 使用示例
if __name__ == "__main__":
index = create_index_from_documents()
questions = [
"Python 是什么时候创建的?",
"什么是 LlamaIndex?"
]
for q in questions:
print(f"问题: {q}")
response = query_index(index, q)
print(f"答案: {response}\n")
2. 高级 RAG
# examples/stage6/llamaindex_advanced.py
from llama_index.core import VectorStoreIndex, Document
from llama_index.core.node_parser import SentenceSplitter
from llama_index.core.retrievers import VectorIndexRetriever
from llama_index.core.query_engine import RetrieverQueryEngine
def create_advanced_rag():
"""创建高级 RAG 系统"""
# 准备文档
documents = [
Document(text="""
AI Agent 是一种能够感知环境、做出决策并采取行动的智能系统。
它结合了大语言模型的推理能力和工具调用的执行能力。
Agent 可以自主规划任务步骤,调用各种工具完成复杂任务。
"""),
Document(text="""
RAG(检索增强生成)是一种结合信息检索和文本生成的技术。
它首先检索相关文档,然后基于这些文档生成答案。
这种方法可以提高答案的准确性和可信度。
""")
]
# 自定义分块
splitter = SentenceSplitter(chunk_size=128, chunk_overlap=20)
# 创建索引
index = VectorStoreIndex.from_documents(
documents,
transformations=[splitter]
)
# 配置检索器
retriever = VectorIndexRetriever(
index=index,
similarity_top_k=3 # 返回最相似的3个块
)
# 创建查询引擎
query_engine = RetrieverQueryEngine(retriever=retriever)
return query_engine
# 使用示例
if __name__ == "__main__":
engine = create_advanced_rag()
response = engine.query("什么是 AI Agent?")
print(f"答案: {response}")
🎯 实践项目
综合 Agent 应用
# examples/stage6/comprehensive_agent.py
from langchain_openai import ChatOpenAI
from langchain.agents import Tool, AgentExecutor, create_openai_functions_agent
from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain.memory import ConversationBufferMemory
from langchain_community.vectorstores import FAISS
from langchain_openai import OpenAIEmbeddings
from langchain.chains import RetrievalQA
class ComprehensiveAgent:
"""综合能力的 Agent"""
def __init__(self):
self.llm = ChatOpenAI(model="gpt-4", temperature=0.7)
self.memory = ConversationBufferMemory(
memory_key="chat_history",
return_messages=True
)
self.tools = self._create_tools()
self.agent_executor = self._create_agent()
def _create_knowledge_base(self):
"""创建知识库"""
documents = [
"公司成立于2020年,主营AI产品开发。",
"我们的产品包括智能客服、文档分析、代码助手。",
"技术栈:Python, FastAPI, React, PostgreSQL。",
]
from langchain.schema import Document
docs = [Document(page_content=d) for d in documents]
embeddings = OpenAIEmbeddings()
vectorstore = FAISS.from_documents(docs, embeddings)
qa_chain = RetrievalQA.from_chain_type(
llm=self.llm,
chain_type="stuff",
retriever=vectorstore.as_retriever()
)
return qa_chain
def _create_tools(self):
"""创建工具"""
kb_chain = self._create_knowledge_base()
tools = [
Tool(
name="knowledge_base",
func=lambda q: kb_chain.invoke({"query": q})["result"],
description="查询公司知识库,包括公司信息、产品、技术栈等。"
),
Tool(
name="calculate",
func=lambda expr: str(eval(expr, {"__builtins__": {}}, {})),
description="计算数学表达式。输入应该是有效的数学表达式。"
)
]
return tools
def _create_agent(self):
"""创建 Agent"""
prompt = ChatPromptTemplate.from_messages([
("system", "你是一个智能助手,可以使用工具回答问题并记住对话历史。"),
MessagesPlaceholder(variable_name="chat_history"),
("user", "{input}"),
MessagesPlaceholder(variable_name="agent_scratchpad")
])
agent = create_openai_functions_agent(
self.llm,
self.tools,
prompt
)
return AgentExecutor(
agent=agent,
tools=self.tools,
memory=self.memory,
verbose=True
)
def chat(self, message: str):
"""对话"""
result = self.agent_executor.invoke({"input": message})
return result["output"]
# 使用示例
if __name__ == "__main__":
agent = ComprehensiveAgent()
print("Agent: 你好!我可以帮你查询公司信息、进行计算等。有什么可以帮助你的?\n")
# 多轮对话
conversations = [
"公司是什么时候成立的?",
"我们的产品有哪些?",
"帮我算一下 (100 + 50) * 2",
"我们之前讨论了什么?" # 测试记忆
]
for msg in conversations:
print(f"用户: {msg}")
response = agent.chat(msg)
print(f"Agent: {response}\n")
📚 框架选择建议
选择 LangChain 当你需要:
- ✅ 丰富的工具和集成
- ✅ 灵活的链式组合
- ✅ 复杂的 Agent 逻辑
- ✅ 活跃的社区支持
选择 LlamaIndex 当你需要:
- ✅ 专注于数据索引和检索
- ✅ 简单的 RAG 应用
- ✅ 结构化数据处理
- ✅ 快速原型开发
选择 AutoGen/CrewAI 当你需要:
- ✅ 多 Agent 协作
- ✅ 角色化系统
- ✅ 复杂对话流程
✅ 阶段完成检查清单
- [ ] 理解主流框架的特点和适用场景
- [ ] 掌握 LangChain 的核心概念(Chain、Tool、Memory)
- [ ] 能够使用 LangChain 创建 Agent
- [ ] 了解 LlamaIndex 的索引和查询机制
- [ ] 实现了基于框架的 RAG 系统
- [ ] 完成综合 Agent 应用项目
- [ ] 能够根据需求选择合适的框架
🎯 下一步
完成本阶段后,进入 阶段 7:工程化、评估与安全,学习如何将 Agent 产品化。
💡 小贴士:框架是工具,理解底层原理更重要。先用框架快速实现,再根据需要优化和定制。不要被框架限制思路!