25、探索LangChain代理:从基础到实践应用

探索LangChain代理:从基础到实践应用

1. LangChain代理基础

在使用LangChain构建代理时,了解其基本概念和不同版本的差异至关重要。以查询旧金山天气为例,代理会调用 tavily_search_results_json 工具搜索相关信息,并总结出当前天气状况,包括温度、风速和湿度。

在快速入门阶段,我们学习了创建简单代理并逐步增强其记忆功能,还学会了使用 AIMessage 和 HumanMessage 传递聊天历史和构建消息结构。

2. LangChain v0.1与v0.2代理的差异

LangChain v0.1引入了代理作为构建AI应用的强大工具,但随着库的发展,v0.2版本对代理框架进行了重大改进,主要差异如下表所示:
| 差异点 | LangChain v0.1 | LangChain v0.2 |
| — | — | — |
| 代理初始化 | 需分别指定代理类型、工具、语言模型和其他参数 | 可使用 initialize_agent 函数,根据提供的工具和语言模型自动选择合适的代理类型 |
| 代理类型 | - | 引入新的和改进的代理类型,如 zero-shot-react-description 代理,支持更好的自然语言动作描述; conversational-react-description 代理针对对话式AI应用进行了优化 |
| 工具集成 | - | 简化工具与代理的集成过程, load_tools 函数支持更多开箱即用的工具;可通过子类化 BaseTool 类创建自定义工具 |
| 错误处理和调试 | - | 引入更好的错误处理机制; initialize_agent 函数中的 verbose 参数可启用详细日志记录 |

以下是LangChain v0.2中简化代理初始化的示例代码:

from langchain.agents import load_tools
from langchain.agents import initialize_agent
from langchain.llms import OpenAI

# 加载必要的工具
tools = load_tools(["serpapi", "llm-math"], llm=OpenAI(temperature=0))

# 初始化代理
agent = initialize_agent(tools, OpenAI(temperature=0), agent="zero-shot-react-description", verbose=True)

# 使用查询运行代理
query = "What is the capital of France? What is the population of that city?"
response = agent.run(query)
print(response)

从上述代码可以看出, initialize_agent 函数使初始化过程更加直观和简单。

3. 创建自定义代理

创建自定义代理的步骤如下:
1. 加载语言模型 :使用OpenAI的 ChatOpenAI 模型,示例代码如下:

from langchain_openai import ChatOpenAI
llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)
  1. 定义工具 :以计算单词长度的Python函数为例,代码如下:
from langchain.agents import tool

@tool
def get_word_length(word: str) -> int:
    """Returns the length of a word."""
    return len(word)

get_word_length.invoke("abc")  # 输出: 3

tools = [get_word_length]
  1. 创建提示 :使用 ChatPromptTemplate 创建提示,代码如下:
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder

prompt = ChatPromptTemplate.from_messages(
    [
        (
            "system",
            "You are a very powerful assistant, but don't know current events"
        ),
        ("user", "{input}"),
        MessagesPlaceholder(variable_name="agent_scratchpad")
    ]
)
  1. 绑定工具到语言模型 :
llm_with_tools = llm.bind_tools(tools)
  1. 创建代理 :导入实用函数格式化中间步骤并解析输出,代码如下:
from langchain.agents.format_scratchpad.openai_tools import format_to_openai_tool_messages
from langchain.agents.output_parsers.openai_tools import OpenAIToolsAgentOutputParser

agent = (
    {
        "input": lambda x: x["input"],
        "agent_scratchpad": lambda x: format_to_openai_tool_messages(x["intermediate_steps"])
    }
    | prompt
    | llm_with_tools
    | OpenAIToolsAgentOutputParser()
)

from langchain.agents import AgentExecutor
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
  1. 测试代理 :
list(agent_executor.stream({"input": "How many letters in the word first"}))

运行上述代码,代理将成功使用 get_word_length 工具回答问题。

  1. 添加记忆 :若要让代理记住之前的交互并进行更自然的对话,可按以下步骤操作:
    • 在提示中添加聊天历史占位符:
