LangChain 实战课
黄佳
新加坡科研局首席研究员
8120 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 28 讲
结束语 & 结课测试 (2讲)
LangChain 实战课
15
15
1.0x
00:00/00:00
登录|注册

13|代理(下):结构化工具对话、Self-Ask with Search以及Plan and execute代理

你好,我是黄佳,欢迎来到 LangChain 实战课!
在上一讲中,我们深入 LangChain 程序内部机制,探索了 AgentExecutor 究竟是如何思考(Thought)、执行(Execute/Act)和观察(Observe)的,这些步骤之间的紧密联系就是代理在推理(Reasoning)和工具调用过程中的“生死因果”。
现在我们趁热打铁,再学习几种更为复杂的代理:Structured Tool Chat(结构化工具对话)代理、Self-Ask with Search(自主询问搜索)代理、Plan and execute(计划与执行) 代理。

什么是结构化工具

LangChain 的第一个版本是在 2022 年 11 月推出的,当时的设计是基于 ReAct 论文构建的,主要围绕着代理和工具的使用,并将二者集成到提示模板的框架中。
早期的工具使用十分简单,AgentExecutor 引导模型经过推理调用工具时,仅仅能够生成两部分内容:一是工具的名称,二是输入工具的内容。而且,在每一轮中,代理只被允许使用一个工具,并且输入内容只能是一个简单的字符串。这种简化的设计方式是为了让模型的任务变得更简单,因为进行复杂的操作可能会使得执行过程变得不太稳定。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文介绍了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归属地:广东
    4
    2
  • 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归属地:加拿大
  • shatu
    Plan 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归属地:新加坡
收起评论
显示
设置
留言
18
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部