基于LangChain与OpenVINO™构建AI智能体

openlab_96bf3613 更新于 2月前

作者:杨亦诚

通常情况下,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实现这个过程。

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服务为你完成更复杂的任务。

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 a***est 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}"""
)

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_kwarg*****ax_new_tokens": 1024},
)

关于OpenVINO LLM组件更多的信息和使用方式可以访问:

https://python.langchain.com/v0.1/docs/integrations/llms/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


5. 结束语

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

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

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

0个评论