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

点击蓝字

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

作者| 杨亦诚

排版| 李擎

基于 LangChain 与 

OpenVINO™ 构建 AI 智能体

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

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

d60bea8dfe53e000a49be64596f888b6.png

图: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
@tool
def 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 中工具调用的请求在推理步骤之后,这样可以更好的支持搜索以外的其他工具。

6a8d9b9e2d7932070b03a25de14a2370.png

图: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 工具:

026cd442cb2f82f153af16ff594f1961.png

图:面向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

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

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

  • 21
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值