探索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)
- 定义工具 :以计算单词长度的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]
-
创建提示
:使用
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")
]
)
- 绑定工具到语言模型 :
llm_with_tools = llm.bind_tools(tools)
- 创建代理 :导入实用函数格式化中间步骤并解析输出,代码如下:
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)
- 测试代理 :
list(agent_executor.stream({"input": "How many letters in the word first"}))
运行上述代码,代理将成功使用
get_word_length
工具回答问题。
-
添加记忆
:若要让代理记住之前的交互并进行更自然的对话,可按以下步骤操作:
- 在提示中添加聊天历史占位符:
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
-
定义工具和记忆
:
- 创建允许代理访问和检索知识库信息的工具:
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")
- 初始化代理 :
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)
-
监控和改进
:
- 持续监控客户支持自动化系统的性能。
- 收集客户反馈,分析代理响应的有效性。
- 根据反馈和确定的改进领域迭代和改进知识库和代理的能力。
以下是一个完整的基本客户支持自动化代码示例:
%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为我们提供了一个强大的平台,让我们能够轻松地开发出满足各种需求的智能代理,未来的应用前景十分广阔。
超级会员免费看
12

被折叠的 条评论
为什么被折叠?



