点击蓝字
关注我们,让开发变得更有趣
作者| 杨亦诚
排版| 李擎
基于 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
@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 中工具调用的请求在推理步骤之后,这样可以更好的支持搜索以外的其他工具。
图: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}, ) |
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
点击 阅读原文 获取工具套件,评论区已开放,欢迎大家留言评论!
文章这么精彩,你有没有“在看”?