开发者实战 | 基于 LangChain 与 OpenVINO™ 构建 AI 智能体

原创
05/19 08:00
阅读数 0

点击蓝字

关注我们,让开发变得更有趣

作者| 杨亦诚

排版| 李擎

基于 LangChain 与 

OpenVINO™ 构建 AI 智能体


通常情况下, LLM 获取知识的途径仅限于训练时的样本数据以及 Prompt 中包含的上下文信息,因此如果缺少有效的外部信息获取途径, LLM 便无法像一个智能体一样自主学习知识并做出行动,这也是为什么我们要引入 Agent 的概念。

顾名思义 Agent 便是让 LLM 像代理一样来对接用户需求,将问题拆解后,通过调用外部工具的方式来解决这些问题,不同于传统的人工智能, Agent 具备通过主动思考、调用工具去逐步完成给定目标的能力。代理的核心思想是使用 LLM 来进行规划,让 LLM 像“路由器”一样 ,选择下一步要执行的操作。在代理中, LLM 用作推理引擎,以确定要执行哪些操作以及按什么顺序执行,这些操作往往需要和一组工具(如搜索引擎、数据库、网站等)集成, 用来提升 LLM 的行动能力。


图:LangChain中Agent的运行流程


上面这张图展示的就是 LLM 作为 Agent 在一个AI智能体中承担的作用, LLM 会根据用户请求,将其拆解为一系列任务,根据任务的先后次序来调用(Action)不同的外部工具(Tools),并根据从工具中得到的结果(Observation)来规划(Plan)下一步行动,最终当满足用户需求后,给出最终反馈,类似于在强化学习中,通过 Action 和 React 机制实现最终的收敛。接下来我们就通过一个简单的案例看一下如何用 OpenVINO™ 和 LangChain 实现这个过程。


OpenVINO™

1. 创建工具


根据 LangChain 的官方教程,我们首先需要为 Agent 定义一组工具 Function,以供其调用。官方也给出了一个简单的示例,如何通过 @tool 修饰器来定义了一组基本的运算函数:

from langchain_core.tools import tool@tooldef multiply(first_int: int, second_int: int) -> int:    """Multiply two integers together."""    return first_int * second_int

这里我们可以同时创建多个工具, Agent 会根据用户需求,自主选择最合适的工具,并获取结果。除了通过自定义的方式创建工具 Function 外, LangChain 的生态合作伙伴也为我们预先定义了很多实用的工具,例如使用 Wikipedia 进行关键词检索,或是借助 ChatGPT 服务为你完成更复杂的任务。


OpenVINO™

2.  创建Prompt Template


第二步则是要创建 Prompt Template 模板,在很多 LLM 应用中也被叫做 Prompt 工程。目的是激活 LLM 规划和行动的能力。目前本地 Agent 比较常用的模板形态有 Function call, Self-ask 和 ReAct 。由于 Function call 能力需要在模型训练的过程中进行注入,所以这边不做讨论。Self-ask 提出了一种把问题拆解成子问题的 Prompt 范式,每一步模型都会自我提问是否可以把问题改写/拆解成一个简单的子问题,并进行回答,回答时可以调用搜索工具来获得答案,然后根据工具返回结果,继续进行自我提问,直到获得最终答案。ReAct 文如其名,模型推理分成了两个部分, Reason 和 Action。Reason 生成分析步骤, Action 生成工具调用请求,二者交替进行直到得到最终的结果。和 Self-ask 对比, ReAct 进一步把推理和工具调用进行了解耦, 在 Self-ask 中,自我提问既是推理步骤也是搜索工具的请求 Query,而在 ReAct 中工具调用的请求在推理步骤之后,这样可以更好的支持搜索以外的其他工具。


图:ReAct工作机制


在该项目中以 ReAct 为例,可以看到这个 Prompt Template 为 LLM 构建了一个从想法(Thought),行动(Action),观察结果(Observation)到最终答案(Final Answer:)完整的思维链,并且整个思考过程被要求进行多次的重复,直到 LLM 从工具中得到的有效信息足够支持其解决用户请求。

prompt = PromptTemplate.from_template(

    """Answer the following questions as best you can. You have access to the following tools:


    {tools}


    Use the following format:


    Question: the input question you must answer

    Thought: you should always think about what to do

    Action: the action to take, should be one of [{tool_names}]

Action Input: the input to the action

Observation: the result of the action

    ... (this Thought/Action/Action Input/Observation can repeat N times)

    Thought: I now know the final answer

    Final Answer: the final answer to the original input question


    Begin!


    Question: {input}

    Thought:{agent_scratchpad}"""

)


OpenVINO™

3.创建LLM实例


目前 OpenVINO™ 已经被集成进了 LangChain 中 HuggingFace Pipeline LLM 组件,开发者可以直接通过修改 Backend 的方式,创建一个基于 OpenVINO™ 的 LLM 实例,并像其他 LLM 实例一样在 LangChain 中进行调用,其中 model_id 可以是一个 HuggingFace 的模型 ID,也可以是本地的 PyTorch 或者 OpenVINO 格式模型路径:

