Skip to content

大模型(LLMs)Agent 面试

来源:AI Agent 面试宝典 作者:宁静致远 日期:2024年01月27日


一、什么是大模型(LLMs)Agent?

大模型(LLMs)Agent(智能体)是一种超越简单文本生成的人工智能系统。它使用大型语言模型(LLM)作为其核心计算引擎,使其能够进行对话、执行任务、推理并展现一定程度的自主性。简而言之,Agent 是一个具有复杂推理能力、记忆和执行任务手段的系统。

📝通俗解释:可以把 Agent 想象成一个"超级助手"。它不仅能回答问题,还能像人一样思考下一步该做什么、调用什么工具来完成复杂任务。比如你说"帮我订一张下周去上海的机票",Agent 会自己思考需要查航班、比价格、完成预订等一系列步骤。

大模型Agent架构图 图片描述:这是一张展示LLM Agent系统架构的流程图。左侧是"游戏环境"(Gaming Environment),包含规划技能和工具使用模块,显示状态信息。中间核心部分是LLM(如GPT-4),包含调度器和提示词模板。右侧是记忆模块。下方是行动控制器,包含多智能体和人类行动。


二、大模型(LLMs)Agent 有哪些部分组成?

在LLM赋能的自主Agent系统中,LLM充当Agent大脑的角色,并与若干关键组件协作。

大模型 Agent 架构图 图片描述:这是一个展示大模型 Agent 架构的流程图。中心是"Agent",它向上连接"Memory"(分为短期记忆和长期记忆),向左连接"Tools"(包括日历、计算器、代码解释器、搜索等),向下连接"Action",向右连接"Planning"。Planning模块进一步细分为反思、自我批评、思维链、子目标分解。

📝通俗解释:Agent主要由四部分组成:

  1. 规划(Planning):像大脑一样思考如何完成复杂任务
  2. 记忆(Memory):记住短期信息(当前对话)和长期信息(历史经验)
  3. 工具使用(Tools):像人一样调用计算器、搜索等外部工具
  4. 行动(Action):把思考结果转化为具体行动

2.1 规划(Planning)

一项复杂任务通常会包含很多步骤,Agent需要了解这些步骤是什么并提前规划。

2.1.1 拆解子目标和任务分解

如何进行拆解子目标和任务分解?

  • 拆解子目标和任务分解:Agent能够将大型任务分解为较小、易于管理的子目标,从而高效地处理复杂任务。

📝通俗解释:就像你要做一顿饭,Agent会把"做顿饭"这个大任务拆成"买菜"、"洗菜"、"炒菜"、"摆盘"等小任务,然后逐一完成。

拆解子目标和任务分解有哪些方法?

(1)Chain of Thought(思维链,CoT)

  • 模型被要求"think step by step"(一步一步思考),利用更多的时间进行计算,将艰难的任务分解成更小、更简单的步骤。CoT将大型任务转化为多个可管理的任务,并对模型的思维过程进行了阐释。

📝通俗解释:就像老师教学生做题时写解题步骤,CoT让AI把思考过程一步步写出来,而不是直接给答案。这样复杂问题就被拆成了一个个简单的小问题。

(2)Tree of Thoughts(思维树,ToT)

  • 进一步扩展CoT,在每一步都探索多种推理的可能性。它首先将问题分解为多个思考步骤,并在每个步骤中生成多个思考,从而创造一个树形结构。搜索过程可以是BFS(广度优先搜索)或DFS(深度优先搜索),每个状态由分类器(通过一个prompt)或少数服从多数的投票原则来决定。

📝通俗解释:就像下棋时考虑多种可能的下法,ToT让AI同时探索多条思考路径,然后选择最优的那条。比如去旅游,可以考虑"坐飞机去"、"坐火车去"、"开车去"等多种方案。

任务分解可通过以下几种方式实现:

  • a. 给LLM一个简单的提示词"Steps for XYZ.\n1.","What are the subgoals for achieving XYZ?"
  • b. 使用针对具体任务的指令,例如对一个写小说的任务先给出"Write a story outline."指令
  • c. 使用者直接输入

(3)Graph of Thoughts(思维图,GoT)

  • 同时支持多链、树形以及任意图形结构的Prompt方案,支持各种基于图形的思考转换,如聚合、回溯、循环等,这在CoT和ToT中是不可表达的。将复杂问题建模为操作图(Graph of Operations,GoO),以LLM作为引擎自动执行,从而提供解决复杂问题的能力。某种程度上,GoT囊括了单线条的CoT和多分枝的ToT。

