【langchain示例】通过LCEL构建Agent,查询二地气温差

232 阅读1分钟
from langchain import hub
from langchain_openai import OpenAI
from langchain.agents import load_tools
from langchain.agents import AgentExecutor
from langchain.agents.format_scratchpad import format_log_to_str
from langchain.tools.render import render_text_description
from langchain.agents.output_parsers import ReActSingleInputOutputParser

# 通过 python-dotenv 加载环境变量
from dotenv import load_dotenv
load_dotenv()

# 准备大语言模型:这里需要 OpenAI,可以方便地按需停止推理
llm = OpenAI()
llm_with_stop = llm.bind(stop=["\nObservation"])

# 准备我们的工具:这里用到 DuckDuckGo 搜索引擎,和一个基于 LLM 的计算器
tools = load_tools(["ddg-search", "llm-math"], llm=llm)

# 准备核心提示词:这里从 LangChain Hub 加载了 ReAct 模式的提示词,并填充工具的文本描述
prompt = hub.pull("hwchase17/react")
prompt = prompt.partial(
    tools=render_text_description(tools),
    tool_names=", ".join([t.name for t in tools]),
)

# 构建 Agent 的工作链:这里最重要的是把中间步骤的结构要保存到提示词的 agent_scratchpad 中
agent = (
    {
        "input": lambda x: x["input"],
        "agent_scratchpad": lambda x: format_log_to_str(x["intermediate_steps"]),
    }
    | prompt
    | llm_with_stop
    | ReActSingleInputOutputParser()
)

# 构建 Agent 执行器:执行器负责执行 Agent 工作链,直至得到最终答案(的标识)并输出回答
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
res = agent_executor.invoke({"input": "今天上海和北京的气温差几度?"})
print(res)