从零到一:如何用Python+LangChain搭建你的第一个AI Agent(附避坑指南)
从零到一:如何用Python+LangChain搭建你的第一个AI Agent(附避坑指南)
在人工智能技术快速发展的今天,构建一个能够自主思考、执行任务的AI Agent已不再是遥不可及的梦想。本文将带你从零开始,使用Python和LangChain框架,一步步构建你的第一个AI Agent。无论你是刚入门AI开发的初学者,还是希望扩展技术栈的开发者,这篇指南都将为你提供清晰、实用的实现路径。
1. 环境准备与基础概念
在开始编码之前,我们需要先搭建开发环境并理解几个核心概念。AI Agent不同于传统的程序,它具备感知环境、制定计划、执行动作的能力。LangChain作为一个强大的框架,为我们提供了构建这类系统的必要工具。
首先,确保你的系统已安装Python 3.8或更高版本。我们推荐使用conda来管理环境:
conda create -n langchain-env python=3.10
conda activate langchain-env
接下来安装必要的依赖包:
pip install langchain openai python-dotenv
提示:建议使用.env文件管理API密钥等敏感信息,避免直接硬编码在脚本中。
理解几个关键术语:
- LLM(大语言模型):如GPT-3.5/4,Claude等,是Agent的"大脑"
- RAG(检索增强生成):让Agent能够访问外部知识库
- 工具(Tools):Agent与外界交互的接口,如搜索、计算等
2. 构建基础Agent框架
现在我们来创建一个最简单的Agent,它能够理解用户输入并做出基本响应。LangChain提供了多种Agent类型,我们从一个简单的"零-shot"Agent开始。
from langchain.agents import initialize_agent, Tool
from langchain.llms import OpenAI
from langchain.chains import LLMMathChain
# 初始化LLM
llm = OpenAI(temperature=0)
# 创建数学计算工具
math_chain = LLMMathChain(llm=llm)
tools = [
Tool(
name="Calculator",
func=math_chain.run,
description="用于数学计算"
)
]
# 初始化Agent
agent = initialize_agent(
tools,
llm,
agent="zero-shot-react-description",
verbose=True
)
这个基础Agent已经可以处理简单的数学问题。让我们测试一下:
agent.run("123乘以456等于多少?")
注意:temperature参数控制输出的随机性,0表示最确定性结果,适合需要精确答案的场景。
3. 增强Agent能力:记忆与工具
一个实用的Agent需要记忆能力和更多工具。LangChain提供了对话记忆和多种内置工具,让我们来扩展之前的实现。
3.1 添加对话记忆
from langchain.memory import ConversationBufferMemory
memory = ConversationBufferMemory(memory_key="chat_history")
agent = initialize_agent(
tools,
llm,
agent="conversational-react-description",
verbose=True,
memory=memory
)
现在Agent可以记住对话上下文了:
agent.run("我叫张三") # Agent会记住这个名字
agent.run("我的名字是什么?") # 能正确回答"张三"
3.2 集成更多工具
让我们添加搜索和维基百科查询能力:
from langchain.utilities import GoogleSearchAPIWrapper, WikipediaAPIWrapper
search = GoogleSearchAPIWrapper()
wikipedia = WikipediaAPIWrapper()
tools = [
Tool(
name="Search",
func=search.run,
description="用于搜索最新信息"
),
Tool(
name="Wikipedia",
func=wikipedia.run,
description="用于查询百科知识"
),
# 保留之前的计算器工具
Tool(
name="Calculator",
func=math_chain.run,
description="用于数学计算"
)
]
现在Agent可以回答更复杂的问题了:
agent.run("特斯拉最新的股价是多少?然后计算如果我买100股需要多少钱?")
4. 实现RAG增强的知识库
为了让Agent能够访问特定领域的专业知识,我们可以实现RAG(检索增强生成)架构。以下是关键步骤:
- 准备知识库:将专业文档转换为可检索的格式
- 创建检索器:基于向量数据库实现语义搜索
- 集成到Agent:让Agent能够在需要时检索相关知识
from langchain.document_loaders import TextLoader
from langchain.text_splitter import CharacterTextSplitter
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import FAISS
# 加载文档
loader = TextLoader("专业知识.txt")
documents = loader.load()
# 分割文档
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
texts = text_splitter.split_documents(documents)
# 创建向量存储
embeddings = OpenAIEmbeddings()
db = FAISS.from_documents(texts, embeddings)
# 创建检索工具
retriever = db.as_retriever()
tools.append(
Tool(
name="Knowledge Base",
func=retriever.get_relevant_documents,
description="用于查询专业知识"
)
)
现在Agent可以结合专业知识回答问题:
agent.run("根据公司政策,项目延期应该如何处理?")
5. 常见问题与优化技巧
在开发过程中,你可能会遇到以下典型问题:
5.1 性能优化
- 问题:响应速度慢
- 解决方案:
- 使用流式响应
- 实现缓存机制
- 限制工具调用次数
from langchain.cache import InMemoryCache
from langchain.globals import set_llm_cache
# 启用缓存
set_llm_cache(InMemoryCache())
5.2 错误处理
- 问题:工具调用失败
- 解决方案:添加重试机制和备用方案
from tenacity import retry, stop_after_attempt
@retry(stop=stop_after_attempt(3))
def safe_tool_call(func, *args, **kwargs):
try:
return func(*args, **kwargs)
except Exception as e:
return f"工具调用失败: {str(e)}"
5.3 安全考虑
- 问题:敏感信息泄露
- 解决方案:实现输入输出过滤
def sanitize_input(user_input):
sensitive_words = ["密码", "密钥", "身份证"]
for word in sensitive_words:
if word in user_input:
return "输入包含敏感信息"
return user_input
6. 部署与监控
完成开发后,你需要考虑如何部署和监控Agent。以下是关键步骤:
- API封装:使用FastAPI或Flask创建Web接口
- 日志记录:记录所有交互用于分析和改进
- 性能监控:跟踪响应时间和资源使用
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class Query(BaseModel):
text: str
@app.post("/ask")
async def ask_agent(query: Query):
response = agent.run(query.text)
return {"response": response}
提示:生产环境建议添加认证和限流机制保护API。
7. 进阶方向与实用建议
当你的基础Agent运行稳定后,可以考虑以下进阶方向:
- 多Agent协作:创建多个Agent分工合作
- 自主决策:实现基于目标的自动规划
- 持续学习:让Agent能够从交互中学习
在实际项目中,我发现这些技巧特别有用:
- 为每个工具编写清晰的描述,这直接影响Agent选择工具的能力
- 控制工具调用次数,避免陷入无限循环
- 定期评估Agent表现,建立测试用例集
- 使用LangSmith等工具进行调试和追踪
更多推荐

所有评论(0)