LangChain--07--智能体、Agent的基本用法

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


智能体

1、理解Agents

2、Agent的基本用法1:模型的传入方式

更多参数参考:https://reference.langchain.com/python/langchain/agents/factory/create_agent

2.1 传入模型字符串

2.2 传入模型对象

3、Agent的基本用法2:如何调用Agent

举例1:

python 复制代码
from langchain.agents import create_agent
from langchain.chat_models import init_chat_model
from dotenv import load_dotenv
import os
load_dotenv(override=True)
from rich import print as rprint

# 以init_chat_model为例
model = init_chat_model(
    model="gpt-5.4-mini",
    model_provider="openai",
    api_key=os.getenv("CLOSEAI_API_KEY"),
    base_url=os.getenv("CLOSEAI_BASE_URL")
)



agent = create_agent(
    model=model
)

# 调用
# response= agent.invoke({
#     "messages":[
#         {"role":"user","content":"你好"}
#     ]
# })

response= agent.invoke({
    "messages":[
        "你好"
    ]
})

rprint(response)
python 复制代码
{
    'messages': [
        HumanMessage(
            content='你好',
            additional_kwargs={},
            response_metadata={},
            id='eb353a30-9042-4007-a0a4-b9607e0dd711'
        ),
        AIMessage(
            content='你好!有什么我可以帮你的吗?',
            additional_kwargs={'refusal': None},
            response_metadata={
                'token_usage': {
                    'completion_tokens': 13,
                    'prompt_tokens': 7,
                    'total_tokens': 20,
                    'completion_tokens_details': {
                        'accepted_prediction_tokens': 0,
                        'audio_tokens': 0,
                        'reasoning_tokens': 0,
                        'rejected_prediction_tokens': 0
                    },
                    'prompt_tokens_details': {'audio_tokens': 0, 'cached_tokens': 0},
                    'latency_checkpoint': {
                        'engine_tbt_ms': 4,
                        'engine_ttft_ms': 36,
                        'engine_ttlt_ms': 82,
                        'pre_inference_ms': 86,
                        'service_tbt_ms': 4,
                        'service_ttft_ms': 274,
                        'service_ttlt_ms': 316,
                        'total_duration_ms': 239,
                        'user_visible_ttft_ms': 188
                    }
                },
                'model_provider': 'openai',
                'model_name': 'gpt-5.4-mini-2026-03-17',
                'system_fingerprint': None,
                'id': 'chatcmpl-E01MoXhhF4EOspY5xZGRx1AUknyOy',
                'service_tier': 'default',
                'finish_reason': 'stop',
                'logprobs': None
            },
            id='lc_run--019f4b40-b73b-75d2-9a09-eeea10233483-0',
            tool_calls=[],
            invalid_tool_calls=[],
            usage_metadata={
                'input_tokens': 7,
                'output_tokens': 13,
                'total_tokens': 20,
                'input_token_details': {'audio': 0, 'cache_read': 0},
                'output_token_details': {'audio': 0, 'reasoning': 0}
            }
        )
    ]
}
python 复制代码
from langchain.agents import create_agent
from langchain.chat_models import init_chat_model
from dotenv import load_dotenv
import os
load_dotenv(override=True)
from rich import print as rprint

# 以init_chat_model为例
model = init_chat_model(
    model="gpt-5.4-mini",
    model_provider="openai",
    api_key=os.getenv("CLOSEAI_API_KEY"),
    base_url=os.getenv("CLOSEAI_BASE_URL")
)



agent = create_agent(
    model=model
)

# 调用
response= agent.invoke({
    "messages":[
        {"role":"system","content":"你是一个精通数学的老师,擅长以通俗易懂的方式讲解数学问题"},
        {"role":"user","content":"100 + 20 * 3 = ?"}
    ]
})