📝通俗解释:GoT是更灵活的思考方式,不仅能线性思考(CoT)和分支思考(ToT),还能把多个想法合并(聚合)、走不通了退回去(回溯)、反复优化(循环)。就像画画时,可以先画草稿,再修改,最后合并成成品。

思维模式对比图 图片描述:图表对比了五种不同的思维模式结构。从左到右依次是:Basic Input-Output (IO 简单的输入直接到输出;Chain-of-Thought (CoT) 线性的思考步骤;Multiple CoTs (CoT-SC) 生成多条独立的思维链最后选择最佳的一条;Tree of Thoughts (ToT) 树状结构,包含分支、回溯和评分;Graph of Thoughts (GoT) 图状结构,支持任意拓扑,包括聚合、回溯和精炼。)

📝通俗解释:这张图展示了AI思考方式的进化史。从最简单的一问一答(IO),到一步步推理(CoT),到多方案选择(CoT-SC),到分支探索(ToT),最后到任意结构的图式思考(GoT)。

(4)LLM+P:通过外部规划器实现复杂规划

  • 通过借助一个外部的经典Planner来进行一个更加长序列的整体规划。这种方法利用规划域定义语言(Planning Domain Definition Language, PDDL)作为中间接口来描述规划问题。整个使用过程:首先LLM将问题翻译成"问题PDDL",接着请求经典Planner根据现有的"领域PDDL"生成一个PDDL Plan,最后将PDDL计划翻译回自然语言(LLM做的)。根本上讲,Planning Step是外包给外部工具的,当然也有一个前提:需要有特定领域的PDDL和合适的Planner。

📝通俗解释:LLM+P就像是一个"翻译官+规划师"的组合。LLM把人类的问题翻译成规划师能看懂的专业语言(PDDL),规划师算出详细步骤,再由LLM翻译回人话。这适合需要精确规划的复杂任务,如物流调度、机器人控制等。

三种LLM规划架构 图片描述:图片展示了三种不同的LLM规划架构。1. LLM-As-Planner:输入问题通过LLM直接生成计划。2. LLM-As-Planner (In-context Learning :输入上下文和问题,通过LLM生成计划。3. LLM + P:输入上下文,通过LLM生成问题PDDL,结合领域PDDL输入到Planner生成计划,最后由LLM翻译回自然语言。)


2.1.2 模型自我反省

如何进行模型自我反省?

  • 自查与自纠:Agent能够对过去的行动进行自我批评和自我反省,从错误中吸取教训,并在今后的工作中加以改进,从而提高最终结果的质量(本质上是产生强化学习的数据,强化学习并不需要人工标注)。

📝通俗解释:就像人一样,Agent会"复盘"自己做过的事。如果上次推荐错了商品,下次就会记住这个教训,调整推荐策略。这种能力让Agent能不断学习和进步。

模型自我反省有哪些方法?

(1)ReAct(推理+行动)

  • 即Reasoning+Act,通过将Action Space扩展为特定任务的离散动作和语言空间的组合,在LLM内部整合了推理(Reasoning)和行动(Action)。
    • 推理(Reasoning):使LLM能够与环境交互(例如,使用Wikipedia Search的API)
    • 行动(Action):通过提示词使得LLM用自然语言生成整体的推理过程

ReAct提示词模板包含了提供LLM思考的明确步骤,其大致格式为:

Thought: ...(思考)
Action: ...(行动)
Observation: ...(观察结果)

📝通俗解释:ReAct让AI边想边做。比如要找"苹果公司CEO是谁",AI会先想"我需要搜索",然后执行搜索行动,再根据搜索结果继续推理下一步。循环这个过程直到找到答案。

ReAct推理轨迹示例 图片描述:展示了两个具体的ReAct推理轨迹示例。左侧是知识密集型任务(HotpotQA),包含Thought到Action再到Observation的循环。右侧是决策型任务(AlfWorld Env),展示在虚拟环境中寻找物品的操作步骤。

(2)Reflexion(反思框架)

  • 是一个让Agent具备动态记忆和自我反思能力以提高推理能力的框架。Reflexion采用标准的RL设置,其中奖励模型提供简单的二进制奖励,而Action Space则采用ReAct中的设置,即在特定任务的行动空间中加入语言,以实现复杂的推理步骤。在每一个Action之后,Agent会计算一个启发式函数,并根据自我反思的结果决定是否重置环境以开始一个新的循环。

