Appearance
计划与执行
计划与执行是 LangChain 中的高级概念,它允许代理在执行任务之前先制定计划,然后按照计划执行任务。在 LangChain 1.2 中,可以使用 LCEL 语法更灵活地实现计划与执行工作流。
安装依赖
在开始使用计划与执行之前,需要安装以下依赖:
bash
pip install langchain langchain-openai python-dotenv langchain-community google-search-results什么是计划与执行?
计划与执行是一种工作流程,其中代理首先分析任务,制定一个详细的计划,然后按照计划执行任务。这种方法可以帮助代理处理更复杂的任务,提高任务执行的效率和准确性。
计划与执行的工作流程通常包括:
- 分析任务,理解用户的需求
- 制定详细的计划,包括需要执行的步骤
- 按照计划执行任务,使用工具完成各个步骤
- 监控执行过程,根据需要调整计划
- 向用户提供最终结果
计划与执行的优势
计划与执行方法相比直接执行任务有以下优势:
- 更好的任务分解:将复杂任务分解为简单的步骤
- 更高的执行效率:避免不必要的工具调用和重复工作
- 更好的错误处理:在执行前可以识别潜在的问题
- 更透明的执行过程:用户可以看到代理的思考过程
- 更好的结果质量:通过系统的规划和执行,提高结果的质量
实现计划与执行
使用 Plan-and-Execute Agent
LangChain 提供了 PlanAndExecute 代理,它可以先制定计划,然后按照计划执行任务。
初始化 PlanAndExecute Agent
python
from langchain_openai import OpenAI
from langchain.agents import AgentType, initialize_agent, load_tools
# 初始化语言模型
llm = OpenAI(api_key="your-api-key")
# 加载工具
tools = load_tools(["serpapi", "llm-math"], llm=llm)
# 初始化 PlanAndExecute 代理
agent = initialize_agent(
tools=tools,
llm=llm,
agent=AgentType.PLAN_AND_EXECUTE,
verbose=True
)使用 PlanAndExecute Agent
python
# 运行代理
response = agent.run("What is the current temperature in New York? What about Los Angeles? Compare the two temperatures.")
print(response)自定义计划与执行
在 LangChain 1.2 中,可以使用 LCEL 语法创建自定义的计划与执行系统。
示例:创建自定义计划与执行系统
python
from langchain_openai import OpenAI
from langchain_core.prompts import PromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain.tools import BaseTool
from typing import Optional, Type
from pydantic import BaseModel, Field
# 初始化语言模型
llm = OpenAI(api_key="your-api-key")
output_parser = StrOutputParser()
# 创建计划链
plan_template = """You are a helpful assistant. Given a task, create a detailed plan to complete it.
Task: {task}
Plan:"""
plan_prompt = PromptTemplate(template=plan_template, input_variables=["task"])
plan_chain = plan_prompt | llm | output_parser
# 创建执行链
execute_template = """You are a helpful assistant. Given a plan and the current state, execute the next step of the plan.
Plan: {plan}
Current state: {state}
Next step:"""
execute_prompt = PromptTemplate(template=execute_template, input_variables=["plan", "state"])
execute_chain = execute_prompt | llm | output_parser
# 定义工具输入模式
class SearchInput(BaseModel):
query: str = Field(description="搜索查询")
# 创建搜索工具
class SearchTool(BaseTool):
name = "search"
description = "用于搜索网络信息"
args_schema: Type[BaseModel] = SearchInput
def _run(self, query: str) -> str:
# 模拟搜索 API 调用
return f"搜索结果: {query} 的相关信息"
# 初始化工具
search_tool = SearchTool()
# 执行计划与执行流程
def plan_and_execute(task):
# 制定计划
plan = plan_chain.invoke({"task": task})
print("Plan:", plan)
# 初始化状态
state = "开始执行任务"
# 执行计划
steps = plan.split("\n")
for i, step in enumerate(steps):
if step.strip():
print(f"\nExecuting step {i+1}: {step.strip()}")
# 执行步骤
next_step = execute_chain.invoke({"plan": plan, "state": state})
print("Next step:", next_step)
# 使用工具(如果需要)
if "search" in next_step.lower():
query = next_step.split("search for")[-1].strip()
result = search_tool.run(query)
print("Tool result:", result)
state += f"\n执行步骤 {i+1}: {step.strip()}\n工具结果: {result}"
else:
state += f"\n执行步骤 {i+1}: {step.strip()}\n执行结果: {next_step}"
# 生成最终答案
final_template = """You are a helpful assistant. Given a task, a plan, and the execution state, provide a final answer.
Task: {task}
Plan: {plan}
Execution state: {state}
Final answer:"""
final_prompt = PromptTemplate(template=final_template, input_variables=["task", "plan", "state"])
final_chain = final_prompt | llm | output_parser
final_answer = final_chain.invoke({"task": task, "plan": plan, "state": state})
print("\nFinal answer:", final_answer)
return final_answer
# 运行计划与执行流程
result = plan_and_execute("What is the capital of France? What is the population of that city?")
print(result)使用 LCEL 构建计划与执行链
在 LangChain 1.2 中,可以使用 LCEL 语法更优雅地构建计划与执行链。
示例:使用 LCEL 构建计划与执行
python
from langchain_openai import OpenAI
from langchain_core.prompts import PromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnableLambda, RunnablePassthrough
# 初始化语言模型
llm = OpenAI(api_key="your-api-key")
output_parser = StrOutputParser()
# 创建计划链
plan_prompt = PromptTemplate(
template="""You are a helpful assistant. Given a task, create a detailed plan to complete it.
Task: {task}
Plan:""",
input_variables=["task"]
)
plan_chain = plan_prompt | llm | output_parser
# 创建执行链
execute_prompt = PromptTemplate(
template="""You are a helpful assistant. Given a plan and the current state, execute the next step of the plan.
Plan: {plan}
Current state: {state}
Next step:""",
input_variables=["plan", "state"]
)
execute_chain = execute_prompt | llm | output_parser
# 创建最终答案链
final_prompt = PromptTemplate(
template="""You are a helpful assistant. Given a task, a plan, and the execution state, provide a final answer.
Task: {task}
Plan: {plan}
Execution state: {state}
Final answer:""",
input_variables=["task", "plan", "state"]
)
final_chain = final_prompt | llm | output_parser
# 定义执行步骤的函数
def execute_steps(input_data):
task = input_data["task"]
plan = input_data["plan"]
state = "开始执行任务"
steps = plan.split("\n")
for i, step in enumerate(steps):
if step.strip():
next_step = execute_chain.invoke({"plan": plan, "state": state})
state += f"\n执行步骤 {i+1}: {step.strip()}\n执行结果: {next_step}"
return {"task": task, "plan": plan, "state": state}
# 创建完整的计划与执行链
plan_and_execute_chain = (
{"task": RunnablePassthrough()}
| RunnableLambda(lambda x: {"task": x, "plan": plan_chain.invoke(x)})
| RunnableLambda(execute_steps)
| final_chain
)
# 使用链
result = plan_and_execute_chain.invoke("What is the capital of France?")
print(result)计划与执行的最佳实践
1. 明确任务目标
在使用计划与执行方法之前,确保任务目标明确,便于代理制定合理的计划。
2. 选择合适的工具
根据任务的性质,选择合适的工具,确保代理能够完成各个步骤。
3. 监控执行过程
在执行过程中,监控代理的执行情况,确保计划的执行符合预期。
4. 调整计划
根据执行过程中的情况,及时调整计划,确保任务能够顺利完成。
5. 评估结果
任务完成后,评估结果的质量,总结经验教训,提高未来任务的执行效率。
示例:使用计划与执行处理复杂任务
示例:研究一个主题
python
from langchain_openai import OpenAI
from langchain.agents import AgentType, initialize_agent, load_tools
# 初始化语言模型
llm = OpenAI(api_key="your-api-key")
# 加载工具
tools = load_tools(["serpapi", "llm-math"], llm=llm)
# 初始化 PlanAndExecute 代理
agent = initialize_agent(
tools=tools,
llm=llm,
agent=AgentType.PLAN_AND_EXECUTE,
verbose=True
)
# 运行代理
response = agent.run("研究 LangChain 的最新发展,包括新特性、应用案例和未来趋势。")
print(response)示例:解决一个问题
python
from langchain_openai import OpenAI
from langchain.agents import AgentType, initialize_agent, load_tools
# 初始化语言模型
llm = OpenAI(api_key="your-api-key")
# 加载工具
tools = load_tools(["serpapi", "llm-math", "python_repl"], llm=llm)
# 初始化 PlanAndExecute 代理
agent = initialize_agent(
tools=tools,
llm=llm,
agent=AgentType.PLAN_AND_EXECUTE,
verbose=True
)
# 运行代理
response = agent.run("分析过去 5 年全球温度变化趋势,并预测未来 5 年的变化。")
print(response)总结
计划与执行是 LangChain 中的高级概念,它允许代理在执行任务之前先制定计划,然后按照计划执行任务。在 LangChain 1.2 中,可以使用 LCEL 语法更灵活地实现计划与执行工作流。
通过本文的介绍,您应该已经了解了如何使用内置的 PlanAndExecute 代理,以及如何使用 LCEL 语法创建自定义的计划与执行系统。在实际应用中,您可以根据具体需求选择合适的方法,构建功能强大的 LLM 应用。