rprint(response)
python 复制代码
{
    'messages': [
        SystemMessage(
            content='你是一个精通数学的老师,擅长以通俗易懂的方式讲解数学问题',
            additional_kwargs={},
            response_metadata={},
            id='7f0d8a15-a18e-4ee9-83f6-f60e012f7006'
        ),
        HumanMessage(
            content='100 + 20 * 3 = ?',
            additional_kwargs={},
            response_metadata={},
            id='2339bb7a-f228-4333-bc7c-53367389e790'
        ),
        AIMessage(
            content='先算乘法:\n\n- \\(20 \\times 3 = 60\\)\n\n再算加法:\n\n- \\(100 + 60 = 160\\)\n\n所以答案是 
**160**。',
            additional_kwargs={'refusal': None},
            response_metadata={
                'token_usage': {
                    'completion_tokens': 44,
                    'prompt_tokens': 43,
                    'total_tokens': 87,
                    'completion_tokens_details': {
                        'accepted_prediction_tokens': 0,
                        'audio_tokens': 0,
                        'reasoning_tokens': 0,
                        'rejected_prediction_tokens': 0
                    },
                    'prompt_tokens_details': {'audio_tokens': 0, 'cached_tokens': 0},
                    'latency_checkpoint': {
                        'engine_tbt_ms': 4,
                        'engine_ttft_ms': 33,
                        'engine_ttlt_ms': 231,
                        'pre_inference_ms': 76,
                        'service_tbt_ms': 5,
                        'service_ttft_ms': 292,
                        'service_ttlt_ms': 482,
                        'total_duration_ms': 420,
                        'user_visible_ttft_ms': 215
                    }
                },
                'model_provider': 'openai',
                'model_name': 'gpt-5.4-mini-2026-03-17',
                'system_fingerprint': None,
                'id': 'chatcmpl-Dmg7y7OFSvrnW0HMOc31Luk0j7QaT',
                'service_tier': 'default',
                'finish_reason': 'stop',
                'logprobs': None
            },
            id='lc_run--019e8db7-2d24-73d3-a7dd-3c336762b6f4-0',
            tool_calls=[],
            invalid_tool_calls=[],
            usage_metadata={
                'input_tokens': 43,
                'output_tokens': 44,
                'total_tokens': 87,
                'input_token_details': {'audio': 0, 'cache_read': 0},
                'output_token_details': {'audio': 0, 'reasoning': 0}
            }
        )
    ]
}

4、Agent的基本用法3:绑定工具

这里的工具可以是LangChain内置的,也可以是自定义的。LangChain生态中已经内置集成了非常多的

实用工具,开发者可以快速调用这些工具完成更加复杂工作流的开发。

LangChain内置工具列表:https://docs.langchain.com/oss/python/integrations/tools

其中典型的工具如下:

4.1 基本用法

Agents支持绑定一或多个工具。

举例1:绑定一个工具

  • 调用查询天气工具进行天气查询
python 复制代码
from langchain_core.tools import tool
from langchain.agents import create_agent
from langchain.chat_models import init_chat_model
from dotenv import load_dotenv
import os
load_dotenv(override=True)
from rich import print as rprint

# 以init_chat_model为例
model = init_chat_model(
    model="gpt-5.4-mini",
    model_provider="openai",
    api_key=os.getenv("CLOSEAI_API_KEY"),
    base_url=os.getenv("CLOSEAI_BASE_URL")
)

# 定义一个工具
@tool(parse_docstring=True)
def get_weather(city : str):
    """
    查询天气的工具

    Args:
        city : 具体的城市
    """
    return f"{city}天气晴朗,温度是15℃"


agent = create_agent(
    model = model,
    tools = [get_weather]
)


response = agent.invoke({
    "messages" : [
        {"role":"system","content":"你是一个查询天气的助手,根据用户的提问查询天气。如果问题跟天气无关,你可以说:我不清楚这个问题的答案"},
        {"role":"user","content":"北京的天气如何?"}
    ]
})

