前言
本系列分享前五篇分别讲述了
学完以上内容大家会发现伴随着用户应用和开发需求的复杂化,LangChain使用底层API搭建的Chain
工作流逐渐显的力不从心。而DeepSeek-V3、Qwen3等大模型经过飞速发展已经具备极强的Agent能力,对于工具函数的串联、并联和错误循环的编排已经成为当前大模型的基本操作。面对现状,LangChain是如何快速将大模型构建为AI Agent智能体呢?本期分享笔者将和大家一起学习LangChain Agent API的调用方法~
本系列分享是笔者结合自己学习工作中使用LangChain&LangGraph经验倾心编写,力求帮助大家体系化快速掌握LangChain&LangGraph AI Agent智能体开发的技能!大家感兴趣可以关注笔者掘金账号和系列专栏。更可关注笔者同名微信公众号: 大模型真好玩, 每期分享涉及的代码均可在公众号私信: LangChain智能体开发获得。
一、LangChain Agent API 简介
LangChain的“链”式结构存在执行方式不灵活的重大问题。比如我们上篇文章搭建的链封装了天气工具,但如果用户在使用过程中并没有询问相关天气情况,反而提问了“决策树是什么?”类似的机器学习问题,那该链该如何执行呢?
面对这种情况大家考虑链中是否要跳过一些节点或者构建不同链满足复杂需求,但很显然这增加了开发复杂度。目前大模型经过迅猛发展已经具备了自动规划对工具串联、并联等相关操作的能力,基于此LangChain在链的基础上抽象出更高级的封装Agent,LangChain对于Agent的定义是“由大模型规划并自由组装各种链来满足用户需求”。更重要的,LangChain还在Agent的基础上封装了更高级的LangGraph(LangGraph类似Multi-Agent多智能体协同的概念,LangChain内容分享完毕后会分享LangGraph的教程)。
从本期内容开始,笔者就为大家分享LangChain Agent API抽象层的相关知识。
二、LangChain快速接入工具搭建智能体
LangChain Agent API的基本使用方法十分简单,下面还是通过天气助手小案例带大家快速上手Agent API的基本使用:
- 导入相关依赖包并编写查询天气的函数,注意本案例导入
create_tool_calling_agent
函数和AgentExecutor
类,是本节智能体构建内容的关键。import requestsfrom langchain.agents import create_tool_calling_agent, tool, AgentExecutorfrom langchain.chat_models import init_chat_modelfrom langchain_core.prompts import ChatPromptTemplate@tooldef get_weather(loc): """ 查询即时天气函数 :param loc: 必要参数,字符串类型,用于表示查询天气的具体城市名称,\ :return:心知天气 API查询即时天气的结果,具体URL请求地址为:"https://api.seniverse.com/v3/weather/now.json" 返回结果对象类型为解析之后的JSON格式对象,并用字符串形式进行表示,其中包含了全部重要的天气信息 """ url = "https://api.seniverse.com/v3/weather/now.json" params = { "key": "你注册的心知天气api", "location": loc, "language": "zh-Hans", "unit": "c", } response = requests.get(url, params=params) temperature = response.json() return temperature['results'][0]['now']
- 构建提示词模板组件和大模型组件(注意提示词模板中的
agent提示符
),为保证大模型具备更强的Agent能力,本期内容不再使用硅基流动的免费模型Qwen3-8B
, 而是使用DeepSeek-V3
模型,具体配置大家可参考LangChain接入大模型的基本方法。# 构建提示模版, 提示词模板对于Agent的构建是必须的prompt = ChatPromptTemplate.from_messages( [ ("system", "你是天气助手,请根据用户的问题,给出相应的天气信息,并具备将结果写入文件的能力"), ("human", "{input}"), ("placeholder", "{agent_scratchpad}"), # 这部分agnet提示符写法是写死的不可以修改 ])# 使用 DeepSeek 模型model = init_chat_model( model='deepseek-chat', # deepseek-chat表示调用DeepSeek-v3模型 model_provider='deepseek',# 模型提供商写deepseek api_key="你注册的deepseek api key",)
- 本项目中不再使用
model.bind()
绑定模型组件和工具,而是使用create_tool_calling_agent
快速构建代理,代码如下:#定义工具tools = [get_weather]# 直接使用`create_tool_calling_agent`创建代理agent = create_tool_calling_agent(model, tools, prompt)
- 使用
AgentExecutor
构建Agent并快速运行代理, 代码和执行结果如下, 可以看到LangChain构建Agent是不是特别简单# 使用AgentExecutor运行当前Agentagent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True) # Verbose表示是否要打印执行细节response=agent_executor.invoke({"input":"请问今天北京天气怎么样?"})print(response)
从执行结果中可以看到LangChain Agent灵活的、全自动的创建了一个chain
并invoke
执行得到了北京的天气情况,执行结果通过{ input: , output: }
格式返回。看到这大家一定会感慨LangChain构建智能体竟然如此简单!
三、LangChain Agent 多工具调用
得益于LangChain Agent API 底层自建了很多优化去引导大模型的工具调用工作,LangChain Agent可以快速准确的调用各种工具,准确性和稳定性也要比单纯使用Function Calling
能力要强一些。LangChain Agent可以通过串联
,并联
以及串并联组合
的方式调用工具,下面提供这两种调用方法的示例让大家直观感受LangChain Agnet功能的强大。
3.1 并联调用
如果用户同时询问北京和杭州的天气,LangChain Agent会并联查询两个地方的天气,大家可以修改以上代码的提示词进行尝试:
response=agent_executor.invoke({"input":"请问今天北京和杭州的天气怎么样,哪个城市更热??"})print(response)
执行结果如下:
可以看到LangChain 同时调用get_weather
工具获取了北京和杭州的天气情况并回答了用户问题,从上面可以看出LangChain Agent执行并联调用的流程如下:
这里给大家设立一个思考题,假如我们还是想通过Chains
底层API的方法实现串并联调用该如何设计呢?欢迎大家在评论区和笔者讨论~
3.2 串联调用
如果用户想“查询北京和杭州现在的温度,并将结果写入本地的文件中。”,LangChain该如何执行呢?我们设想LangChain Agent的执行结果如下图:
编写代码验证一下是否正确:
- 在上述代码中添加写入文件函数
write_file()
@tooldef write_file(content): """ 将指定内容写入本地文件。 :param content: 必要参数,字符串类型,用于表示需要写入文档的具体内容。 :return:是否成功写入 """ with open('res.txt', 'w', encoding='utf-8') as f: f.write(content) return "已成功写入本地文件。"
- 将
write_file
函数加入工具列表,并在提示词模板中说明大模型具备写入文件的能力#定义工具tools = [get_weather, write_file]# 构建提示模版, 提示词模板对于Agent的构建是必须的prompt = ChatPromptTemplate.from_messages( [ ("system", "你是天气助手,请根据用户的问题,给出相应的天气信息,并具备将结果写入文件的能力"), ("human", "{input}"), ("placeholder", "{agent_scratchpad}"), # 这部分agnet提示符不需要人工输入,同时也是写死的不可以修改 ])
- 调用
create_tool_calling_agent
创建代理,并使用AgentExecutor
执行当前Agent,可以看到LangChain Agent并联搜索得到了北京杭州的天气后,又串联使用文件写入工具把结果写入到res
文件中:# 使用 DeepSeek 模型model = init_chat_model( model='deepseek-chat', # deepseek-chat表示调用DeepSeek-v3模型 model_provider='deepseek',# 模型提供商写deepseek api_key="",)# 直接使用`create_tool_calling_agent`创建代理agent = create_tool_calling_agent(model, tools, prompt)# 使用AgentExecutor运行当前Agentagent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True) # Verbose表示是否要打印细节信息response=agent_executor.invoke({"input":"查一下北京和杭州现在的温度,并将结果写入本地的文件中。"})print(response)
四、LangChain使用内置搜索工具搭建联网搜索智能体
既然LangChain Agent能够快速灵活的调用外部工具, 那调用内置工具的能力更是不在话下,接下来我们通过一个联网搜索功能的内置工具Agent来学习LangChain接入内置工具的方法。(注意; 需要科学上网)
LangChain内置工具可参考官方网站python.langchain.com/docs/integr… 。本次网络搜索功能我们使用的是Tavily Search这个工具,文档在python.langchain.com/docs/integr… 。TavilySearch是目前对大语言模型非常友好的搜索工具之一,可以方便的处理文本、图像等不同类型的内容并代入大语言模型进行解析。我们以前分享过的Suna和Google Agent都推荐使用Tavily Search作为联网搜索工具。
- 执行命令
pip install langchain-tavily
安装Tavily
依赖包- 登录 Tavily官网, 可以用github账号登录,然后到
Overview
注册一个API Key
, 每个月有1000次免费搜索案例。我们还需要将API KEY写入环境变量中,环境变量名为TAVILY_API_KEY
。- 先来测试一下
Tavily Search
的基本功能, 编写如下代码:from langchain_community.tools.tavily_search import TavilySearchResultssearch = TavilySearchResults(max_results=2)search.invoke("苹果2025WWDC发布会")
执行结果如下,可以看到Tavily Search
输出了两个结果:
Tavily Search
接入Agent的流程和上面讲述的相同,这里不加赘述了,完整代码如下:from langchain.agents import AgentExecutor, create_tool_calling_agent, toolfrom langchain_core.prompts import ChatPromptTemplatefrom langchain.chat_models import init_chat_modelfrom langchain_community.tools.tavily_search import TavilySearchResultssearch = TavilySearchResults(max_results=2)tools = [search]prompt = ChatPromptTemplate.from_messages( [ ("system", "你是一名助人为乐的助手,并且可以调用工具进行网络搜索,获取实时信息。"), ("human", "{input}"), ("placeholder", "{agent_scratchpad}"), ])# 初始化模型# 使用 DeepSeek 模型model = init_chat_model( model='deepseek-chat', # deepseek-chat表示调用DeepSeek-v3模型 model_provider='deepseek',# 模型提供商写deepseek api_key="你注册的api key",)agent = create_tool_calling_agent(model, tools, prompt)agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)agent_executor.invoke({"input": "请问苹果2025WWDC发布会召开的时间是?"})
执行结果如下, 可以看到LangChain成功执行并通过搜索给出了精确的召开时间:
五、 总结
本篇文章分享了LangChain Agent API快速搭建智能体的方法,关键步骤通过create_tool_calling_agent
创建模型和工具的Agent,并使用AgentExecutor
执行当前Agent。总而言之在当今大模型强大能力的加持下,LangChain Agent API搭建智能体的方法还是非常简单的。下期分享我们将通过大模型调用浏览器自动化网络爬虫实战的项目带大家完整搭建一个Agent,大家一起期待一下吧~
本系列分享预计会有20节左右的规模,保证大家看完一定能够掌握LangChain&LangGraph的开发能力,大家感兴趣可关注笔者掘金账号和专栏,更可关注笔者的同名微信公众号:大模型真好玩, 本系列分享的全部代码均可在微信公众号私信笔者: LangChain智能体开发 免费获得。