MEMORY_KEY = "chat_history"
prompt = ChatPromptTemplate.from_messages(
    [
        (
            "system",
            "You are a very powerful assistant, but bad at calculating lengths of words."
        ),
        MessagesPlaceholder(variable_name=MEMORY_KEY),
        ("user", "{input}"),
        MessagesPlaceholder(variable_name="agent_scratchpad")
    ]
)
- 设置列表跟踪聊天历史:
from langchain_core.messages import AIMessage, HumanMessage
chat_history = []
- 更新代理和`AgentExecutor`以包含聊天历史:
agent = (
    {
        "input": lambda x: x["input"],
        "agent_scratchpad": lambda x: format_to_openai_tool_messages(x["intermediate_steps"]),
        "chat_history": lambda x: x["chat_history"]
    }
    | prompt
    | llm_with_tools
    | OpenAIToolsAgentOutputParser()
)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
- 跟踪输入和输出作为聊天历史:
input1 = "how many letters in the word first?"
result = agent_executor.invoke({"input": input1, "chat_history": chat_history})
chat_history.extend(
    [
        HumanMessage(content=input1),
        AIMessage(content=result["output"])
    ]
)
agent_executor.invoke({"input": "is that a real word?", "chat_history": chat_history})
4. 代理的实际应用 - 客户支持自动化

对于有不断增长客户群的企业,使用代理自动化和简化客户支持流程是一个不错的选择。以下是实现客户支持自动化的步骤:
1. 识别常见客户咨询 :
- 分析客户支持数据,找出最常问的问题和常见问题。
- 将这些咨询分类为不同的主题,如产品信息、故障排除、账单等。
2. 创建知识库 :
- 编制涵盖已识别主题的全面知识库,为常见问题提供清晰简洁的答案。
- 将知识库组织成结构化格式,如常见问题解答页面、产品文档或故障排除指南。
3. 设置代理 :
- 使用LangChain代理框架构建客户支持自动化系统。
- 安装并导入必要的库:

%pip install --upgrade --quiet langchain-openai tavily-python langchain_community langchain_openai
from langchain.agents import initialize_agent, Tool
from langchain.llms import OpenAI
from langchain.chains import ConversationChain
from langchain.memory import ConversationBufferMemory
  1. 定义工具和记忆 :
    • 创建允许代理访问和检索知识库信息的工具:
def search_knowledge_base(query):
    # 实现基于查询搜索知识库的逻辑
    # 返回最相关的答案或信息
    pass

tools = [
    Tool(
        name="Knowledge Base Search",
        func=search_knowledge_base,
        description="Useful for searching the knowledge base for answers to customer inquiries."
    )
]
- 设置内存对象存储对话历史:
memory = ConversationBufferMemory(memory_key="chat_history")
  1. 初始化代理 :
agent = initialize_agent(
    tools,
    OpenAI(temperature=0),
    agent="conversational-react-description",
    verbose=True,
    memory=memory
)
  1. 将代理集成到客户支持渠道 :
    • 实现用户界面,如聊天机器人或网页表单,让客户与代理交互。
    • 使用代理处理传入的客户咨询:
def handle_inquiry(inquiry):
    response = agent.run(inquiry)
    return response

# 示例用法
customer_inquiry = "How can I reset my account password?"
response = handle_inquiry(customer_inquiry)
print(response)
  1. 监控和改进 :
    • 持续监控客户支持自动化系统的性能。
    • 收集客户反馈,分析代理响应的有效性。
    • 根据反馈和确定的改进领域迭代和改进知识库和代理的能力。

以下是一个完整的基本客户支持自动化代码示例:

%pip install --upgrade --quiet langchain-openai tavily-python langchain_community langchain_openai
from langchain.agents import initialize_agent, Tool
from langchain.llms import OpenAI
from langchain.chains import ConversationChain
from langchain.memory import ConversationBufferMemory
import os
from dotenv import load_dotenv