📝通俗解释:Reflexion给Agent加了一个"纠错"功能。它会判断当前的做法是否有效(通过启发式函数),如果发现走进了死胡同或者一直在重复错误,就会"自我反思"一下,调整策略重新尝试。

Reflexion架构图 图片描述:这是一个流程图,展示了Reflexion架构。上方粉色区域标记为ReAct,流程为 Query -> LLM -> Action -> Environment -> Reward。下方蓝色区域标记为Reflect,包含两个主要模块:Heuristic(启发式函数)和Reflection(反思LLM)。

  • 启发式函数判断何时整个循环轨迹是低效的或者何时因为包含了幻觉需要停止。低效规划指的是耗时过长却未成功的循环轨迹。幻觉是指在环境中遇到一连串相同的行动,而这些行动会导致相同的观察结果。
  • 自我反思过程通过给LLM一个two-shot例子创造,每个例子都是一对(失败的轨迹、在计划中指导进一步变化的理想反思)。接着,reflections将会被添加到Agent的工作记忆中作为查询LLM的上下文,最多三个。

📝通俗解释:Agent会记住最近三次的反思经验,每次做决定时都会参考这些"教训",避免再犯同样的错误。

Reflexion实验结果 图片描述:包含两个折线图。左图是AlfWorld环境实验,显示有无反思的成功率对比。右图是HotpotQA实验,同样显示有无反思的效果差异。在AlfWorld中,幻觉是比低效规划更常见的失败因素。


2.2 记忆(Memory)

  • 短期记忆:上下文学习即是利用模型的短期记忆学习
  • 长期记忆:为Agent提供保留和召回长期信息的能力,通常利用外部向量存储和检索实现

📝通俗解释:

  • 短期记忆就像工作台,当前正在处理的信息放在上面,比如正在聊的话题
  • 长期记忆就像图书馆的档案系统,把过去的经验都存起来,需要时能快速检索到。比如Agent记得你上次喜欢蓝色的衣服,下次推荐时就会优先推荐蓝色

2.3 工具使用(Tool Use)

  • 对模型权重丢失的信息,Agent学习调用外部API获取额外信息,包括当前信息、代码执行能力、专有信息源的访问等等

📝通俗解释:AI模型再强大也不可能记住所有东西,这时候就需要调用工具。比如算数学题调用计算器、查天气调用天气API、搜资料调用搜索引擎。工具让AI变成了"万能助手",什么都能帮你做。


三、大模型(LLMs)Agent主要利用了大模型哪些能力?

LLM Agent主要利用大模型的推理能力(Reasoning)模仿能力(Few-shot Learning)规划能力(Planning),再结合函数调用来实现工具使用(Tools Use)。

📝通俗解释:

  • 推理能力:让AI能像人一样"想一想"再做事
  • 模仿能力:给几个例子就能学会新任务,比如看几个对话示例就知道怎么回答
  • 规划能力:把复杂任务拆成一步步的小任务
  • 工具使用:调用外部API来完成具体操作

四、结合代码讲解大模型(LLMs)Agent思路

这里使用了sa-bot开源项目,介绍大模型(LLMs)Agent代码实现逻辑,该项目主要实现了以下内容:

  • 实现将豆包(云雀大模型)接入langchain体系
  • 基于langchain测试skylark-chat的prompt agent

4.1 思路介绍

📝通俗解释:这部分展示了如何从零开始构建一个简单的Agent。核心思路是:让AI判断用户想要什么,然后选择对应的工具来处理。


4.2 实例一:利用大模型判断做选择

利用大模型从多个选择中选出正确的出来,比如按下面的问题输入大模型:

python
multi_choice_prompt = """请针对 >>> 和 <<< 中间的用户问题,选择一个适合的工具去回答他的问题,只要用A、B、C的选项字母告诉我答案。

如果你觉得都不适合,就选D。

{question} <<<


你能使用的工具如下:
A. 一个能够查询商品信息为用户进行商品导购的工具
B. 一个能够查询最近下单的订单信息,获得最新的订单情况的工具
C. 一个能够查询商家的退换货政策、运费、物流时长、支付渠道的工具
D. 都不适合

请按以下格式进行回答 `A`、`B`、`C`、`D`。
"""

