Source code for langchain.agents.react.agent
from __future__ import annotations
from typing import List, Optional, Sequence, Union
from langchain_core.language_models import BaseLanguageModel
from langchain_core.prompts import BasePromptTemplate
from langchain_core.runnables import Runnable, RunnablePassthrough
from langchain_core.tools import BaseTool
from langchain.agents import AgentOutputParser
from langchain.agents.format_scratchpad import format_log_to_str
from langchain.agents.output_parsers import ReActSingleInputOutputParser
from langchain.tools.render import ToolsRenderer, render_text_description
[docs]def create_react_agent(
llm: BaseLanguageModel,
tools: Sequence[BaseTool],
prompt: BasePromptTemplate,
output_parser: Optional[AgentOutputParser] = None,
tools_renderer: ToolsRenderer = render_text_description,
*,
stop_sequence: Union[bool, List[str]] = True,
) -> Runnable:
"""创建一个使用ReAct提示的代理。
参数:
llm: 用作代理的LLM。
tools: 该代理可以访问的工具。
prompt: 要使用的提示。有关更多信息,请参见下面的提示部分。
output_parser: 用于解析LLM输出的AgentOutputParser。
tools_renderer: 控制工具如何转换为字符串并传递到LLM。默认为`render_text_description`。
stop_sequence: 布尔值或字符串列表。
如果为True,则添加一个停止令牌"Observation:"以避免产生幻觉。
如果为False,则不添加停止令牌。
如果是字符串列表,则使用提供的列表作为停止令牌。
默认为True。如果您使用的LLM不支持停止序列,则可以将其设置为False。
返回:
代表一个代理的可运行序列。它接受与传入的提示相同的所有输入变量。它返回一个AgentAction或AgentFinish。
示例:
.. code-block:: python
from langchain import hub
from langchain_community.llms import OpenAI
from langchain.agents import AgentExecutor, create_react_agent
prompt = hub.pull("hwchase17/react")
model = OpenAI()
tools = ...
agent = create_react_agent(model, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools)
agent_executor.invoke({"input": "hi"})
# 与聊天历史记录一起使用
from langchain_core.messages import AIMessage, HumanMessage
agent_executor.invoke(
{
"input": "what's my name?",
# 请注意,chat_history是一个字符串
# 因为这个提示是针对LLM而不是聊天模型的
"chat_history": "Human: My name is Bob
AI: Hello Bob!",
}
)
提示:
提示必须具有以下输入键:
* `tools`: 包含每个工具的描述和参数。
* `tool_names`: 包含所有工具名称。
* `agent_scratchpad`: 包含先前代理操作和工具输出的字符串。
这是一个示例:
.. code-block:: python
from langchain_core.prompts import PromptTemplate
template = '''尽力回答以下问题。您可以访问以下工具:
{tools}
使用以下格式:
问题: 您必须回答的输入问题
思考: 您应该始终考虑该做什么
动作: 要执行的操作,应该是[{tool_names}]中的一个
动作输入: 操作的输入
观察: 操作的结果
... (这个思考/动作/动作输入/观察可以重复N次)
思考: 我现在知道最终答案
最终答案: 原始输入问题的最终答案
开始!
问题: {input}
思考:{agent_scratchpad}'''
prompt = PromptTemplate.from_template(template)
""" # noqa: E501
missing_vars = {"tools", "tool_names", "agent_scratchpad"}.difference(
prompt.input_variables + list(prompt.partial_variables)
)
if missing_vars:
raise ValueError(f"Prompt missing required variables: {missing_vars}")
prompt = prompt.partial(
tools=tools_renderer(list(tools)),
tool_names=", ".join([t.name for t in tools]),
)
if stop_sequence:
stop = ["\nObservation"] if stop_sequence is True else stop_sequence
llm_with_stop = llm.bind(stop=stop)
else:
llm_with_stop = llm
output_parser = output_parser or ReActSingleInputOutputParser()
agent = (
RunnablePassthrough.assign(
agent_scratchpad=lambda x: format_log_to_str(x["intermediate_steps"]),
)
| prompt
| llm_with_stop
| output_parser
)
return agent