13|代理(下):结构化工具对话、Self-Ask with Search以及Plan and execute代理
什么是结构化工具
- 深入了解
- 翻译
- 解释
- 总结
本文介绍了LangChain实战课中代理技术的进阶应用,包括结构化工具对话代理、Self-Ask with Search自主询问搜索代理以及Plan and execute计划与执行代理。文章首先探索了LangChain程序内部机制,详细介绍了结构化工具对话代理的应用,以及使用Playwright工具包实现结构化工具对话代理的具体步骤。通过示例代码展示了代理如何通过组合调用Playwright工具包中的工具,自动完成任务。接着介绍了Self-Ask with Search代理,展示了它在解决多跳问题时的应用,以及适合解决多跳问题的原因。最后,介绍了Plan and execute代理,通过示例展示了其计划和执行的流程。文章还总结了LangChain中常见的代理类型和各个组件的简明总结。整体而言,本文生动展示了代理技术的应用和工作原理,对于想要深入了解代理技术的读者具有很高的参考价值。
《LangChain 实战课》,新⼈⾸单¥59
全部留言(18)
- 最新
- 精选
- 陈东老师节日快乐。
作者回复: 中秋快乐!🏮
2023-09-30归属地:重庆4 - 抽象派使用结构化工具对话代理的实例代码报错,请问怎么改?。具体输出如下: Traceback (most recent call last): File "/Users/abc/project/python/learnlangchain/struct_tool.py", line 17, in <module> agent_chain = initialize_agent( ^^^^^^^^^^^^^^^^^ File "/opt/homebrew/lib/python3.11/site-packages/langchain/agents/initialize.py", line 57, in initialize_agent agent_obj = agent_cls.from_llm_and_tools( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/homebrew/lib/python3.11/site-packages/langchain/agents/structured_chat/base.py", line 132, in from_llm_and_tools _output_parser = output_parser or cls._get_default_output_parser(llm=llm) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/homebrew/lib/python3.11/site-packages/langchain/agents/structured_chat/base.py", line 65, in _get_default_output_parser return StructuredChatOutputParserWithRetries.from_llm(llm=llm) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/homebrew/lib/python3.11/site-packages/langchain/agents/structured_chat/output_parser.py", line 82, in from_llm output_fixing_parser = OutputFixingParser.from_llm( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/homebrew/lib/python3.11/site-packages/langchain/output_parsers/fix.py", line 45, in from_llm return cls(parser=parser, retry_chain=chain) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/homebrew/lib/python3.11/site-packages/langchain/load/serializable.py", line 74, in __init__ super().__init__(**kwargs) File "pydantic/main.py", line 339, in pydantic.main.BaseModel.__init__ File "pydantic/main.py", line 1076, in pydantic.main.validate_model File "pydantic/fields.py", line 860, in pydantic.fields.ModelField.validate pydantic.errors.ConfigError: field "retry_chain" not yet prepared so type is still a ForwardRef, you might need to call OutputFixingParser.update_forward_refs().
作者回复: 同学我在Github上更新了代码,你用我的代码跑一遍,看看是否仍出错。
2023-09-28归属地:广东42 - Geek_617b3f老师请问下,ReAct框架的原理是:”大语言模型可以通过生成推理痕迹和任务特定行动来实现更大的协同作用。引导模型生成一个任务解决轨迹:观察环境 - 进行思考 - 采取行动,也就是观察 - 思考 - 行动。那么,再进一步进行简化,就变成了推理 - 行动,也就是 Reasoning-Acting 框架。“ 那么Plan and execute的方式对做Plan的那个大模型的要求不是更高么?因为做计划的那个大模型,直接就根据问题做计划了,过程中没有接收任何反馈,不像ReAct方式那样,中间是接收一些信息的。 另外这个做计划的过程,不是思维链的过程么,还是有什么区别呢? 所以…… 不是很理解为何Plan and execute是一个更灵活、更新的一种方式。还请老师答疑解惑,谢谢!
作者回复: 对了对了,同学正解。 ReAct 更注重过程中的动态调整和信息接收,适用于那些需要根据不断变化的信息来调整策略的任务。 Plan and Execute 则更注重一开始的全面规划,适用于那些一开始就能获得所有必要信息,并需要一次性制定完整计划的任务。 无论是ReAct框架还是Plan and Execute策略,都可以被视为思维链的一部分。它们只是思维链在不同任务中的具体表现形式。 没说Plan and execute是一个更灵活的,更好的。新倒是新,所以在LangChain实验库里面,我写文章时候,还没有正式发布。
2023-11-16归属地:广东1 - 抽象派老师,在使用plan and execute代理时,推理的上下文比较大的时候,结果就不太如意了。例如:一个go项目,我要求给指定的方法增加一个日志输出的代码逻辑,然后代理读取了整个源代码文件,最后代码是加了,但是只有那个方法还保留着是完整的,其他的代码就没了。请问这种情况有什么手段可以优化吗?
作者回复: 使用plan and execute代理在处理大量上下文时确实有其局限性,因为GPT的输入令牌限制可能导致上下文被截断。为了更好地处理大型项目或源文件,我觉得可能需要把程序分片,只提供摘要或具体的上下文,而不是发送整个源代码文件,只发送与任务直接相关的代码段。提供具体的修改请求,让每一步都可以在较小的上下文中完成。
2023-10-11归属地:广东1 - Final中秋快乐 ~
作者回复: 中秋快乐!🏮
2023-09-29归属地:北京1 - iLeGeND老师提下代码
作者回复: 代码已更!
2023-09-28归属地:湖北1 - Geek2808对于StructedToolChat部分,异步总是有问题,可能是VPN网络的问题,改成同步方式跑起来就可以了: import os os.environ["OPENAI_API_KEY"] = 'xxxx' from langchain.agents.agent_toolkits import PlayWrightBrowserToolkit from langchain.tools.playwright.utils import create_sync_playwright_browser sync_browser = create_sync_playwright_browser() toolkit = PlayWrightBrowserToolkit.from_browser(sync_browser=sync_browser) tools = toolkit.get_tools() print(tools) from langchain.agents import initialize_agent, AgentType from langchain.chat_models import ChatOpenAI # LLM不稳定,异步方式总是得不到结果。尝试使用同步方式 llm = ChatOpenAI(temperature=0.5) agent_chain = initialize_agent( tools, llm, agent=AgentType.STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION, verbose=True, ) def main(): response = agent_chain.run("What are the headers on python.langchain.com?") print(response) main()
作者回复: 好的,谢谢同学的分享!
2024-01-09归属地:加拿大 - shatuPlan and execute受限于大模型的不稳定性,还是可能出错,而且一步错步步错,这对于复杂多步骤流程还是很有挑战性【Thought:To calculate the number of bouquets that can be purchased, you need to divide 100 by the average price of a bouquet of roses in New York. Action: ``` { "action": "Calculator", "action_input": "100 / (63.98 + 56.99 + 18.70)" } ``` > Entering new LLMMathChain chain... 100 / (63.98 + 56.99 + 18.70)```text 100 / (63.98 + 56.99 + 18.70) ``` ...numexpr.evaluate("100 / (63.98 + 56.99 + 18.70)")... Answer: 0.7159733657907926】
作者回复: 是啊,因此这个类型的代理目前仅仅是个实验项目。 Plan and Execute策略的一个潜在弱点:一旦初始计划有误,整个解决方案可能都会出错。 对于这样的挑战,有几种可能的解决方案: 1. 增强错误检测和修正能力,使其能够在执行计划过程中更好地识别和修正错误。 2. 结合动态反馈:尽管Plan and Execute策略强调一次性计划,但也可以考虑在执行过程中引入某种形式的反馈机制,允许模型根据新信息进行调整。 3. 分阶段执行和验证:将复杂任务分解为多个阶段,每完成一个阶段就进行验证,确保每一步都正确无误再进行下一步。
2023-11-17归属地:北京 - SH老师, 把离散的文档及其他信息做嵌入,存储到向量数据库中,然后再提取的过程。 这类利用大模型的时候(比如:openai 的 api) 这类的数据是否会被大模型 获取到? 导致信息泄露~
作者回复: 调用API当然会。但是,OpenAI应该不会使用别人的商用数据来搞事情。如果有一些concern,请使用自己的模型或者下载开源模型到本地。
2023-11-05归属地:浙江 - Geek_995b81老师,结构化工具那一个demo,比如模型决定使用 PlayWrightBrowserToolkit 中的 get_elements 工具。这里我们没有给他提示,他是怎么知道用get_elements工具的呢?另外,结构化工具还有其他工具吗?
作者回复: Playwright Browser工具包包含多种工具来与浏览器交互,包括点击元素、导航网页、提取文本、提取超链接等。 对于如何选择合适的工具,模型可能是基于问题的语义来推断应该使用哪个工具。例如,如果问题涉及提取网页元素,模型可能会推断应该使用 get_elements 工具。 另外,Playwright Browser 工具包还包含其他工具,比如: click_element: 点击指定 CSS 选择器的元素 navigate_browser: 导航浏览器到指定网址 navigate_back: 返回到浏览器历史中的上一页 extract_text: 提取当前网页的所有文本 extract_hyperlinks: 提取当前网页的所有超链接 current_webpage: 返回当前页面的 URL 结构化工具应该还有很多,我在后面课中给出了列表,你可以查阅LangChain的相关文档。
2023-10-31归属地:新加坡