rprint(response)
python 复制代码
{
    'messages': [
        SystemMessage(
            content='你是一个查询天气的助手,根据用户的提问查询天气。如果问题跟天气无关,你可以说:我不清楚这个问题
的答案',
            additional_kwargs={},
            response_metadata={},
            id='f676e465-aca9-469d-82f4-b668f36acd78'
        ),
        HumanMessage(
            content='北京的天气如何?',
            additional_kwargs={},
            response_metadata={},
            id='719e990a-81d8-429f-a39f-1a6827a1ba33'
        ),
        AIMessage(
            content='',
            additional_kwargs={'refusal': None},
            response_metadata={
                'token_usage': {
                    'completion_tokens': 18,
                    'prompt_tokens': 170,
                    'total_tokens': 188,
                    'completion_tokens_details': {
                        'accepted_prediction_tokens': 0,
                        'audio_tokens': 0,
                        'reasoning_tokens': 0,
                        'rejected_prediction_tokens': 0
                    },
                    'prompt_tokens_details': {'audio_tokens': 0, 'cached_tokens': 0},
                    'latency_checkpoint': {
                        'engine_tbt_ms': 11,
                        'engine_ttft_ms': 135,
                        'engine_ttlt_ms': 340,
                        'pre_inference_ms': 94,
                        'service_tbt_ms': 12,
                        'service_ttft_ms': 818,
                        'service_ttlt_ms': 1017,
                        'total_duration_ms': 932,
                        'user_visible_ttft_ms': 724
                    }
                },
                'model_provider': 'openai',
                'model_name': 'gpt-5.4-mini-2026-03-17',
                'system_fingerprint': None,
                'id': 'chatcmpl-DmgQANJLGFzARwjtPmTPQPs1lC4Fm',
                'service_tier': 'default',
                'finish_reason': 'tool_calls',
                'logprobs': None
            },
            id='lc_run--019e8dc8-63c2-7a22-b87d-b192ffe95044-0',
            tool_calls=[
                {
                    'name': 'get_weather',
                    'args': {'city': '北京'},
                    'id': 'call_DPkqzBdPpUHfSfEvr3NvJhka',
                    'type': 'tool_call'
                }
            ],
            invalid_tool_calls=[],
            usage_metadata={
                'input_tokens': 170,
                'output_tokens': 18,
                'total_tokens': 188,
                'input_token_details': {'audio': 0, 'cache_read': 0},
                'output_token_details': {'audio': 0, 'reasoning': 0}
            }
        ),
        ToolMessage(
            content='北京天气晴朗,温度是15℃',
            name='get_weather',
            id='452810b7-c3e4-4ef0-a535-6a753c6f454c',
            tool_call_id='call_DPkqzBdPpUHfSfEvr3NvJhka'
        ),
        AIMessage(
            content='北京天气晴朗,温度是 15℃】【。',
            additional_kwargs={'refusal': None},
            response_metadata={
                'token_usage': {
                    'completion_tokens': 16,
                    'prompt_tokens': 208,
                    'total_tokens': 224,
                    'completion_tokens_details': {
                        'accepted_prediction_tokens': 0,
                        'audio_tokens': 0,
                        'reasoning_tokens': 0,
                        'rejected_prediction_tokens': 0
                    },
                    'prompt_tokens_details': {'audio_tokens': 0, 'cached_tokens': 0},
                    'latency_checkpoint': {
                        'engine_tbt_ms': 5,
                        'engine_ttft_ms': 49,
                        'engine_ttlt_ms': 129,
                        'pre_inference_ms': 98,
                        'service_tbt_ms': 5,
                        'service_ttft_ms': 728,
                        'service_ttlt_ms': 805,
                        'total_duration_ms': 717,
                        'user_visible_ttft_ms': 630
                    }
                },
                'model_provider': 'openai',
                'model_name': 'gpt-5.4-mini-2026-03-17',
                'system_fingerprint': None,
                'id': 'chatcmpl-DmgQCMCEEudUJXawvV78S7FpknJnV',
                'service_tier': 'default',
                'finish_reason': 'stop',
                'logprobs': None
            },
            id='lc_run--019e8dc8-6eb1-7ae2-a8f3-68c7b65ee8cd-0',
            tool_calls=[],
            invalid_tool_calls=[],
            usage_metadata={
                'input_tokens': 208,
                'output_tokens': 16,
                'total_tokens': 224,
                'input_token_details': {'audio': 0, 'cache_read': 0},
                'output_token_details': {'audio': 0, 'reasoning': 0}
            }
        )
    ]
}

举例2:调用langchain内置的工具

绑定内置的TavilySearch搜索工具,可以借助Tavily进行网络搜索和信息爬取。

这里我们需要先在tavily官网注册并获得API-KEY(每月有免费额度):https://www.tavily.com/

python 复制代码
from langchain_tavily import TavilySearch
from langchain_core.tools import tool
from langchain.agents import create_agent
from langchain.chat_models import init_chat_model
from dotenv import load_dotenv
import os
load_dotenv(override=True)
from rich import print as rprint