# 从.env文件加载环境变量
load_dotenv()

# 从环境变量获取OpenAI API密钥
OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")

# 导入新的聊天完成API
os.environ["OPENAI_API_KEY"] = "Your openAI key"

# 定义知识库搜索函数
def search_knowledge_base(query):
    # 实现基于查询搜索知识库的逻辑
    # 返回最相关的答案或信息
    # 这里是一个返回预定义响应的简单示例
    if "password reset" in query.lower():
        return "To reset your account password, please follow these steps:\n1. Go to the login page.\n2. Click on the 'Forgot Password' link.\n3. Enter your registered email address.\n4. Check your email inbox for a password reset link.\n5. Follow the instructions in the email to create a new password."
    else:
        return "I apologize, but I couldn't find a specific answer to your question in our knowledge base. Please provide more details or contact our support team directly for further assistance."

# 设置工具和内存
tools = [
    Tool(
        name="Knowledge Base Search",
        func=search_knowledge_base,
        description="Useful for searching the knowledge base for answers to customer inquiries."
    )
]
memory = ConversationBufferMemory(memory_key="chat_history")

# 初始化代理
agent = initialize_agent(
    tools,
    OpenAI(temperature=0),
    agent="conversational-react-description",
    verbose=True,
    memory=memory
)

# 处理客户咨询
def handle_inquiry(inquiry):
    response = agent.run(inquiry)
    return response

# 示例用法
customer_inquiry = "How can I reset my account password?"
response = handle_inquiry(customer_inquiry)
print(response)

运行此代码,代理将输出重置账户密码的预定义响应。

通过以上步骤和示例,我们可以看到如何使用LangChain构建和定制智能代理,以满足不同的实际需求,使AI应用更加高效和有效。

探索LangChain代理:从基础到实践应用

5. 代理类型及适用场景分析

不同类型的代理在LangChain中有各自独特的特点和适用场景,以下为您详细介绍:
| 代理类型 | 特点 | 适用场景 |
| — | — | — |
| Zero - Shot - React代理 | 无需示例即可根据任务描述执行操作,快速响应新任务 | 处理临时、多样化的任务,如简单的信息查询 |
| 结构化聊天代理 | 适合处理具有多个输入的工具,能更好地组织对话结构 | 处理复杂的多步骤任务,如多参数的查询或操作 |
| ReAct代理 | 结合推理和行动,能在执行过程中进行推理和决策 | 需要逻辑推理和逐步执行的任务,如问题解决类任务 |
| 对话代理 | 针对对话式AI应用进行优化,能进行自然、连贯的对话 | 聊天机器人、客户支持等对话场景 |

6. 代理开发中的关键要点

在开发代理时,有几个关键要点需要特别注意:
- 明确目标 :在设计代理之前,要清晰地定义其目标,这是确保代理有效工作的基础。例如,如果是开发客户支持代理,目标就是高效准确地回答客户问题。
- 工具选择与描述 :
- 选择合适的工具是提升代理能力的关键。要根据代理的目标和任务需求选择工具,如搜索工具、计算工具等。
- 对工具进行清晰、简洁的描述至关重要。代理需要通过工具描述来理解如何使用工具,例如在定义 get_word_length 工具时,清晰的文档字符串能帮助代理正确调用该工具。
- 添加记忆 :为代理添加记忆功能可以使其进行更自然、上下文感知的对话。如在客户支持场景中,代理能记住客户之前的问题,提供更连贯的回答。

7. 代理开发流程总结

下面是一个使用mermaid绘制的代理开发流程图,展示了从设计到部署的主要步骤:

