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为我们提供了一个强大的平台,让我们能够轻松地开发出满足各种需求的智能代理,未来的应用前景十分广阔。

【四轴飞行器】非线性三自由度四轴飞行器模拟器研究(Matlab代码实现)内容概要:本文围绕非线性三自由度四轴飞行器的建模与仿真展开,重点介绍了基于Matlab的飞行器动力学模型构建与控制系统设计方法。通过对四轴飞行器非线性运动方程的推导,建立其在三维空间中的姿态与位置动态模型,并采用数值仿真手段实现飞行器在复杂环境下的行为模拟。文中详细阐述了系统状态方程的构建、控制输入设计以及仿真参数设置,并结合具体代码实现展示了如何对飞行器进行稳定控制与轨迹跟踪。此外,文章还提到了多种优化与控制策略的应用背景,如模型预测控制、PID控制等,突出了Matlab工具在无人机系统仿真中的强大功能。; 适合人群:具备一定自动控制理论基础和Matlab编程能力的高校学生、科研人员及从事无人机系统开发的工程师;尤其适合从事飞行器建模、控制算法研究及相关领域研究的专业人士。; 使用场景及目标:①用于四轴飞行器非线性动力学建模的教学与科研实践;②为无人机控制系统设计(如姿态控制、轨迹跟踪)提供仿真验证平台;③支持高级控制算法(如MPC、LQR、PID)的研究与对比分析; 阅读建议:建议读者结合文中提到的Matlab代码与仿真模型,动手实践飞行器建模与控制流程,重点关注动力学方程的实现与控制器参数调优,同时可拓展至多自由度或复杂环境下的飞行仿真研究。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值