从零到一:用LangChain Agent构建你的第一个智能对话助手
最近在和一些开发者朋友聊天时,发现大家虽然对大型语言模型(LLM)很感兴趣,但真正动手把AI能力集成到自己项目里的却不多。很多人觉得这需要深厚的机器学习背景,或者担心API调用太复杂。其实,现在的工具链已经相当成熟了——就拿LangChain来说,它就像给LLM应用开发装上了“轮子”,让普通开发者也能快速搭建智能系统。
今天我想分享的,就是如何用LangChain的Agent功能,在5分钟内搭建一个能回答实际问题的智能助手。这不是那种只能聊天的玩具,而是真正能调用工具、处理复杂任务的实用程序。我会用最直白的代码示例,带你走完从环境配置到功能优化的完整流程。
1. 环境准备与基础概念理解
在开始写代码之前,我们需要先理清几个关键概念。LangChain中的Agent,你可以把它想象成一个“智能调度员”——它本身不直接回答问题,而是根据你的问题,决定调用哪个工具(Tool),然后把各个工具的结果整合起来,给你一个完整的答案。
1.1 安装必要的依赖
打开你的终端,创建一个新的Python虚拟环境是个好习惯:
python -m venv langchain_env
source langchain_env/bin/activate # Linux/Mac
# 或者
langchain_env\Scripts\activate # Windows
然后安装核心包:
pip install langchain openai wikipedia
这里简单说明一下每个包的作用:
langchain:核心框架,提供了Agent、Chain、Memory等组件openai:用于调用GPT系列模型的官方库wikipedia:我们将用它作为Agent的一个“工具”,让AI能查询实时信息
注意:如果你在中国大陆,可能需要配置网络代理才能正常安装某些包。建议使用国内镜像源,比如清华源或阿里云源。
1.2 获取API密钥并配置环境
要使用OpenAI的服务,你需要一个API密钥。登录OpenAI平台,在API Keys页面创建一个新的密钥。千万不要把密钥直接写在代码里提交到GitHub!
更安全的做法是使用环境变量:
export OPENAI_API_KEY="你的实际密钥"
或者在Python代码中通过os.environ设置:
import os
os.environ["OPENAI_API_KEY"] = "sk-..."
不过我还是推荐使用.env文件配合python-dotenv来管理敏感信息:
pip install python-dotenv
创建.env文件:
OPENAI_API_KEY=你的实际密钥
然后在代码开头加载:
from dotenv import load_dotenv
load_dotenv()
这样密钥就不会暴露在代码中了。
2. 构建第一个基础Agent
现在让我们动手创建最简单的Agent。这个Agent只做一件事:回答数学问题。虽然听起来简单,但背后的机制是所有复杂Agent的基础。
2.1 初始化语言模型和工具
from langchain.llms import OpenAI
from langchain.agents import load_tools, initialize_agent, AgentType
# 初始化语言模型
llm = OpenAI(temperature=0) # temperature=0让输出更确定
# 加载工具
tools = load_tools(["llm-math"], llm=llm)
# 创建Agent
agent = initialize_agent(
tools=tools,
llm=llm,
agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
verbose=True # 显示思考过程
)
让我解释一下这几个参数:
temperature=0:控制输出的随机性。0表示完全确定,适合需要准确答案的场景["llm-math"]:这是LangChain内置的数学工具,能处理加减乘除、指数等运算ZERO_SHOT_REACT_DESCRIPTION:一种不需要示例就能工作的Agent类型verbose=True:这个特别有用,能看到Agent的“思考过程”
2.2 测试基础功能
运行一个简单的测试:
result = agent.run("如果我有15个苹果,给了朋友3个,又买了8个,现在有多少个?")
print(f"答案:{result}")
打开verbose模式后,你会在控制台看到类似这样的输出:
> 进入新的Agent执行链...
思考:我需要计算苹果的数量。用户最初有15个,给了朋友3个,所以剩下12个。然后买了8个,所以总共20个。
行动:使用计算器
行动输入:15 - 3 + 8
观察:20
思考:我得到了答案20。
最终答案:你现在有20个苹果。
看到没?Agent不是直接计算15-3+8,而是先“思考”步骤,然后调用计算器工具,最后整合答案。这种ReAct(Reasoning + Acting)模式是Agent的核心。
2.3 理解工具的工作原理
你可能好奇llm-math工具到底做了什么。其实它的核心是把自然语言问题转换成Python表达式:
# 模拟llm-math的内部处理
question = "15减去3再加上8等于多少"
# Agent会把它转换成:"15 - 3 + 8"
# 然后调用Python的eval()函数计算
result = eval("15 - 3 + 8") # 结果是20
当然,实际实现更复杂,包括错误处理、单位转换等,但基本原理就是这样。
3. 增强Agent:添加更多工具
单一工具显然不够用。现实世界的问题需要多种能力。让我们给Agent装上“瑞士军刀”。
3.1 集成维基百科搜索
from langchain.agents import load_tools
# 加载多个工具
tools = load_tools(["wikipedia", "llm-math"], llm=llm)
# 重新初始化Agent
agent = initialize_agent(
tools=tools,
llm=llm,
agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
verbose=True,
max_iterations=5 # 限制最大迭代次数,防止无限循环
)
现在测试一下综合能力:
questions = [
"爱因斯坦的相对论是什么时候提出的?",
"那个年份的平方根是多少?",
"Python编程语言的创始人是谁?他创建Python时的年龄是多少?"
]
for q in questions:
print(f"\n问题:{q}")
print(f"答案:{agent.run(q)}")
print("-" * 50)
你会注意到,对于第三个问题,Agent需要:
- 先查维基百科知道Guido van Rossum创建Python
- 再查他的出生年份(1956年)和Python首次发布年份(1991年)
- 最后计算1991-1956=35岁
整个过程完全自动化!
3.2 工具的选择与冲突解决
当有多个工具可用时,Agent如何选择?它依靠语言模型的“理解”能力。每个工具都有描述:
# 查看工具的描述
for tool in tools:
print(f"工具名:{tool.name}")
print(f"描述:{tool.description}\n")
输出类似:
工具名:Wikipedia
描述:用于搜索维基百科信息的工具
工具名:Calculator
描述:用于数学计算
当用户问“苹果公司的市值是多少?”时,Agent看到“市值”可能涉及数字计算,但更可能需要最新数据,所以会选择搜索工具而不是计算器。
提示:如果Agent频繁选错工具,可以优化工具描述。比如把计算器的描述改为“仅用于纯数学表达式计算,不涉及现实世界数据”。
3.3 自定义工具开发
有时候内置工具不够用,我们需要自己创建。比如,我想让Agent能查询天气:
from langchain.tools import BaseTool
from typing import Type
from pydantic import BaseModel, Field
# 定义输入模型
class WeatherInput(BaseModel):
city: str = Field(description="城市名称")
# 创建自定义工具
class WeatherTool(BaseTool):
name = "weather_query"
description = "查询指定城市

&spm=1001.2101.3001.5002&articleId=154177503&d=1&t=3&u=8c0c83bf29f5464899db5ec3563fdddf)
320

被折叠的 条评论
为什么被折叠?