graph LR
    classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px;
    classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
    classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px;

    A([开始设计代理]):::startend --> B(定义代理目标):::process
    B --> C(选择合适的代理类型):::process
    C --> D(选择和定义工具):::process
    D --> E(加载语言模型):::process
    E --> F(创建提示):::process
    F --> G(绑定工具到语言模型):::process
    G --> H(创建代理):::process
    H --> I{是否需要记忆功能?}:::decision
    I -->|是| J(添加记忆功能):::process
    I -->|否| K(测试代理):::process
    J --> K
    K --> L(优化和改进):::process
    L --> M([部署代理]):::startend
8. 总结与展望

通过前面的介绍,我们了解了如何使用LangChain构建、定制和部署智能代理。这些代理可以根据具体需求进行定制,自主处理复杂任务,使AI应用更加高效和有效。

在未来的开发中,我们可以进一步探索以下方向:
- 集成更多工具 :不断扩展代理的工具库,使其能够处理更广泛的任务,如集成更多的API工具、数据分析工具等。
- 优化性能 :通过优化代理的算法和架构,提高其响应速度和处理效率,特别是在处理大规模数据和复杂任务时。
- 多模态支持 :使代理能够处理多种模态的信息,如图像、语音等,进一步拓展其应用场景,如开发支持语音交互的客户支持代理。

总之,LangChain为我们提供了一个强大的平台,让我们能够轻松地开发出满足各种需求的智能代理,未来的应用前景十分广阔。

相关推荐

LangChain框架解析:从核心概念到RAG应用实战

大语言模型应用开发中,如何高效连接模型与外部数据、构建复杂工作流是开发者面临的核心挑战。其技术原理在于通过模块化设计,将模型调用、数据检索、工作流编排等环节标准化。这一设计带来的技术价值是显著降低了LLM应用开发的复杂性,提升了代码的可维护性和组件的可替换性。在应用场景上,它特别适用于构建基于私有知识的智能问答系统、具备长期记忆的对话机器人以及自动化内容处理流程。本文聚焦于LangChain框架,深入剖析其六大核心组件——模型I/O、数据连接、链、代理、记忆与回调,并通过实战演示如何利用其构建一个本地知识库

weixin_30376083的博客 353

LLM应用开发架构全解析:从LangChain组件到生产部署实战指南

大语言模型应用开发正从实验性探索转向工程化实践,其核心在于构建可扩展、可维护的系统架构。理解LLM应用的基本原理,需要从模型调用、提示工程、上下文管理等基础概念入手,这些技术共同支撑起智能应用的认知与交互能力。在工程实践中,检索增强生成技术通过结合外部知识库有效解决了模型知识局限与实时性不足的问题,而智能代理框架则赋予应用自主决策与工具调用的行动能力。这些技术的价值在于将大语言模型从对话接口升级为能够处理复杂任务、集成企业数据的生产级系统。典型的应用场景包括智能客服、知识库问答、自动化工作流等。本文以Lan

weixin_30770783的博客 322

CMOS传输门实战:如何用模拟开关优化你的电路设计(附常见问题排查)

本文深入探讨了CMOS传输门在电路设计中的实战应用与优化策略。文章从核心参数选型入手,详细分析了导通电阻、电荷注入等关键特性对电路性能的影响,并提供了多路复用器构建、精密电路应用等实战架构。同时,重点分享了PCB布局、电源去耦的工程细节,以及开关不导通、信号失真、高频性能不足等常见问题的系统性排查指南,旨在帮助硬件工程师充分发挥CMOS模拟开关的效能,提升电路设计的可靠性与精度。

js777的博客 449

若依(RuoYi)框架从零到部署:Spring Boot+Vue权限系统完整配置指南

在Java企业级应用开发中,Spring Boot作为构建微服务和单体应用的基石,极大地简化了项目初始化和配置流程。其核心原理在于通过自动配置和起步依赖,快速整合数据访问、安全认证、缓存等常用模块,显著提升开发效率。这一技术价值在需要快速构建后台管理系统的场景中尤为突出,例如权限管理、用户角色分配等通用需求。若依(RuoYi)框架正是基于Spring Boot和Vue.js的优秀实践,它封装了RBAC权限模型、代码生成器等高频功能,提供了开箱即用的解决方案。本文聚焦于若依框架的【环境配置】与【项目部署】,通