# 以init_chat_model为例
model = init_chat_model(
    model="gpt-5.4-mini",
    model_provider="openai",
    api_key=os.getenv("CLOSEAI_API_KEY"),
    base_url=os.getenv("CLOSEAI_BASE_URL")
)

# 使用内置的工具
web_search = TavilySearch(
    max_results=2,
    tavily_api_key=os.getenv("TAVILY_API_KEY"),
)


agent = create_agent(
    model = model,
    tools = [web_search]
)


response = agent.invoke({
    "messages" : [
        {"role": "user", "content": "请帮我查询2024年诺贝尔物理学奖得主是谁?"}
    ]
})

rprint(response)

举例3:绑定多个工具

python 复制代码
from langchain.agents import create_agent
from langchain.tools import tool
from dotenv import load_dotenv
from rich import print as rprint

load_dotenv(override=True)

@tool(parse_docstring=True)
def get_weather(city: str):
    """
    天气查询工具

    Args:
        city: 城市名称
    """
    return f"{city}今天天气挺好"

@tool(parse_docstring=True)
def get_news():
    """
    新闻查询工具
    """
    return "近期,受全球储蓄芯片短缺等多重因素影响,多地回收商称废旧手机回收市场迎来"火热潮",回收价格普遍上涨,旧手机成"香饽饽"。"

agent = create_agent(
    model,
    tools=[get_weather, get_news]
)
response = agent.invoke({
    "messages": ["你好,杭州今天的天气如何?今天有哪些新闻?"]
})

rprint(response)

4.2 工具调用流程分析

4.3 重试机制

Agent可以在工具调用结果不满足要求时,自主重试。

python 复制代码
from langchain.agents import create_agent
from langchain.tools import tool
from langchain.messages import SystemMessage, HumanMessage
from dotenv import load_dotenv
from rich import print as rprint

load_dotenv(override=True)

flag = 0

@tool
def get_weather(city: str):
    """
    天气查询工具

    Args:
        city: 城市名称
    """
    global flag
    flag += 1

    if flag < 3:
        # raise Exception("暂时无法访问")
        return "TEMP_UNAVAILABLE: 天气服务暂时不可用,请稍后重试"

    return f"{city}今天天气挺好"


messages = [
    SystemMessage("""
    你是一个天气助手。
    当工具返回以 'TEMP_UNAVAILABLE:' 开头的结果时,
    说明是临时故障,不要立即放弃;
    你应再次调用同一个工具,最多重试 3 次。
    如果 3 次后仍失败,再向用户说明服务暂时不可用。
    """),
    HumanMessage("你好,杭州今天的天气如何?")
]
agent = create_agent(model, tools=[get_weather])
response = agent.invoke({"messages": messages})

rprint(response)

# for msg in response["messages"]:
#     msg.pretty_print()

模型三次调用get_weather ,最终获得了满意的结果

4.4 常见问题

相关推荐
一十九的酒1 小时前
Oracle 12c 标准版无缝升级企业版实战记录
数据库·oracle·标准版切换到企业版
爱笑鱼1 小时前
Handler(一):post 之后,Runnable 到底在哪个线程执行?
android
ZhengEnCi1 小时前
S02-SpringBoot实体类新增字段对已有数据的影响及自动DDL同步机制详解
数据库·spring boot
妙码生花2 小时前
从 PHP 到 AI + Golang,程序员自救转型手记(三十二):增加 admin_rule 模型及数据表迁移
数据库·go·ai编程
木木子222 小时前
[特殊字符] 音乐播放器——状态驱动的多媒体控制
android·开发语言·华为·php·harmonyos
Boop_wu2 小时前
[LangChain]LangChain聊天模型
langchain
雨白2 小时前
C 语言基础:结构体、联合体与枚举
android
千维百策6663 小时前
SRE 中如何消除琐务:提升工程效率与服务可靠性的实践方法
数据库
卓怡学长3 小时前
w266基于spring boot + vue 圣地延安美食乐享系统
java·数据库·vue.js·spring boot·spring·intellij-idea
名不经传的养虾人4 小时前
从0到1:企业级AI项目迭代日记 Vol.65|最危险的故障不是崩溃,是悄悄换掉了正确答案
数据库·人工智能·ai编程·ai-agent·企业ai