智能体是什么
智能体是指基于大语言模型(LLMs)构建的智能体,具有强大的语言理解和处理能力,可以自动化地完成各种复杂的任务。大模型智能体的构建需要使用大量的数据和计算资源,并进行精细的模型训练和优化,以实现高性能的智能体,展现出类似人类的归纳和思考能力。
智能体的应用场景
大模型智能体在多个领域有广泛的应用:
- 自然语言处理:处理文本分类、情感分析、命名实体识别等功能。
- 问答系统:自动回答用户问题,提供准确的信息和服务。
- 文本生成:生成新闻报道、小说、广告语等。
- 语音识别和生成:实现语音转文字、文字转语音等功能。
- 机器翻译:将一种语言的文本翻译成另一种语言。
智能体的组成
智能体四个组成部分:大模型+工具+记忆+规划
规划(Planning)
把大型任务分解为子任务,以便高效的处理复杂任务,并规划执行任务的流程;
对任务执行的过程进行思考和反思,从而决定是继续执行任务,或判断任务完结并终止运行。
规划,可以理解为观察和思考。如果用人类来类比,当我们接到一个任务,我们的思维模式可能会像下面这样:
- 我们首先会思考怎么完成这个任务。
- 然后我们会审视手头上所拥有的工具,以及如何使用这些工具高效地达成目的。
- 我们会把任务拆分成子任务。
- 在执行任务的时候,我们会对执行过程进行反思和完善,吸取教训以完善未来的步骤
- 执行过程中思考任务何时可以终止
这是人类的规划能力,我们希望智能体也拥有这样的思维模式,因此可以通过 LLM 提示工程,为智能体赋予这样的思维模式。在智能体中,最重要的是让 LLM 具备这以下能力:
子任务分解(Subgoal decomposition)
通过 LLM 使得智能体可以把大型任务分解为更小的、更可控的子任务,从而能够有效完成复杂的任务。
思维链(Chain of Thoughts, CoT)
思维链已经是一种比较标准的提示技术,能显著提升 LLM 完成复杂任务的效果。当我们对 LLM 这样要求「think step by step」,会发现 LLM 会把问题分解成多个步骤,一步一步思考和解决,能使得输出的结果更加准确。这是一种线性的思维方式。
思维链的 prompt 可以像是如下这样(这里只是一个极简的 prompt,实际会按需进行 prompt 调优):
template="Answer the question: Q: {question}? Let's think step by step:"
反思和完善(self-critics)
智能体在执行任务过程中,通过 LLM 对完成的子任务进行反思,从错误中吸取教训,并完善未来的步骤,提高任务完成的质量。同时反思任务是否已经完成,并终止任务。这种反思和完善可以帮助 Agent 提高自身的智能和适应性。
Reflection
通过结合推理(Reasoning)和行动(Acting)来增强推理和决策的效果
- 推理(Reasoning): LLM 基于已有的知识或行动(Acting)后获取的知识,推导出结论的过程。
- 行动(Acting): LLM 根据实际情况,使用工具获取知识,或完成子任务得到阶段性的信息。
为什么结合推理和行动?
- 仅推理(Reasoning Only):LLM 仅仅基于已有的知识进行推理,生成答案来回答这个问题。很显然,如果 LLM 本身不具备这些知识,可能会出现幻觉,胡乱回答一通。
- 仅行动(Acting Only):大模型不加以推理,仅使用工具(比如搜索引擎)搜索这个问题,得出来的将会是海量的资料,不能直接回答这个问题。
- 推理+行动(Reasoning and Acting):LLM 首先会基于已有的知识,并审视拥有的工具。当发现已有的知识不足以回答这个问题,则会调用工具,比如:搜索工具、生成报告等,然后得到新的信息,基于新的信息重复进行推理和行动,直到完成这个任务。
Reasoning+Acting 的 prompt 模版的大致思路为:
Thought(思考): ...
Action(行动): ...
Observation(观察): ...Thought(思考): ...
Action(行动): ...
Observation(观察): ......(Repeated many times(重复多次))
Final Answer: ...
使用LangChain实现零样本智能体,零样本智能体是指在不给大模型任何样本提示信息的情况,由大模型去实现工具调用来得到问题的答案,代码实现如下:
from langchain.agents import tool
from langchain.agents import initialize_agent
from langchain.agents import AgentType
from langchain.llms import OpenAI
from datetime import date
llm = OpenAI(
api_key="sk-esjT0arInWjjUXbfCcF228498d99433...........",
base_url="https://api.aigc369.com/v1"
)
@tool
def time() -> str:
"""
Return the date of Today
"""
return str(date.today())
agent = initialize_agent([time], llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True)
agent.run("今天是什么日期")
智能体执行过程如下:
> Entering new AgentExecutor chain...
I should use the tool "time" to find the date
Action: time
Action Input: Today
Observation: 2024-11-06
Thought: I now know the final answer
Final Answer: Today's date is November 6th, 2024.
> Finished chain.
记忆(Memory)
短期记忆是指在执行任务的过程中的上下文,会在子任务的执行过程产生和暂存,在任务完结后被清空,短期记忆受到有限上下文窗口长度的限制,不同的模型的上下文窗口限制不同。
长期记忆是长时间保留的信息,一般是指外部知识库,通常用向量数据库来存储和检索,向量数据库通过将数据转化为向量存储。
工具(Tool)
LLM 是数字世界中的程序,想要与现实世界互动、获取未知的知识,或是计算某个复杂的公式等,都离不开工具。有了这些工具 API,智能体就可以与物理世界交互,解决实际的问题。因此需要为智能体配备各种工具以及赋予它使用工具的能力。
Function Calling 是一种实现大型语言模型连接外部工具的机制。通过 API 调用 LLM 时,调用方可以提供一系列描述函数(包括函数的功能描述、请求参数说明、响应参数说明),让 LLM 根据用户的输入,合适地选择调用哪个函数,同时理解用户的自然语言,并转换为调用函数的请求参数(通过 JSON 格式返回)。调用方使用 LLM 返回的函数名称和参数,调用本地函数并得到响应。最后,如果有进一步需求,把本地函数的响应传给 LLM,让 LLM 组织成自然语言再给出最终答案。
function calling 具体工作流程如下图所示:
详细介绍可以参考文章大模型 Function Call介绍
本文是对大模型Agent入门级学习,参考了以下文章:
https://cloud.tencent.com/developer/article/2422923,后续有新的收获再进行更新。。。