weixin_33984032的博客 455

TCGA之GDC-client工具下载安装与使用

文章主要是对GDC-client工具下载TCGA数据库数据整个过程的一个记录 1.下载GDC-client工具 GDC-client工具网址:GDC Data Transfer Tool | NCI Genomic Data Commons (cancer.gov) 我这里下的是上图中红圈中的版本, 2.解压安装 从网上了解的是不能解压到带中文的路径里,解压后是一个.exe文件,为了能直接在cmd命令行下使用,将其加入系统环境: 点击新建之后,输入将文件解压到的路径,然后...

better_strong的博客 1万+

STM32入门教程:无人机控制

我们将会一步一步引导您完成无人机的控制代码,包括无人机的姿态控制、飞行控制和通信控制等。第三步:配置无人机姿态控制 无人机的姿态控制是指控制无人机在空中的倾斜和转向。为了实现姿态控制,我们需要使用加速度计和陀螺仪传感器来获取无人机的姿态信息,并使用PID控制算法来控制无人机的姿态。在这一步骤中,您需要根据您使用的具体传感器和控制算法的要求进行更详细的配置和编码。在通信控制中,您需要考虑到通信的稳定性和可靠性。第五步:通信控制 无人机的通信控制是指与地面站或其他设备进行通信,传输飞行数据和接收飞行指令。

m0_75244442的博客 745

在 SAP S/4HANA Public Cloud 中做产品扩展:从 Key User 到 ABAP Cloud 与 BTP 的三轨实践指南

摘要:SAP S/4HANA Public Cloud 提供三种扩展方式(key user、developer extensibility 和 side-by-side),遵循 clean core 原则确保升级稳定。key user 扩展适合无代码轻量改良,developer extensibility 用于受控 ABAP 开发,side-by-side 则适用于云原生独立应用。文章通过销售订单优先级字段、退货审批微服务和采购校验等案例,说明不同扩展路径的适用场景与实现方法,帮助开发者在三系统景观中合理选

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 292

手把手教你学simulink(57.2)--电励磁同步电动机场景示例:基于Simulink的矢量控制(Field-Oriented Control, FOC)电励磁同步电动机

在某电动汽车驱动系统中,采用了本项目开发的带有矢量控制功能的电励磁同步电动机驱动系统,结合三相逆变器实现了对电动机的高效控制。在某工业驱动系统中,采用了本项目开发的带有矢量控制功能的电励磁同步电动机驱动系统,结合三相逆变器实现了对电动机的精确控制。经过实际测试,该系统的应用使得生产效率提高了10%,并且在高负载条件下,电动机的温升得到了有效控制,延长了电动机的使用寿命。通过本项目的实施,我们成功配置了三相交流电源、三相逆变器和电励磁同步电动机的参数,并实现了对电动机的精确控制。

MHD0815的博客 941

10. 重磅!Spring AI 1.0 正式发布,Java 开发者的 AI神器!

重磅!Spring AI 1.0 正式发布,Java 开发者的 AI神器! 全网最详细的Spring AI 文章,每章都会提供代码入口,让你更容易得入门和理解Spring AI 相关概念,直接节约你百分之六十的学习成本时间。

gorgor在码农 1063

ESP32-S3驱动OV3660摄像头原理图设计,已量产

本文重点拆四条主线:多来源输入电源如何收敛到 3V3,摄像头三路供电如何拆分,ESP32-S3 如何接住 DVP 数据流与外部存储,以及音频/补光/传感外围怎样挂到主控边上。至于最终图像帧率、算法策略和软件时序,当前原理图未体现。

不脱发的程序猿 973

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

上一篇: 76、Arthur - Merlin 流式复杂度解析
下一篇: 26、AI与机器学习:重塑智慧城市与医疗健康的未来
php55
博客等级 码龄15年 51粉丝 1553原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值