掘金 人工智能 11月05日 22:23
LangChain 1.0 create_agent API 基础使用指南
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文详细介绍了LangChain 1.0中create_agent API的基础使用方法。文章首先指导了环境搭建,并重点阐述了构建智能体的三大核心要素:提示词、大语言模型和工具函数。通过一个天气助手案例,演示了如何利用这三要素创建智能体,并详细解析了create_agent执行流程。此外,文章还深入探讨了LangChain的消息机制,包括不同的消息类型(SystemMessage, HumanMessage, ToolMessage, AIMessage)及其表示方式,以及消息元数据的重要性。最后,对LangChain的四种流式输出模式(invoke, values, messages, custom)进行了详尽的讲解,帮助开发者理解如何优化用户体验。

🛠️ **环境搭建与核心要素**:文章提供了创建LangChain 1.0开发环境的详细步骤,并强调构建智能体的三大基础要素:清晰的提示词(SystemPrompt)用于定义智能体角色和能力,兼容的模型(如DeepSeek)用于理解和生成响应,以及结构化的工具函数(如`get_weather`)用于执行特定任务。每个工具函数都需要有明确的说明,以便大模型能够准确判断其用途和调用时机。

🤖 **create_agent API 的基本构成与执行流程**:`create_agent` API 继承了LangChain智能体构建的核心理念,依赖于模型、工具和提示词。文章以一个天气查询为例,展示了如何实例化模型,定义工具函数,并结合系统提示词来创建一个能够执行特定任务的智能体。通过`agent.stream`方法,用户可以清晰地观察到智能体从接收用户问题,到模型分析决策调用工具,再到工具执行返回结果,最后模型整合信息生成最终回答的完整执行链条。

💬 **LangChain的消息机制与表示**:LangChain 1.0 引入了一套完善的消息类型系统,包括`SystemMessage`(设定角色与能力)、`HumanMessage`(用户输入或反馈)、`ToolMessage`(工具调用结果)和`AIMessage`(模型生成响应)。这些消息共同构成了对话上下文,智能体通过分析历史消息进行逐步推理。文章还介绍了消息的多种表示方式(对象或字典)以及`pretty_print()`方法背后丰富的元数据信息,如token使用量和模型配置,为开发者提供了深入了解和监控智能体行为的途径。

⚡ **流式输出模式的多样性与应用**:为了应对大模型响应延迟问题,LangChain提供了多种流式传输模式。`invoke`模式会等待最终结果一次性输出;`values`模式(示例中广泛使用)会分步骤输出中间数据,展示智能体的决策过程;`messages`模式则逐token输出模型的最终响应;`custom`模式允许在工具函数中插入自定义的流式输出内容,极大地增强了应用的实时交互性和用户体验。还可以组合使用多种模式,实现更灵活的输出。

前言

上篇分享LangChain1.0速通指南(一)——LangChain1.0核心升级笔者分享了Langchain1.0三大核心升级:全新智能体构建 API create_agent、标准化内容块接口和精简的包结构。从笔者的分享中大家也能感受到在这些新特性中,create_agent 作为新一代智能体构建的标准 API,凭借其灵活的中间件机制和内置的结构化输出能力,不仅大幅提升了开发效率,也进一步拓展了智能体的功能边界。本期分享开始笔者将正式讲解create_agent, 本篇将聚焦于 create_agent 的基本使用方法,帮助大家快速掌握这一核心 API 的基础操作。

本系列内容适合所有对 LangChain 感兴趣的学习者,无论之前是否接触过 LangChain。当然,如果大家已经学习过我的专栏《深入浅出LangChain&LangGraph AI Agent 智能体开发》,相信可以更快上手。该专栏基于笔者在实际项目中的深度使用经验,系统讲解了使用LangChain/LangGraph如何开发智能体,目前已更新 23 讲,并持续补充实战与拓展内容。欢迎感兴趣的同学关注笔者的掘金账号与专栏,也可关注笔者的同名微信公众号 大模型真好玩,每期分享涉及的代码均可在公众号私信: LangChain智能体开发免费获取。

一、环境搭建

LangChain 1.0 的环境搭建过程较为简单。笔者推荐使用 anaconda 创建一个新的虚拟环境(这里命名为 langchainenvnew),并建议将 Python 版本设置为 3.12 。创建环境的命令如下:

conda create -n langchainenvnew python=3.12

环境创建完成后,安装本实验所需的依赖包。请执行以下命令:

