Prompt-Cache、A2A、ReAct

今天抽空了解一下Prompt-Cache、A2A、ReAct,之前都是听听别人或者有博客提到

Prompt-Cache

由名字可以直观了解到就是通过缓存常用的一些提示词,从而提高推理响应效率

想想场景,其实这个应用场景蛮多,但是在LMM API请求的时候最为实用,因为很多时候我们通过API请求LLM的时候,同一个节点或者模块的Prompt一般都是一样的,唯一就是会有一些变量信息携带进去,这时候就完全可以采用缓存策略,把当前请求节点的Prompt(复用的内容)做缓存,下次请求过来直接使用就行,但是如何快速识别出当前节点也是个问题,也就是缓存命中率问题。

我觉得这个在用户层面进行模版化操作比较方便,就是让用户的prompt内容分为「复用」和「变量」部分,APi后端接口解析传参然后再通过缓存走LLM,这样我觉得是比较高效的策略,其实就是如何快速识别cache的问题。

这个场景其实是可以做一套规范的,分析必要的要素、结构、输入输出、上下游,基本上就可以应用在各种LMM的API服务当中了。当然,还需要考虑实时更改prompt的情况。

A2A

A2A协议:一个为Agent间通信设计的开放标准,提高不同组织开发的Agent协作效率。全称就是Agent2Agent

笔者个人听上去跟MCP类似,不过一个是统一Function Call的标准,一个是统一Agent的标准。

一般这种协议的制定都会设定一个「Server」和「Client」。

这里我突然想起面试时候有呗问到说“有没有多Agent的实践”,当时的确没有,不过后面可以结合这个做demo,然后讲讲A2A、MCP。

Agent应该有对应的Agent Card,基本样例如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
{
  "name": "智能旅行助手",
  "description": "专业的旅行规划和预订服务",
  "provider": "TravelTech Inc.",
  "url": "https://api.travelagent.com/a2a",
  "version": "1.0.0",
  "capabilities": ["streaming", "pushNotifications"],
  "authentication": {
    "schemes": ["Bearer"]
  },
  "skills": [
    {
      "id": "flight-booking",
      "name": "航班预订",
      "description": "搜索和预订国际航班",
      "inputModes": ["text", "data"],
      "outputModes": ["text", "data"]
    }
  ]
}

ReAct

Reasoning and Acting:一种范式和策略,推理 -> 行动 -> 反馈。“边想边做,做了再想”

其实有一点像CoT,还有点像RL

会有一定的问题,比如:

  • 简单的事情复杂化,很多没必要走
  • 一步错,错上加错

测试demo

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
您是助手,请充分了解用户的问题,选择合适的工具,逐步帮助用户解决问题。

### 约束 ####
1. 所选工具必须是工具列表(Tool List)中的工具。
2. 当无法找到工具的输入时,请立即调整并使用AskHumanHelpTool向用户询问其他参数。
3. 当你相信你有最终的答案,可以回应用户,请使用TaskCompleteTool。

### Tool List ###

[
    Search: 如果需要搜索请用它.paramDescription : [{"name": "searchKey", "description": "搜索参数","type":"String"}]
    AskHumanHelpTool: 如果需要人类帮助,请使用它。paramDescription : [{"name": "question", "description": "问题","type":"String"}]
    TaskCompleteTool:如果你认为你已经有了最终答案,请使用它。paramDescription : [{"name": "answer", "description": "答案","type":"String"}]
]

您应该只以JSON格式响应,回复格式样例如下:

### 回复格式 ###
{
  {"thought": "为什么选择这个工具的思考","tool_names": "工具名","args_list": {“工具名1”:{"参数名1": "参数值1","参数名2": "参数值2"}}}}

确保您返回的响应内容都是JSON格式,并且不包含任何额外内容。
1
2
问题:
今天星期几啊
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
回答:
{
  "thought": "用户询问今天星期几,这是一个需要获取当前日期信息的问题。由于我没有内置的实时时钟功能,需要使用搜索工具来查找当前日期和星期信息。",
  "tool_names": "Search",
  "args_list": {
    "Search": {
      "searchKey": "今天星期几 当前日期"
    }
  }
}