一、什么是智能体(Agent)?

在大模型应用领域,智能体(Agent) 是具备 “感知 - 决策 - 执行” 能力的 AI 应用核心,简单来说:它能理解用户需求,自主判断是否需要调用工具(如查百科、查时间、算数学),执行工具后整合结果,最终给出精准回答。

智能体的底层核心原理

智能体的本质是 “大模型 + 工具调用 + 记忆” 的闭环,核心逻辑遵循 ReAct 框架(Reason + Act):

  1. Reason(推理):大模型分析用户输入,判断是否需要调用工具、调用哪个工具;
  2. Act(行动):执行选定的工具,获取外部数据 / 结果;
  3. 反馈:将工具执行结果回传给大模型,由大模型整合后生成最终回答。

智能体的核心模块

一个完整的 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回调,实现回答逐字打印,提升用户体验。

四、扩展与优化建议

  1. 工具扩展:可新增翻译、计算、天气查询等工具,只需按Tool类格式注册即可;
  2. 记忆优化:改用VectorStoreRetrieverMemory实现长期记忆(基于向量存储);
  3. 错误处理:增加工具调用超时、重试机制,提升稳定性;
  4. 提示词优化:加入更多规则(如 “拒绝敏感问题”“回答限制长度”)。

总结

  1. LangChain 智能体的核心是 “大模型 + 工具 + 记忆 + 提示词”,遵循 ReAct 框架实现自主决策;
  2. 工具定义的关键是清晰的description,提示词决定智能体的行为边界;
  3. 记忆模块是实现多轮对话连贯性的核心,流式输出可提升交互体验。

通过本文的代码,你可以快速搭建一个基础但完整的智能体,在此基础上扩展工具、优化提示词,即可适配更多业务场景(如智能客服、知识库问答、自动化办公等)

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