pip install -u langchain langchain-community langchain-deepseek

完成上述步骤后环境准备就绪,接下来开始编写今天的代码。

二、create_agent三要素:提示词,大模型和工具函数

在笔者文章深入浅出LangGraph AI Agent智能体开发教程(二)—LangGraph预构建图API快速创建Agent中提到,要利用create_react_agent api 构建一个基础的智能体,提示词,大模型和工具函数三要素必不可少。作为升级版,create_agent 同样基于这三个要素构建。接下来笔者使用经典的天气助手案例为大家详细说明create_agent的基本使用方法。

    首先导入代码所需依赖,并通过自定义函数的方式编写一个模拟天气查询函数,注意工具函数必须包含清晰的函数说明,这是大模型判断是否调用自定义函数的重要依据。从依赖包的导入方式大家可以看出langchain的依赖包命名更加简洁明了。

    from langchain.chat_models import init_chat_modelfrom langchain.tools import toolfrom langchain.agents import create_agent@tooldef get_weather(loc:str)->str:    """    根据地点参数可以返回该地点的天气情况    """    return f"{loc} 天气是晴!气温23°"

    现在已经具备了工具函数,接下来需要准备提示词和大语言模型,然后使用这三要素创建智能体:

    SYSTEM_PROMPT = "你是一个天气助手,具备调用get_weather天气函数获取指定地点天气的能力"model = init_chat_model(    model="deepseek-chat",    base_url="https://api.deepseek.com",    api_key="你注册的deepseek api key")agent = create_agent(    model=model,    tools=[get_weather],    system_prompt=SYSTEM_PROMPT)

    编写问题"北京天气怎么样"来测试智能体,并使用 agent.stream 方法实现流式输出,通过 pretty_print() 方法格式化显示每次的输出结果:

    question="北京的天气怎么样?"for step in agent.stream({'messages': question},    stream_mode="values"):    step["messages"][-1].pretty_print()

    运行上述代码后,我们可以清晰地观察到 LangChain 1.0 智能体的完整执行流程:

      用户提问:接收到问题"北京天气怎么样"模型分析:大语言模型识别出自身无法直接回答,决定调用工具函数 get_weather,并自动生成调用参数 {loc: 北京}工具执行:执行工具函数并获取返回结果结果整合:大语言模型根据工具函数的执行结果,生成格式化的最终回答

三、模型与消息机制

3.1 LangChain模型支持

在上述代码中,笔者使用了 DeepSeek 模型。LangChain 1.0 已经集成了超过 100 个模型供应商,为开发者提供了极大的灵活性。不同模型的具体使用方法都可以在 LangChain 官网的 Chat 模型集成页面 找到详细的文档说明,包括我们上面使用的DeepSeek 模型配置方法:

现代大语言模型(LLMs)不仅能够生成文本,还支持多种高级功能,包括工具调用(调用外部工具如数据库查询或API)、结构化输出(使模型响应遵循预定义格式)、多模态处理(处理图像、音频等非文本数据)以及多步推理能力

3.2 LangChain消息类型解析

观察前面程序的运行结果,可以看到 create_agent 执行过程中产生了多种类型的消息。LangChain 定义了一套完整的消息类型系统,主要包括以下几种

create_agent 的消息管理机制与笔者在 深入浅出LangGraph AI Agent智能体开发教程(八)—LangGraph底层API实现ReACT智能体 中讲解的 messages 系统一脉相承。所有对话产生的历史消息都会被智能体完整保存下来,形成完整的对话上下文。智能体在决策时会综合分析所有历史消息,包括原始问题、工具调用记录和观察结果,并基于这些信息进行逐步推理。这种设计使得 create_agent 智能体天然具备多轮对话的能力,能够处理复杂的多步骤任务。

3.3 消息的多种表示方式

在实际编码中,LangChain 提供了灵活的消息表示方法。前面程序中的输出代码实际上是 HumanMessage(question) 的简写形式:

for step in agent.stream(    {'messages': HumanMessage(question)},    stream_mode="values"):    step["messages"][-1].pretty_print()

除了直接使用消息对象外,还可以使用字典来表示消息,这种情况下需要明确指定消息的角色类型:

for step in agent.stream(    {'messages': {"role": "user", "content": question}},    stream_mode="values"):    step["messages"][-1].pretty_print()

其他类型的消息用字典表示的格式如下:

{"role": "system", "content": system_prompt}{"role": "assistant", "content": ai_response}

3.4 消息的元数据与详细信息

