LangChain Agent实战:5分钟教你用Python打造智能问答机器人(附完整代码)

从零到一:用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需要:

  1. 先查维基百科知道Guido van Rossum创建Python
  2. 再查他的出生年份(1956年)和Python首次发布年份(1991年)
  3. 最后计算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 = "查询指定城市
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值