使用LangChain的LCEL构建智能体

LangChain Expression Language (LCEL)是LangChain提供的一种声明式方法来构建链和智能体。下面我将介绍如何使用LCEL构建一个智能体(Agent)。

基本概念

LCEL允许你通过管道操作符(|)将组件连接起来,构建复杂的处理流程。智能体通常由以下几个核心组件组成:

  1. 工具(Tools): 智能体可以调用的函数
  2. 智能体(Agent): 决定调用哪个工具的逻辑
  3. 记忆(Memory): 存储对话历史
  4. 执行器(Executor): 协调智能体的运行

构建智能体的步骤

1. 定义工具

首先,我们需要定义智能体可以使用的工具:

from langchain.tools import tool

@tool
def search(query: str) -> str:
    """用于搜索最新信息的工具"""
    # 这里可以实现实际的搜索逻辑
    return f"关于 {query} 的搜索结果"

@tool
def calculator(expression: str) -> str:
    """用于计算数学表达式的工具"""
    try:
        result = eval(expression)
        return f"计算结果: {result}"
    except:
        return "无法计算该表达式"

tools = [search, calculator]

2. 创建提示模板

定义智能体的提示模板,指导其行为:

from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder

prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一个有用的助手。尽可能准确地回答问题。"),
    MessagesPlaceholder("chat_history", optional=True),
    ("human", "{input}"),
    MessagesPlaceholder("agent_scratchpad"),
])

3. 选择LLM并绑定工具

选择一个语言模型并将工具绑定到它:

from langchain.chat_models import ChatOpenAI

# 使用gpt-3.5-turbo模型
llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)

# 将工具绑定到LLM
llm_with_tools = llm.bind_tools(tools)

4. 创建智能体

使用LCEL组合这些组件:

from langchain.agents import create_openai_tools_agent

agent = create_openai_tools_agent(llm_with_tools, tools, prompt)

5. 创建执行器

创建智能体执行器,可以添加记忆功能:

from langchain.agents import AgentExecutor
from langchain.memory import ConversationBufferMemory

memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True)

agent_executor = AgentExecutor(
    agent=agent,
    tools=tools,
    memory=memory,
    verbose=True  # 显示详细执行过程
)

6. 使用智能体

现在可以运行智能体了:

response = agent_executor.invoke({"input": "3的平方加上4的平方等于多少?"})
print(response["output"])

response = agent_executor.invoke({"input": "搜索最新的AI新闻"})
print(response["output"])

完整示例代码

from langchain.tools import tool
from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain.chat_models import ChatOpenAI
from langchain.agents import create_openai_tools_agent, AgentExecutor
from langchain.memory import ConversationBufferMemory

# 1. 定义工具
@tool
def search(query: str) -> str:
    """用于搜索最新信息的工具"""
    return f"关于 {query} 的搜索结果"

@tool
def calculator(expression: str) -> str:
    """用于计算数学表达式的工具"""
    try:
        result = eval(expression)
        return f"计算结果: {result}"
    except:
        return "无法计算该表达式"

tools = [search, calculator]

# 2. 创建提示模板
prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一个有用的助手。尽可能准确地回答问题。"),
    MessagesPlaceholder("chat_history", optional=True),
    ("human", "{input}"),
    MessagesPlaceholder("agent_scratchpad"),
])

# 3. 选择LLM并绑定工具
llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)
llm_with_tools = llm.bind_tools(tools)

# 4. 创建智能体
agent = create_openai_tools_agent(llm_with_tools, tools, prompt)

# 5. 创建执行器
memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True)
agent_executor = AgentExecutor(
    agent=agent,
    tools=tools,
    memory=memory,
    verbose=True
)

# 6. 使用智能体
response = agent_executor.invoke({"input": "3的平方加上4的平方等于多少?"})
print(response["output"])

response = agent_executor.invoke({"input": "搜索最新的AI新闻"})
print(response["output"])

高级用法

自定义输出解析

你可以自定义智能体的输出处理:

from langchain.schema.runnable import RunnablePassthrough

def parse_output(output):
    # 自定义输出处理逻辑
    return f"处理后的结果: {output}"

agent_with_parsing = agent_executor | parse_output

添加中间步骤

在LCEL中,你可以轻松添加中间处理步骤:

from langchain.schema.runnable import RunnableLambda

def preprocess_input(input_dict):
    input_dict["input"] = input_dict["input"].upper()
    return input_dict

full_chain = (
    RunnableLambda(preprocess_input) 
    | agent_executor
)

流式输出

LCEL支持流式输出:

for chunk in agent_executor.stream({"input": "3的平方加上4的平方等于多少?"}):
    print(chunk)

通过LCEL构建智能体,你可以获得高度模块化和可组合的架构,便于调试和维护。

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