ov_llm = HuggingFacePipeline.from_model_id(
   model_id=model_path,
   task="text-generation",
   backend="openvino",
   model_kwargs={"device": device.value, "ov_config": ov_config},   
    pipeline_kwargs={"max_new_tokens": 1024},
关于 OpenVINO™ LLM 组件更多的信息和使用方式可以访问:

https://python.langchain.com/v0.1/docs/integrations/llms/openvino/


OpenVINO™

4.构建并运行Agent


在这个项目中,我们以“Intel/neural-chat-7b-v3-1”大语言模型为例,在完成 LLM 实例,Tools 和 Prompt Template 创建后,可以利用 LangChain 中 Agent 相关的 API 非常快速地搭建本地 Agent 服务:

output_parser = ReActSingleInputOutputParser() 
agent = create_react_agent(ov_llm, tools, prompt,
output_parser=output_parser)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True) 

由于 LangChain 默认解析 ReAct 输出的脚本无法很好地识别 HuggingFace Pipeline 的生成结果,所以这里我们需要自己定义一个 custom_output_parser.py 脚本,用于将模型原始的输出结果转化为具体的行动(Action),例如如何匹配工具函数的输入数据。以一个简单的数学运算为例,可以看到Agent在理解用户问题后,将他拆分为多个行动,并将多个行动的观察结果进行整合,得到最终答案。


Question: Take 3 to the fifth power and multiply that by the sum of twelve and three    

Thought: We need to exponentiate 3 to the power of 5, then multiply the result by the sum of 12 and 3    

Action: exponentiate    

Action Input: base: 3, exponent: 5    

Observation: 243    

Action: add    

Action Input: first_int: 12, second_int: 3    

Observation: 15    

Action: multiply    

Action Input: first_int: 243, second_int: 15    

Observation: 3645    

Thought: I now know the final answer    

Final Answer: 3645


此外,在借助 LangChain 中预置的 Wikipedia 查询工具,我们也可以搭建起一个基于 Wikipedia 知识库检索的 Agent 工具:


图:面向Wikipedia的知识库检索Agent


OpenVINO™

5.结束语


基于 LLM 构建的 AI 智能体,虽然无法做到面面俱到,但他却可以找到最合适的帮手一同完成任务。除了以上这些示例外,我们还可以利用 Agent,RAG 以及多模态模型等技术,创建更复杂的应用体系,例如将人类指令转化为机器臂的具体动作,或是根据用户请求绘制创建文本或音视频内容。

作为通过通用人工智能(AGI)的必经之路,Agent 就好比是一个能够感知环境、进行决策和执行动作的智能实体,像人一样感知世界,运用工具,与他人进行交互。相信在 OpenVINO™ 的加持下,完全本地的 AI 智能体服务将成为可能。


OpenVINO™

6.参考示例


基于 LangChain 和 OpenVINO™ 的 RAG 示例:

https://github.com/openvinotoolkit/openvino_notebooks/tree/latest/notebooks/llm-rag-langchain

基于 LangChain 和 OpenVINO™ 的 Agent 示例:

https://github.com/openvinotoolkit/openvino_notebooks/tree/latest/notebooks/llm-agent-langchain


OpenVINO™

--END--


      
      
      

点击下方图片,让我们一起成为“Issues 猎手”,共创百万用户开源生态!


               
               
               
你也许想了解(点击蓝字查看)⬇️
➡️  隆重介绍 OpenVINO™ 2024.0: 为开发者提供更强性能和扩展支持
➡️  隆重推出 OpenVINO 2023.3 ™ 最新长期支持版本
➡️  OpenVINO™ 2023.2 发布:让生成式 AI 在实际场景中更易用
➡️ 开发者实战 | 介绍OpenVINO™ 2023.1:在边缘端赋能生成式AI
➡️ 基于 ChatGLM2 和 OpenVINO™ 打造中文聊天助手
➡️ 基于 Llama2 和 OpenVINO™ 打造聊天机器人
➡️ OpenVINO™ DevCon 2023重磅回归!英特尔以创新产品激发开发者无限潜能
➡️ 5周年更新 | OpenVINO™  2023.0,让AI部署和加速更容易
➡️ OpenVINO™5周年重头戏!2023.0版本持续升级AI部署和加速性能
➡️ 开发者实战系列资源包来啦!
➡️  以AI作画,祝她节日快乐;简单三步,OpenVINO™ 助你轻松体验AIGC


              
              
              

扫描下方二维码立即体验 

OpenVINO™ 工具套件 2024.1


点击 阅读原文 获取工具套件 ,评论区已开放,欢迎大家留言评论!

文章这么精彩,你有没有“在看”?

本文分享自微信公众号 - OpenVINO 中文社区(openvinodev)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部