1. LangChain智能体开发概述
最近在AI开发者社区里,LangChain智能体开发成为了热门话题。作为一个长期关注AI应用落地的开发者,我发现很多同行对如何从零开始构建一个实用的Agent存在困惑。今天我就以一个简单的天气查询Agent为例,带大家走一遍完整的开发流程。
LangChain是一个强大的框架,它让开发者能够将大语言模型(LLM)与外部工具和数据源连接起来,构建出真正实用的AI应用。不同于单纯调用API,LangChain提供了完整的工具链来开发具备记忆、推理和行动能力的智能体。在实际项目中,我经常用它来开发客服机器人、数据分析助手等应用场景。
这个示例将展示如何用Python和LangChain快速搭建一个能查询实时天气的智能体。选择天气查询作为示例是因为它足够简单,但又包含了智能体开发的所有核心要素:工具调用、记忆管理、对话交互等。整个过程大约需要30分钟,即使你是LangChain新手也能轻松跟上。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 开发环境准备
2.1 基础环境配置
首先确保你的开发环境已经准备好。我推荐使用Python 3.8或更高版本,以及一个你熟悉的开发环境(VSCode、PyCharm等)。创建一个新的虚拟环境是个好习惯:
bash复制python -m venv langchain-env
source langchain-env/bin/activate # Linux/Mac
# 或者
langchain-env\Scripts\activate # Windows
接下来安装核心依赖。除了LangChain本身,我们还需要requests库来处理HTTP请求:
bash复制pip install langchain openai requests python-dotenv
提示:在实际项目中,我建议使用requirements.txt或poetry来管理依赖,这里为了简化直接使用pip安装。
2.2 API密钥配置
我们的智能体需要访问OpenAI的API,所以需要准备好API密钥。创建一个.env文件来安全存储密钥:
ini复制OPENAI_API_KEY=你的API密钥
WEATHER_API_KEY=你的天气API密钥
然后在代码中通过python-dotenv加载:
python复制from dotenv import load_dotenv
load_dotenv()
我测试过几个天气API,最终选择了OpenWeatherMap,它的免费套餐足够我们的示例使用。注册后获取API密钥,同样存入.env文件。
3. 构建天气查询工具
3.1 创建基础工具类
智能体的核心能力来自于它能使用的工具。我们先实现一个天气查询工具:
python复制import requests
from langchain.tools import tool
class WeatherTools:
@tool("查询当前天气")
def get_current_weather(location: str) -> str:
"""根据城市名称查询当前天气情况"""
api_key = os.getenv("WEATHER_API_KEY")
base_url = "http://api.openweathermap.org/data/2.5/weather"
try:
response = requests.get(
base_url,
params={
"q": location,
"appid": api_key,
"units": "metric",
"lang": "zh_cn"
}
)
data = response.json()
if data["cod"] != 200:
return f"获取天气失败: {data.get('message', '未知错误')}"
weather = data["weather"][0]["description"]
temp = data["main"]["temp"]
humidity = data["main"]["humidity"]
wind_speed = data["wind"]["speed"]
return (
f"{location}的当前天气: {weather}\n"
f"温度: {temp}°C, 湿度: {humidity}%\n"
f"风速: {wind_speed} m/s"
)
except Exception as e:
return f"查询天气时出错: {str(e)}"
这个工具类使用了LangChain的@tool装饰器,这能让它自动被识别为智能体可用的工具。我特意添加了详细的错误处理,因为在实际应用中网络请求失败是常见情况。
3.2 工具测试与优化
在集成到智能体前,我们应该单独测试这个工具:
python复制weather_tools = WeatherTools()
print(weather_tools.get_current_weather("北京"))
预期输出类似:
code复制北京的当前天气: 晴
温度: 23°C, 湿度: 45%
风速: 3.2 m/s
我在实际开发中发现几个常见问题:
- 城市名称需要明确("北京"可以,"帝都"可能不行)
- API响应有时延,需要适当增加超时设置
- 免费API有调用限制,开发时要注意
针对这些问题,我对工具做了以下优化:
- 添加了城市名称校验
- 设置了5秒超时
- 增加了缓存机制避免频繁调用
4. 构建智能体核心
4.1 初始化语言模型
智能体的"大脑"是一个大语言模型。这里我们使用OpenAI的GPT-3.5:
python复制from langchain.agents import AgentExecutor
from langchain.agents import initialize_agent
from langchain.agents import AgentType
from langchain.chat_models import ChatOpenAI
llm = ChatOpenAI(
model_name="gpt-3.5-turbo",
temperature=0.5 # 控制创造性,0-1之间
)
temperature参数很关键:
- 0.2-0.5:适合需要准确性的任务
- 0.5-0.7:平衡创造性和准确性
- 0.7-1:更有创造性但可能不准确
对于天气查询这种需要准确性的任务,我推荐0.3-0.5之间。
4.2 创建智能体执行器
现在把工具和模型组合起来:
python复制tools = [WeatherTools().get_current_weather]
agent = initialize_agent(
tools,
llm,
agent=AgentType.STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION,
verbose=True
)
这里有几个关键选择:
- 工具列表:可以添加多个工具
- Agent类型:STRUCTURED_CHAT_ZERO_SHOT适合工具较少的场景
- verbose=True会打印详细执行过程,调试时很有用
4.3 添加对话记忆
为了让智能体能进行多轮对话,我们需要添加记忆功能:
python复制from langchain.memory import ConversationBufferMemory
memory = ConversationBufferMemory(memory_key="chat_history")
agent = initialize_agent(
tools,
llm,
agent=AgentType.CONVERSATIONAL_REACT_DESCRIPTION,
memory=memory,
verbose=True
)
现在智能体可以记住之前的对话内容了。例如:
python复制agent.run("北京天气怎么样?")
agent.run("那上海呢?") # 能理解这是另一个城市的查询
5. 完整示例与测试
5.1 完整代码
把所有部分组合起来:
python复制import os
from dotenv import load_dotenv
from langchain.agents import initialize_agent, AgentType
from langchain.chat_models import ChatOpenAI
from langchain.memory import ConversationBufferMemory
from langchain.tools import tool
import requests
load_dotenv()
class WeatherTools:
@tool("查询当前天气")
def get_current_weather(location: str) -> str:
"""根据城市名称查询当前天气情况"""
api_key = os.getenv("WEATHER_API_KEY")
base_url = "http://api.openweathermap.org/data/2.5/weather"
try:
response = requests.get(
base_url,
params={
"q": location,
"appid": api_key,
"units": "metric",
"lang": "zh_cn"
},
timeout=5
)
data = response.json()
if data["cod"] != 200:
return f"获取天气失败: {data.get('message', '未知错误')}"
weather = data["weather"][0]["description"]
temp = data["main"]["temp"]
humidity = data["main"]["humidity"]
wind_speed = data["wind"]["speed"]
return (
f"{location}的当前天气: {weather}\n"
f"温度: {temp}°C, 湿度: {humidity}%\n"
f"风速: {wind_speed} m/s"
)
except Exception as e:
return f"查询天气时出错: {str(e)}"
def main():
llm = ChatOpenAI(temperature=0.5)
memory = ConversationBufferMemory(memory_key="chat_history")
tools = [WeatherTools().get_current_weather]
agent = initialize_agent(
tools,
llm,
agent=AgentType.CONVERSATIONAL_REACT_DESCRIPTION,
memory=memory,
verbose=True
)
while True:
user_input = input("你: ")
if user_input.lower() in ["退出", "exit", "quit"]:
break
response = agent.run(user_input)
print(f"Agent: {response}")
if __name__ == "__main__":
main()
5.2 测试对话
运行程序后,可以尝试以下对话流程:
code复制你: 北京天气怎么样?
Agent: 北京的当前天气: 晴
温度: 23°C, 湿度: 45%
风速: 3.2 m/s
你: 适合穿什么衣服?
Agent: 根据当前23°C的晴朗天气,建议穿轻薄的长袖或短袖衣物,搭配薄外套。由于湿度适中,整体体感舒适。
你: 上海呢?
Agent: 上海的当前天气: 多云
温度: 25°C, 湿度: 60%
风速: 2.5 m/s
6. 常见问题与优化建议
6.1 调试技巧
在开发过程中,我总结了几个有用的调试方法:
- 设置verbose=True查看详细执行流程
- 使用breakpoint()在关键位置插入断点
- 单独测试每个工具确保它们正常工作
- 检查API响应格式是否符合预期
6.2 性能优化
当智能体变复杂后,可以考虑以下优化:
- 工具缓存:对天气这类不常变的数据,添加缓存减少API调用
- 异步执行:使用async/await提高并发性能
- 批处理:合并多个工具调用
- 精简提示词:优化给LLM的指令
6.3 扩展思路
这个基础智能体可以进一步扩展:
- 添加更多工具:航班查询、日历管理等
- 支持多模态:结合图像识别等
- 持久化记忆:使用数据库存储对话历史
- 部署为Web服务:使用FastAPI或Flask
7. 生产环境注意事项
当准备将智能体部署到生产环境时,有几个关键点需要注意:
- API限流:为天气API添加重试机制和限流
- 错误处理:完善各种边界情况的处理
- 日志记录:记录所有交互用于分析和改进
- 用户认证:如果涉及敏感操作,添加适当的认证
我在实际项目中遇到过API突然变更导致服务不可用的情况,因此建议:
- 为关键API设置监控
- 准备备用数据源
- 实现优雅降级机制
8. LangChain生态系统深入
LangChain不仅仅是一个工具库,它提供了一整套开发生态:
- LangSmith:可视化调试和监控平台
- LangServe:简化部署的工具
- 丰富的集成:支持各种数据库、API和模型
- 社区贡献:大量预构建的工具和模板
对于更复杂的应用场景,可以考虑使用LangGraph来管理多个智能体之间的协作。不过对于大多数单一智能体应用,基础的LangChain已经足够。