chat = doubao.ChatSkylark(model="skylark-chat", temperature=0, top_p=0, top_k=1)
question = "我想买一件衣服,但不知道哪款适合我,有什么好推荐吗"
messages = [
    HumanMessagePromptTemplate.from_template(
        template=multi_choice_prompt,
    ).format(question=question),
]
req = chat(messages)
print("问题:%s" % question)
print(req.content)

📝通俗解释:这段代码让AI做"选择题"。用户问问题,AI从A、B、C、D四个工具中选择一个最合适的。比如用户问"有什么衣服推荐",AI就选A(商品导购工具)。

运行结果:

根据提供的信息,最适合的工具是 A. 一个为用户进行商品导购和推荐的工具。因为用户的问题是关于选择适合的衣服,需要推荐和导购。B、C选项的工具虽然也有用,但并不是最直接解决用户问题的工具。因此,选择A选项。回答为 A

📝通俗解释:AI成功选对了工具A,就像一个聪明的导购员,知道用户想要的是推荐服务。


4.3 实例二:让大模型通过判断正确选择函数工具并输出

上面例子测试了大模型的推理和选择判断能力,下面我们将上面的A、B、C、D换成我们的函数名称,并要求其按照固定格式输出,Prompt如下:

请针对 >>> 和 <<< 中间的用户问题,选择一个适合的工具去回答他的问题,工具的名称已经给出。
如果你觉得都不适合,就回复"no_tools:以上工具都不适用"。

{question} <<<


你能使用以下四个工具:
- recommend_product:一个为用户进行商品导购和推荐的工具
- search_order:一个能够查询最近下单的订单信息,获得最新的订单情况的工具
- search_merchant_policies:一个能够查询商家的退换货政策、运费、物流时长、支付渠道的工具
- no_tools:以上工具都不适用

请按以下格式进行回答:
{
    "recommend_product": "一个为用户进行商品导购和推荐的工具"
}

测试skylark-chat:

问题:我有一张订单,一直没收到,可以帮我查询下吗

{
    "search_order": "一个能够查询最近下单的订单信息,获得最新的订单情况的工具"
}

📝通俗解释:这次更高级了,AI不仅选对了工具(search_order),还按照规定的JSON格式输出。这样程序就能自动解析并调用对应的函数了。

问题:请问你们家的货可以送到四川吗,物流大概要多久?

根据用户的问题,需要查询商家的退换货政策、运费、物流时长等信息。而给出的四个工具中,search_merchant_policies能够查询商家的退换货政策、运费、物流时长、支付渠道等信息,与用户需求相符。

因此,回复内容为:

json
{
  "search_merchant_policies": "一个能够查询商家的退换货政策、运费、物流时长、支付渠道的工具"
}

📝通俗解释:有时候AI会先解释一番再给结果,这是因为训练时用了思维链(CoT)来提升准确率。实际使用时可以用正则表达式提取JSON部分。


4.3 实例三:Agent模板和解析

这里Agent模板使用了经典的Chat Zero Shot ReAct,分为"Thought"、"Action"、"Observation"三部分。这里直接看Prompt代码:

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

Search Order:
一个能够查询订单信息,获得最新的订单情况的工具,参数是输入订单id
Recommend product: 一个能够基于商品及用户信息为用户进行商品推荐导购的工具,参数是输入要推荐的商品类型

The way you use the tools is by specifying a json blob.
Specifically, this json should have a `action` key (with the name of the tool to use) and a `action_input` key (with the input to the tool going here).

The only values that should be in the "action" field are: Search Order, Recommend product

The $JSON_BLOB should only contain a SINGLE action, do NOT return a list of multiple actions. Here is an example of a valid $JSON_BLOB:

{
  "action": $TOOL_NAME,
  "action_input": $INPUT
}

ALWAYS use the following format:

Question: the input question you must answer
Thought: you should always think about what to do
Action:
$JSON_BLOB
Observation:
the result of the action
... (this Thought/Action/Observation can repeat N times)
Thought: I now know the final answer
Final Answer: the final answer to the original input question

