从零搭建 LangChain 智能体:核心原理 + 实战教程
工具是智能体的核心能力扩展,我们先定义两个实用工具:百科查询、获取当前时间。import os# 加载环境变量(.env文件中配置DASHCOPE_API_KEY)# 工具1:百科查询工具"""调用360百科API查询权威信息,返回摘要"""try:return f"【{first_result['title']}】\n摘要:{first_result['abstract']}\n链接:{firs
一、什么是智能体(Agent)?
在大模型应用领域,智能体(Agent) 是具备 “感知 - 决策 - 执行” 能力的 AI 应用核心,简单来说:它能理解用户需求,自主判断是否需要调用工具(如查百科、查时间、算数学),执行工具后整合结果,最终给出精准回答。
智能体的底层核心原理
智能体的本质是 “大模型 + 工具调用 + 记忆” 的闭环,核心逻辑遵循 ReAct 框架(Reason + Act):
- Reason(推理):大模型分析用户输入,判断是否需要调用工具、调用哪个工具;
- Act(行动):执行选定的工具,获取外部数据 / 结果;
- 反馈:将工具执行结果回传给大模型,由大模型整合后生成最终回答。
智能体的核心模块
一个完整的 LangChain 智能体包含 4 个核心模块:
| 模块 | 作用 |
|---|---|
| 大模型(LLM) | 核心 “大脑”,负责理解需求、推理决策、生成回答 |
| 工具(Tools) | 智能体的 “手脚”,对接外部能力(如查百科、查时间、调用 API、计算等) |
| 记忆(Memory) | 智能体的 “记忆”,保存对话上下文,保证多轮对话的连贯性 |
| 提示词(Prompt) | 约束智能体行为,定义工具调用规则、回答风格,是智能体的 “行为准则” |
二、实战:搭建带记忆 + 工具调用的智能体
接下来我们基于阿里云通义千问模型(qwen-turbo),用 LangChain 搭建一个 “能查百科 + 查时间 + 记对话” 的智能体,全程可复现。
1. 环境准备
首先安装依赖包,执行以下命令:
pip install langchain langchain-community python-dotenv requests dashscope
说明:dashscope 是通义千问的官方 SDK,需提前在阿里云百炼平台申请 API Key(DASHCOPE_API_KEY)。
2. 完整代码实现(逐模块解析)
(1)基础配置与工具定义
工具是智能体的核心能力扩展,我们先定义两个实用工具:百科查询、获取当前时间。
import os
import requests
from dotenv import load_dotenv
from langchain_community.chat_models import ChatTongyi
from langchain.tools import Tool
from langchain.agents import initialize_agent, AgentType
from langchain.memory import ConversationBufferMemory
from langchain.callbacks.streaming_stdout import StreamingStdOutCallbackHandler
from langchain_core.prompts import PromptTemplate
# 加载环境变量(.env文件中配置DASHCOPE_API_KEY)
load_dotenv()
api_key = os.getenv('DASHCOPE_API_KEY')
# 工具1:百科查询工具
def baike_query(keyword: str) -> str:
"""调用360百科API查询权威信息,返回摘要"""
try:
url = f"https://baike.so.com/api/openapi.php?query={keyword}&method=search&format=json"
response = requests.get(url, timeout=10)
response.raise_for_status()
data = response.json()
if data.get("status") == 1 and data.get("total") > 0:
first_result = data["items"][0]
return f"【{first_result['title']}】\n摘要:{first_result['abstract']}\n链接:{first_result['url']}"
return f"未查询到「{keyword}」的百科信息"
except Exception as e:
return f"百科查询失败:{str(e)}"
# 工具2:获取当前时间工具
def get_time_tool(input_str: str) -> str:
"""返回当前系统时间,输入任意内容均可调用"""
try:
from datetime import datetime
return f"当前系统时间:{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}"
except Exception as e:
return f"获取时间失败:{str(e)}"
# 工具列表:注册工具并定义描述(关键!大模型通过描述判断是否调用)
tools = [
Tool(
name="Baike_book",
func=baike_query,
description="用于查询百科全书信息,输入关键词即可调用"
),
Tool(
name="GetTime",
func=get_time_tool,
description="用于获取当前系统时间,传入任意字符串均可调用"
)
]
(2)初始化大模型与记忆模块
# 1. 初始化通义千问模型(支持流式输出)
llm = ChatTongyi(
api_key=api_key,
model_name="qwen-turbo",
temperature=0.7, # 随机性,0-1之间,越小越精准
streaming=True,
callbacks=[StreamingStdOutCallbackHandler()] # 流式输出到控制台
)
# 2. 初始化对话记忆(短期记忆,保存上下文)
memory = ConversationBufferMemory(
memory_key="chat_history", # 记忆在prompt中的键名
return_messages=True, # 返回消息对象而非字符串
output_key="output" # 与智能体输出键匹配
)
(3)自定义提示词模板(约束智能体行为)
提示词是智能体的 “规则手册”,决定了智能体的行为边界:
# 自定义提示词模板:定义智能体的回答规则
prompt = PromptTemplate(
input_variables=["chat_history", "input", "agent_scratchpad"],
template="""
你是有记忆能力的智能助手,必须严格遵守以下规则:
1. 回答用户问题时优先使用【chat_history】中的历史对话,保证连贯性;
2. 仅当用户明确问“现在几点”“时间”时,才能调用GetTime工具;
3. 仅当用户需要查询百科知识时,调用Baike_book工具;
4. 直接输出自然回答,不要输出Thought、Action等中间过程。
历史对话:
{chat_history}
用户问题:{input}
回答:
"""
)
(4)初始化智能体并定义交互函数
# 初始化智能体(核心步骤)
agent = initialize_agent(
tools=tools, # 注册的工具列表
llm=llm, # 大模型
agent=AgentType.CHAT_ZERO_SHOT_REACT_DESCRIPTION, # 无记忆的ReAct智能体
verbose=False, # 关闭详细日志(开启可看工具调用过程)
max_iteration=1, # 最大推理轮数
memory=memory, # 绑定记忆模块
prompt=prompt, # 自定义提示词
handle_parsing_errors="抱歉,请求解析失败,请换种方式提问" # 错误处理
)
# 交互函数:封装智能体调用逻辑
def chat_with_agent(user_input: str) -> str:
"""与智能体交互的核心函数"""
try:
response = agent.run(input=user_input)
return response
except Exception as e:
return f"交互错误:{str(e)}"
# 测试交互
if __name__ == "__main__":
print("=== LangChain智能体(通义千问)===")
print("输入'exit'退出对话\n")
while True:
user_input = input("你:")
if user_input.lower() == "exit":
print("智能体:再见!")
break
print("智能体:", end="")
chat_with_agent(user_input)
print("\n")
3. 运行与测试
(1)配置.env 文件
在项目根目录创建.env文件,写入:
DASHCOPE_API_KEY=你的阿里云通义千问API Key
(2)运行效果
执行代码后,输入以下测试指令:
- 测试百科工具:
人工智能是什么 - 测试时间工具:
现在几点了 - 测试记忆能力:
我刚才问了什么
示例输出:
=== LangChain智能体(通义千问)===
输入'exit'退出对话
你:人工智能是什么
智能体:【人工智能】
摘要:人工智能(Artificial Intelligence,AI)是一门旨在使计算机系统能够模拟、延伸和扩展人类智能的技术科学...
链接:https://baike.so.com/doc/284AI...
你:现在几点了
智能体:当前系统时间:2026-03-03 15:30:25
你:我刚才问了什么
智能体:你刚才先问了“人工智能是什么”,接着问了“现在几点了”。
三、核心知识点解析
1. 工具调用的关键
工具的description字段是核心!大模型完全依赖这个描述判断 “是否调用工具”“调用哪个工具”,描述需清晰、简洁,明确工具的使用场景。
2. 记忆模块的作用
ConversationBufferMemory是最基础的记忆模块,会保存所有对话上下文;如果需要限制记忆长度,可使用ConversationBufferWindowMemory(只保存最近 N 轮对话)。
3. 流式输出的实现
通过streaming=True开启流式输出,配合StreamingStdOutCallbackHandler回调,实现回答逐字打印,提升用户体验。
四、扩展与优化建议
- 工具扩展:可新增翻译、计算、天气查询等工具,只需按
Tool类格式注册即可; - 记忆优化:改用
VectorStoreRetrieverMemory实现长期记忆(基于向量存储); - 错误处理:增加工具调用超时、重试机制,提升稳定性;
- 提示词优化:加入更多规则(如 “拒绝敏感问题”“回答限制长度”)。
总结
- LangChain 智能体的核心是 “大模型 + 工具 + 记忆 + 提示词”,遵循 ReAct 框架实现自主决策;
- 工具定义的关键是清晰的
description,提示词决定智能体的行为边界; - 记忆模块是实现多轮对话连贯性的核心,流式输出可提升交互体验。
通过本文的代码,你可以快速搭建一个基础但完整的智能体,在此基础上扩展工具、优化提示词,即可适配更多业务场景(如智能客服、知识库问答、自动化办公等)
更多推荐

所有评论(0)