其他
Prompt中文指南(四)让模型学会自我提问
“ Prompt中文指南,帮助你从0开始学习如何写提示。建议一定要按照提示案例一个一个尝试,你会发现,写好Prompt其实很简单……”
“ 另外我创建了AI交流群,里面会实时分享AI最新有用的信息,群里信息密度和新鲜度非常高,交流氛围也很好,欢迎感兴趣的朋友可以后台回复关键词【微信】,扫码入群。”
今天这篇文章主要介绍一种如何提高少样本CoT推理能力的方法,主要处理更为复杂的逻辑推理情况,叫自我提问(Self-Ask)。
核心思路
引导LLM将一个复杂的问题拆分为简单的问题,逐个回答,然后汇总成为答案。因为Ofir Press他们发现把复杂的问题拆解为简单的问题得出复杂问题正确答案的概率更高[1],这一个符合人类思考问题的方式。
那么如何引导LLM正确的分解问题,并且以合适的方式与推理逻辑的整个过程进行交互呢?答案是先给模型打个样(Few-shot),我们在思维链(CoT)里讲过。
其中有一个用到一个魔法咒语: “是否需要拆分出子问题?”
看案例(使用GPT3.5模型)
【错误】 |
【错误】 |
02—
模型的插件逻辑ChatGPT本身存在数据的局限性(数据的及时性[预训练数据截止到2021年9月]、准确性)。如果拆分出的子问题,不依赖LLM自己进行回答,而是调用外部API进行回答。并把结果交给LLM继续思考推理。这个方式可以引入外部知识库来补充LLM所不知道的信息,还可以让LLM对它使用的事实进行校验(ChatGPT )这就是模型的插件逻辑。
Ofir Press的论文[1]也用案例说明了:前面的逻辑全部讲清楚,所以不附翻译了,直接看截图,图的表意更清楚。
03—
LangChain的Prompt模板自我提问Self-Ask
PREFIX = """Answer the following questions as best you can. You have access to the following tools:"""// PREFIX = """尽可能回答以下问题。您可以使用以下工具:"""
FORMAT_INSTRUCTIONS = """The way you use the tools is by specifying a json blob.//FORMAT_INSTRUCTIONS = """您使用这些工具的方式是指定一个 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).//具体来说,这个 json 应该有一个“action”键(带有要使用的工具的名称)和一个“action_input”键(工具的输入在此处)。
The only values that should be in the "action" field are: {tool names}.//“action”字段中应包含的唯一值是:{工具名称}。
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://$JSON_BLOB 应该只包含一个单一的动作,不要返回多个动作的列表。下面是一个有效的 $JS0N_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)//...(这个想法/行动/观察可以重复 N 次)Thought: I now know the final answer//思考:我现在知道最终答案了Final Answer: The final answer to the original input question"""//Final Answer: 原始输入问题的最终答案"""
SUFFIX = """Begin! Reminder to always use the exact characters `Final Answer` when responding."""//SUFFIX = """开始!提醒,在回复时始终使用准确的字符 `Final Answer`。"""
要点如下[2]:
它在Prompt中明确定义了调用外部工具的JSON数据格式。
它用"Final Answer"作为标识,当ChatGPT返回的信息中出现这个标识的时候,LangChain将结束整个工作流程。
解决一个问题可能需要多个中间步骤,所以它用Prompt定义了一个工作流程:Question -> [Thought -> Action -> Observation] * N -> Thought -> Final Answers,通过这个方式,可以把对多个工具的调用组合起来。
上述最后一点有个细节:
因为ChatGPT本身并不能直接对外部API进行调用(在最新的Plugin支持下,应该是可以了),所以在Thought -> Action -> Observation 的链条中,在Action之后,我们需要让ChatGPT停止生成内容(否则ChatGPT将发挥编瞎话的特长,编造工具执行的结果),这里LangChain使用了一个小技巧,它在调用ChatGPT的时候,指定了一个Stop参数为"Observation:",这样ChatGPT在输出完Action后就会停止。
之后LangChain执行具体Action获取结果,然后把之前执行的中间步骤和该结果拼接在一起,作为上下文,再次对ChatGPT发起一个新的调用,直到ChatGPT返回"Final Answer"。
所以上述Thought -> Action -> Observation的实际执行流程是 [ChatGPT] Thought -> Action -> [LangChain] DoAction -> Call ChatGPT with Observation -> [ChatGPT] Thought -> Action ...
如果大家对LangChain上述涉及多步骤的工作流感到困惑的话,可以试着在自己机器上运行一下LangChain官方文档给出的例子,通过设置verbose参数,把详细的对话过程打印出来。
参考文献:[1]https://arxiv.org/abs/2210.03350Measuring and Narrowing the Compositionality Gap in Language ModelsOfir Press, Muru Zhang, Sewon Min, Ludwig Schmidt, Noah A. Smith, Mike Lewis
[2] https://mp.weixin.qq.com/s/LBPvDs9cIZCqsoh-RzBWHg我的两分钱 2023-03-27 12:52 发表于澳大利亚