Begin! Remeter to always use the exact characters `Final Answer` when responding.'
{question}
"""
python
chat = doubao.ChatSkylark(model="skylark-chat", temperature=0, top_p=1, top_k=1)
question = "我想买一件衣服,但不知道哪款适合我,有什么好推荐吗"
messages = [
    HumanMessagePromptTemplate.from_template(
        template=agent_prompt,
    ).format(question=question),
]
result = chat(messages)
# Agent的解析
text = result.content
pattern = re.compile(r"^. *?`{3}(?:json)?\n(. *?)`{3}.*?$", re.DOTALL)
found = pattern.search(text)
action = found.group(1)
response = json.loads(action.strip())
print("问题:%s\n" % question)
print(response)  # json解析后已经满足json格式

运行结果:

json
{'action': 'Recommend product', 'action_input': {'user_demographic': {'age': 25, 'gender': 'Male', 'location': 'New York'}, 'preferences': {'style': 'Casual', 'color': 'Blue'}}}

📝通俗解释:这个模板让AI按照"思考->行动->观察"的循环来工作。AI不仅选择了工具,还根据用户的问题"推理"出了用户的年龄、性别、位置等信息,作为推荐商品的依据。这就是Agent的智能之处!


4.4 实例四:将skylark接入langchain中测试Agent

编写工具函数:

python
# 模拟电商订单查询
def search_order(input: str) -> str:
    print("调用search_order:一个能够查询订单信息,获得最新的订单情况的工具:")
    return "{order},订单状态:已发货".format(order=input)

# 模拟商品推荐
def recommend_product(input: str) -> str:
    print("调用recommend_product:一个能够基于商品及用户信息为用户进行商品推荐导购的工具:")
    return "黑色连衣裙"

接入langchain的Agent:

python
tools = [
    Tool(
        name="Search Order",
        func=search_order,
        description="一个能够查询订单信息,获得最新的订单情况的工具,参数是输入订单id"
    ),
    Tool(
        name="Recommend product",
        func=recommend_product,
        description="一个能够基于商品及用户信息为用户进行商品推荐导购的工具,参数是输入要推荐的商品类型"
    ),
]
chat = doubao.ChatSkylark(model="skylark-chat", temperature=0, top_p=0, top_k=1)
agent_tools = initialize_agent(
    tools=tools,
    llm=chat,
    agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
    verbose=True
)
result = agent_tools.run("我想买一件衣服,但不知道哪款适合我,有什么好推荐吗")
print(result)

运行结果:

我需要找到一个工具来推荐适合我的衣服。根据给定的工具,我可以使用"Recommend product"来获得推荐。

Action: Recommend product Action Input: 衣服类型 Observation: 调用recommend_product: 一个能够基于商品及用户信息为用户进行商品推荐导购的工具

Observation: 黑色连衣裙 Thought: 根据推荐的结果,我选择了黑色连衣裙。

Final Answer: 黑色连衣裙

📝通俗解释:这就是一个完整的Agent工作流程!用户说"想买衣服",Agent思考了一下,选择调用"推荐商品"工具,工具返回"黑色连衣裙",Agent再把这个结果告诉用户。全程自动化,就像一个真实的导购员!

Tips:

Volcengine在Windows下安装出错:

OSError: Cannot load native module 'Crypto.Cipher._raw_ecb'

解决方案:

pip3 uninstall pycryptodomex
pip install pycryptodome

五、如何给LLM注入领域知识?

  • 方法一:检索+LLM。先用问题在领域数据库里检索到候选答案,再用LLM对答案进行加工。
  • 方法二:领域知识微调LLM。把领域知识构建成问答数据集,用SFT(监督微调)让LLM学习这部分知识。

📝通俗解释:

  • 方法一(检索增强):就像考试时翻书查资料,先找到相关内容,再整理成答案。适合需要最新信息的场景。
  • 方法二(微调):就像请家教专门教某一门课,把知识"教会"给AI。适合需要AI深度掌握某个专业领域的场景。

六、常见LLM Agent框架或者应用有哪些?

  1. AutoGPThttps://github.com/Significant-Gravitas/AutoGPT
  2. AutoGenhttps://github.com/microsoft/autogen
  3. ChatDevhttps://github.com/OpenBMB/ChatDev
  4. XAgenthttps://github.com/OpenBMB/XAgent
  5. GPT-engineerhttps://github.com/gpt-engineer-org/gpt-engineer

📝通俗解释:这些都是开源的Agent开发框架:

  • AutoGPT:让AI自己给自己派任务,自动完成目标
  • AutoGen:微软开发,支持多Agent协作
  • ChatDev:专门做软件开发自动化的Agent团队
  • XAgent:更强大的通用Agent
  • GPT-engineer:根据需求自动生成代码

致谢

感谢 AiGC面试宝典 提供的面试资料!

基于 MIT 许可发布