前面程序中使用的 pretty_print() 方法用一种美观的格式展示了不同消息的内容,但实际上每条消息都包含了丰富的元数据信息。如果改用以下代码:

for step in agent.stream(    {'messages': question},    stream_mode="values"):    # step["messages"][-1].pretty_print()    print(step['messages'][-1])

查看输出的最后一条消息,可以看到 messages 消息列表中返回了详细的内容结构:其中content是模型的主要输出内容,usage_metadata包含了输入输出token的使用量统计,response_metadata包含了更详细的输入输出信息包括令牌使用,模型提供商,模型名称等。这些丰富的元数据为开发者监控智能体行为、优化性能和分析成本提供了宝贵的信息基础。

四、流式输出模式详解

在大语言模型或交互式智能体的应用中,由于计算复杂度较高,常常会遇到显著的响应延迟。为了提升用户体验,LangChain 提供了多种流式传输模式,让用户能够逐步获取生成内容,而不是等待完整响应。

4.1 不使用流模式

不使用流模式采用invoke方法,在这种情况下会等到产生最终结果后一次性显示出来,而不是逐个token传输:

question="北京的天气怎么样?"print(agent.invoke(    {'messages': question},)['messages'][-1].content)

4.2 值流模式

上面的示例程序中使用的是值流模式,该模式会在智能体的每个执行步骤完成后传输中间数据,让开发者能够观察到完整的决策过程,如上例所示,值流模式会分四次更新数据:HumanMessage(用户输入)、AIMessage(模型初始响应)、ToolMessage(工具调用结果)和最终的AIMessage(总结回答)。

for step in agent.stream(    {'messages': question},    stream_mode="values"):    step['messages'][-1].pretty_print()

4.3 消息流模式

消息流模式会将模型的最终响应内容逐个token输出,而不是分步输出。

question="北京的天气怎么样?"for token, metadata in agent.stream(    {'messages': question},    stream_mode="messages"):    print(f"{token.content}", end="")

4.4 自定义模式

LangChain 还支持用户自定义流式传输,特别是在工具函数中插入自定义的输出内容。通过 get_stream_writer 可以获取图的流式传输对象,当流模式设置为 custom 时,输出将只包含在工具函数中自定义的内容:

from langgraph.config import get_stream_writer@tooldef get_weather(loc:str)->str:    """    根据地点参数可以返回该地点的天气情况    """    writer = get_stream_writer()    writer(f"正在查询天气信息....")    return f"{loc} 天气是晴!气温23°"for chunk in agent.stream(    {'messages': question},    stream_mode="custom"):    print(chunk)

流模式还支持以数组形式指定多个模式,实现同时输出多种类型的内容:

for chunk in agent.stream(    {'messages': question},    stream_mode=["values", "custom"]):    print(chunk)

可以看到,除了 values 模式的四个标准输出外,在工具函数调用阶段还输出了我们自定义的内容。系统通过元组对象对 values 和 custom 输出进行区分:

自定义流式传输的核心优势在于:用户能够在数据逐步生成的过程中就进行自定义处理(例如在工具函数中感知执行阶段),而无需等待所有内容生成完毕。这显著提升了应用的响应速度和用户体验。

五、总结

本篇深入解析LangChain 1.0的create_agent API,涵盖环境搭建、智能体三要素(提示词、模型、工具函数)、消息类型及四种流模式。通过天气助手实例演示智能体完整执行流程,帮助大家快速掌握新一代智能体开发标准。当然本文讲述的仅仅是create_agent的基础使用,这次更新还有更多的核心特性尤其是中间件机制,下期内容我们接着分享,大家敬请期待!(本周出)

《深入浅出LangChain&LangGraph AI Agent 智能体开发》专栏内容源自笔者在实际学习和工作中对 LangChain 与 LangGraph 的深度使用经验,旨在帮助大家系统性地、高效地掌握 AI Agent 的开发方法,在各大技术平台获得了不少关注与支持。目前已更新23讲,正在更新实战篇和LangChain1.0速通指南速通指南篇,并随时补充笔者在实际工作中总结的拓展知识点。如果大家感兴趣,欢迎关注笔者的掘金账号与专栏,也可关注笔者的同名微信公众号 大模型真好玩,每期分享涉及的代码均可在公众号私信: LangChain智能体开发免费获取。

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

LangChain LangChain 1.0 create_agent AI Agent 智能体开发 大模型 工具函数 流式输出 消息机制
相关文章