ICLR高分论文| CoT过时了,使用CoA!

ICLR高分论文| CoT过时了,使用CoA!

原创 Tensorlong 看天下 沈公子今天读什么 2025年02月28日 08:01 云南

图片

一句话概括:教LLM摆脱“闭门造车”的老毛病,装个外挂,让它学会Google一下再开口。堪称“自带百度技能的江湖老手”——不过包装成“可配置检索与推理机制”,瞬间提升逼格!

一.论文分析

1. 论文主要贡献点分析

论文提出了一个名为**Chain-of-Action (CoA)**的通用框架,用于提升大语言模型(LLM)在复杂问题上的问答表现,尤其针对需要实时或领域特定信息的场景。围绕该框架,作者强调了以下贡献点:

  1. 可配置的检索与推理机制
    论文认为仅让模型“多想一步”(例如用Chain-of-Thought的方式进行思考)并不足以解决所有复杂问题,尤其是需要外部知识或实时信息的场景。CoA框架让LLM可以自行决定何时去“调用外部资源”或“使用内置知识”,从而实现对异构信息的融合,包括网页搜索、领域知识库、表格数据等。

  2. 多类型“插拔式”动作(Plug-and-Play Actions)
    该框架提供了三种可插拔动作:

    • Web查询(从互联网获取最新信息)

    • 知识编码检索(从向量数据库获取领域知识)

    • 数据分析(对数值或表格数据进行API调用或计算)
      这些动作在框架中以“子问题-答案-标记”的形式呈现,模型可灵活调用或跳过。

  3. 多参考“可信度”打分(Multi-reference Faith Score, MRFS)
    为了避免生成与外部证据冲突或“幻觉”(hallucination)的内容,论文设计了一种打分方法来比较模型生成的答案与检索到的外部内容是否一致。一旦分数太低,就会触发对答案的修正或替换,帮助提升答案的可靠性。

  4. 知识边界检测(Knowledge Boundary Detection)
    作者提出了“检测LLM知识边界”的思路:如果模型在某些子问题上已经足以凭其训练时学到的知识给出准确答案,就无需再次调用检索或复杂的总结操作。这有助于减少无谓的API调用与LLM交互,从而降低系统的时延和计算成本。

  5. 真实应用和性能提升
    论文在Web3领域的实时问答产品上进行了部署,声称在用户活跃度与反馈上取得了显著提升。同时,在多个公开问答数据集上的实验结果也显示,CoA方法在准确率、推理深度、运行效率等方面均有提高。


2. 理解难点识别

基于以上贡献点,以下几个概念和思路是整篇论文中的“关键”或“难点”,也是后续需要重点解释的地方:

  1. Chain-of-Action (CoA)框架本身的逻辑
    论文强调在一个统一的“动作链”中,对每个子问题决定是否需要外部检索、以及如何对外部信息进行验证和融合。这不仅涉及模型的“思考过程”,还要在过程中融合多种不同来源的数据,这会引入多步推理和信息冲突检测的复杂度。

  2. 多参考打分(MRFS)的原理和作用
    这是作者提出用来判断“模型生成答案是否与外部检索的信息相矛盾”的核心指标。它不仅需要对文本做相似度比较,而且还要融合“精确度”“召回率”等多个维度;如何计算和理解这个打分方法往往是初次阅读时的难点。

  3. 知识边界检测
    虽然概念上很好理解:如果模型“自己就会”,那就别动用外部检索;可如果模型“不确定”,就要去找外援。但是如何“自动判断”模型到底会不会,是一个比较微妙的问题。它牵涉到对LLM内部记忆或训练分布的认知,以及对答复一致性、可行性的判断方式。

  4. “Plug-and-Play”动作如何无缝衔接
    作者提出了三种可插拔动作(web查询、知识库查询、数据分析),并且希望未来可以再扩展到更多模态。如何保证在同一个动作链里,不同的数据源能够协同工作,在技术实现和流程管理上也需要一定理解。

在这些点中,如果要说最具挑战性的部分,往往是MRFS打分机制动作链如何自动触发多类型检索。它们都是这个方法的核心逻辑和创新点。


3. 概念依赖关系

从依赖关系看,最根本的概念是Chain-of-Action (CoA)框架。它支撑了整篇论文的大结构,包括:

  • CoA中的动作链:将用户问题拆解成多个子问题,并且对每个子问题打上“缺失信息标记”或给出一个“猜测答案”。

  • Plug-and-Play动作:在动作链中,某些子问题会被识别为“需要额外信息”,就调用相应的检索或分析动作;否则维持模型内知识。

  • MRFS打分:用于核验生成答案和外部信息的一致性,并在需要时修正答案。

  • 知识边界检测:帮助决定是否真的需要检索动作,或是否可以直接使用内部知识。

因此,CoA框架是最佳切入点;只有在理解了为什么要设计一个动作链、以及这个链里每个节点发生了什么,才能明白MRFS的作用以及怎么做知识边界检测。


阶段总结

  • 核心创新:是一个能自动“检索”+“推理”+“冲突验证”的统一框架,同时注重性能和多数据源信息的结合。

  • 最大难点:如何在执行时管理动作链、度量答案的可信度(MRFS),以及决定什么时候不必检索。

  • 概念关系:以CoA为中心展开,其余关键机制都是为了实现或完善CoA的“多步推理+多源融合+自动判断需求”而服务的。


二.深入解释核心概念

1. 设计生活化比喻

我们可以把“Chain-of-Action (CoA)框架”想象成一个“侦探团队破案”的过程:

  • 整个侦探团队(对应我们的CoA系统)要解答一个复杂案件(对应复杂问题或复杂问答)。

  • 侦探团队中有一位总探长(对应LLM本身),他会先根据已有经验(模型内知识)对案件做出初步判断。但是,如果他觉得自己掌握的信息不够,就会让不同的外部角色去帮忙搜集或验证信息。

    • 例如,让外勤侦探去街头调查(对应web检索),

    • 档案管理员去档案馆里查阅往期资料(对应知识库检索),

    • 专业分析师做现场数据勘测或财务表分析(对应数据分析)。

  • 当这些信息“收集回来”后,总探长会重新核实:是否跟自己原先的推断相冲突?冲突大不大?如果冲突很严重,就要修改先前的结论。

在这个过程中,为了判断“是不是和外界信息相矛盾”,就需要一套评分标准(对应MRFS)。我们可以把MRFS比作“嫌疑人供词与证据吻合程度”的打分系统:

  • 如果侦探团队发现供词(生成的答案)与搜集到的硬证据吻合度特别低,就说明可能在“胡编”,必须立刻调整说法或直接用证据来纠正。


2. 建立比喻与实际技术的对应关系

让我们把上述比喻中的关键角色或环节,与论文的实际技术概念一一对应:

  1. 侦探团队(CoA系统)

    • 现实中的CoA框架就是一个全局统筹“多步推理+外部检索+验证修正”的系统。

  2. 总探长(LLM本身)

    • 该模型拥有一定的“先验知识”(训练数据的记忆)。当面对一个问题时,它先给出主观推断。

  3. 外勤侦探(Web-querying Action)

    • 当遇到不确定的子问题,需要上网搜索最新信息,就像外勤侦探去街头调查。

  4. 档案管理员(Knowledge-encoding Action)

    • 在需要专业或领域资料时,可以从内部知识库/向量数据库中调取文档,就像管理员去档案馆查阅记录。

  5. 专业分析师(Data-analyzing Action)

    • 面对数字表格或复杂API数据,就像让专家进行财务勘察或技术分析。

  6. 嫌疑人供词与证据吻合度打分(MRFS)

    • 若“嫌疑人供词”(LLM生成的答案)与“搜集到的证据”(外部检索信息)差异很大,就要做“分数判定”。一旦分数低,则怀疑它不可信,并用外部证据修正。

这样一来,整个侦探团队就能既动用自己的经验,也能灵活借助外部信息,最后再做一道核验,确保结论足够靠谱且不自相矛盾。


3. 深入技术细节(引用原版公式并做逐条解释)

下面先列出论文的关键公式(原版形式),然后用自然语言说明含义。

3.1 MRFS打分相关公式

根据论文,MRFS(Multi-reference Faith Score)主要是用来比较“模型生成答案”与“外部检索内容”在多重参考下的一致程度。其核心包括以下几条:

(1)

(2)

(3)

(4)

(5)

我们先逐个解释这些符号都什么意思,再做自然语言替换。


3.1.1 符号替换与自然语言解释

  • :表示单个候选答案与检索到的某一条参考信息之间的“匹配得分”。

  • :是超参数(类似不同权重),决定了、、三项在总分中的占比。

  • (Precision,准确率):可以理解为“供词和证据中重叠的部分,占供词自身的比例”。

    • 类比在侦探比喻中:如果嫌疑人说了10句关键话,结果只有2句在证据里能印证,那准确率就是。

  • (Recall,召回率):是“供词和证据的重叠部分,占证据本身的比例”。

    • 还是侦探比喻:如果证据里有5句关键信息,嫌疑人只对其中2句给出了相匹配的说法,那召回率就是。

  • (Average Word Length):平均词长;代表候选答案的用词复杂度或密度。论文中把它也纳入分值,想借此衡量语言的简洁度或与参考文本的语言特征接近度。

  • :最后的多参考打分,是从所有参考信息得到的一组中取最大值,表示候选答案与一系列外部信息匹配度的最高分。

自然语言“替换版”示意:

“侦探团队会比较嫌疑人的供词和多条证据的相似度;相似度的计算综合了准确率()、召回率()和词汇特征(),三者按不同权重求和。如果所有证据都跟供词很不匹配,那么最终得分就会很低,说明嫌疑人是在编故事;如果有某条证据能很好地匹配供词,就能获得较高分数。”


4. 将技术细节与比喻相互映射

(1)触发检索动作

  • 比喻中:总探长发现自己搞不清案情,就让外勤侦探或档案管理员去调查。

  • 技术中:CoA框架的“动作节点”判定“missing_flag=True”时,就会调用相应的外部数据源(Web查询、知识库检索、数据分析)。

(2)整合信息并计算MRFS

  • 比喻中:当外勤侦探带回若干条证据,总探长会检查“供词和证据是否吻合”,看有没有相矛盾的信息。

  • 技术中:对于每一个子问题,系统将“模型猜测答案”与“检索到的参考”进行对比,根据上面列出的公式(1)~(5)算出一个得分,再取所有中的最大值成为。

(3)修正低分答案

  • 比喻中:一旦供词和证据严重冲突,就得重新审讯、修订供词,或者直接采用“证据所展现的事实”去纠正。

  • 技术中:如果低于设定阈值,则说明猜测答案不可信,需要把外部检索到的信息合并进来并“覆盖”或“改写”原先答案。

(4)避免重复检索

  • 比喻中:如果总探长对某个问题已经非常自信,就不会再派外勤侦探去调查,以节省时间和人力。

  • 技术中:论文所说的“知识边界检测”,能减少不必要的检索与LLM调用;如果子问题在模型内部就能回答得足够好,就不触发外部API。


5. 总结:比喻与实际技术的核心联系

  • 通过侦探团队破案的类比,可以帮助我们理解CoA为什么要分成多个子问题、为什么要进行外部数据检索、以及如何通过MRFS来修正生成答案

  • 公式(1)~(5)正对应“侦探校对供词与证据吻合度”的定量过程;而将其放在“动作链”的多轮执行当中,能不断修正或补全模型答案,使其更贴近真实情况。

  • 该比喻的局限性在于:真实的侦探工作可能远比公式化的打分更复杂,但它给我们提供了一个简单直观的思路——一旦发现不一致,就要回头查证并修正,以保证最终结论可信。


三.详细说明流程步骤

以下内容主要基于论文正文及其附录(Algorithm 1 相关描述),在此之上加以细化。我们会先介绍整个流程的高层思路,然后以一个小例子“是否应该买比特币”为示范,最后给出带有关键注释的伪代码。

1. 总体流程概览

从高层视角,Chain-of-Action (CoA)的处理流程分为三个主要阶段

  1. Action Chain Generation(动作链生成)

    • :本节点要调用的动作类型(例如Web查询、知识库检索、数据分析,或直接使用LLM本身知识),

    • :针对该节点要解决的子问题,

    • :是否缺少外部信息(True/False),

    • :LLM基于内在知识先给出的猜测答案(如果不确定,就留空,MF设为True)。

    • 给定一个复杂的用户问题,系统会先使用LLM(大语言模型)去生成一条“动作链”。

    • 这条动作链是一系列“节点”(Node)的序列,每个节点包含:

  2. Actions Execution & Verification(动作执行与验证)

    • :从互联网上搜索最新资料;

    • :如对表格数据或数值型API执行分析。   $$

    • 针对生成的“动作链”中每一个节点,如果Missing_flag == True或者模型对其答案不够自信,就会调用相应的检索动作:

  3. Final Answer Generation(最终答案整合输出)

    • 所有节点的答案都经过检索和可能的修正后,系统会把更新后的动作链再次交给LLM,使用一个特别的“Final Generation Prompt”让模型基于完整、正确的子问题答案,输出[Final Content]。

    • 这一步通常以一个相对简洁的形式回答用户问题,也可选地展示推理或引用来源。


2. 举例示范:从输入到输出

以一个典型问题“现在适合买比特币吗?(Is it good to invest Bitcoin now?)”为例,流程可能是这样:

  1. Action Chain Generation

    • Sub_1: “比特币是什么?”(模型能回答,MF=False,Guess_answer=“一种去中心化数字货币...”)

    • Sub_2: “比特币近期价格走势?”(模型不确定,MF=True,Guess_answer留空)

    • Sub_3: “市场新闻或行情分析?”(模型也不确定,MF=True,Guess_answer留空)

    • Action_1: 无需外部检索(用内在知识回答即可);

    • Action_2: Web查询(因为要实时的价格走势);

    • Action_3: 数据分析/新闻搜索(获取行情、情绪分析)。

    • 用户问题:

    • LLM通过一个“Chain-of-Action Prompt”进行推断:

    1. 生成若干子问题:

    2. 给出对应的Action类型:

  2. Actions Execution & Verification

    • 依赖于知识库或更多Web搜索/数据API;

    • 可能会检索分析师对行情的评价、最近Twitter舆情等;

    • 结合MRFS,若与检索信息矛盾,就要纠正。

    • 触发Web查询:抓取最新的比特币价格数据和媒体报道;

    • 计算MRFS:检查模型先前“可能的猜测”与检索内容差异(由于本例中原先是空,所以直接用检索信息填充);

    • 不触发外部检索;

    • 模型认为自己对基础概念足够熟悉。

    • Node 1: Sub_1=“比特币是什么?”,MF=False,Guess_answer=“一种数字货币,由去中心化的区块链维护……”

    • Node 2: Sub_2=“比特币近期价格走势?”,MF=True

    • Node 3: Sub_3=“市场新闻或行情分析?”,MF=True

  3. Final Answer Generation

    • 当所有子问题都拿到较可信的答案后,系统用一个“Final Prompt”对LLM说:“请根据已经确定好的子问题和答案,输出[Final Content]”。

    • LLM可能生成:

      “[Final Content]: 比特币是一种去中心化的数字资产。根据最近的市场价格和分析师意见,过去两周上涨,情绪普遍偏乐观,短期内或有一定机会。但是数字货币风险较高,建议投资者审慎评估……”

这样用户就得到了带有外部证据支撑的“最终答案”。


3. 伪代码示例

以下是一个整合版的伪代码,展示了从输入到输出最终答案的关键流程。
其中包括动作链生成逐节点执行与验证以及最终答案合成
你可以把它当作高层伪代码来实现CoA系统的主逻辑。

########################################################
# Pseudocode: Chain-of-Action (CoA) Full Pipeline
########################################################

# === Part 1: Action Chain Generation ===
function CHAIN_GENERATION(Q, LLM_model):
    """
    输入: 
        Q - 用户问题 (字符串)
        LLM_model - 一个可调用的语言模型 (如 GPT-3.5/4)
    输出:
        AC - 动作链, 包含若干节点[(Action_i, Sub_i, MF_i, A_i), ...]
    """
    # 准备提示(Prompt)让LLM只输出动作链,不要直接回答问题
    prompt_template = """
    Construct an action reasoning chain for the user question: "{Q}".
    For each step, specify:
     - Action: [what to do]
     - Sub: [sub-question]
     - missing_flag: [True/False]
     - guess_answer: [If you know it, fill in; else leave blank]
    """
    combined_prompt = prompt_template.format(Q=Q)
    
    # 调用LLM获得动作链
    # (此处我们模拟: LLM返回JSON或特定格式)
    AC = LLM_model.generate_chain(combined_prompt)
    
    return AC


# === Part 2: Actions Execution & Verification ===
function ACTIONS_EXECUTION_AND_VERIFICATION(AC, LLM_model, retrieval_modules):
    """
    输入:
        AC - 动作链
        LLM_model - 语言模型, 用于回答或修正
        retrieval_modules - 一个包含各种检索/分析函数的集合:
            e.g. retrieval_modules.web_querying(), 
                 retrieval_modules.knowledge_encoding(), 
                 retrieval_modules.data_analyzing()
    输出:
        Updated AC - 更新后的动作链(可能修正了一些A_i)
    """
    for node in AC:
        Sub_i = node.Sub
        A_i   = node.guess_answer
        MF_i  = node.missing_flag
        Act_i = node.Action

        # Step 1: 判断是否需要检索
        # 如果missing_flag为True 或 LLM对于A_i不够自信,则执行外部检索
        if MF_i == True or model_confidence(LLM_model, A_i) <  some_conf_threshold:
            
            # 根据Act_i选择相应的“检索/分析”动作
            if Act_i == "web-querying":
                retrieval_info = retrieval_modules.web_querying(Sub_i)
            elif Act_i == "knowledge-encoding":
                retrieval_info = retrieval_modules.knowledge_encoding(Sub_i, A_i)
            elif Act_i == "data-analyzing":
                retrieval_info = retrieval_modules.data_analyzing(Sub_i)
            else:
                retrieval_info = None

            # Step 2: 计算MRFS打分 (多条检索信息可能合并为列表)
            # MRFS = max(S_k(A_i)), 其中S = alpha*P + beta*Rcl + gamma*AWL
            # (见第二阶段公式)
            mrfs_value = compute_MRFS(A_i, retrieval_info)

            # Step 3: 检测是否低于阈值T, 如果是, 则修正A_i
            if mrfs_value < T:
                # 将retrieval_info中的关键信息合并/重写到A_i
                A_i = revise_answer_based_on_retrieval(A_i, retrieval_info, LLM_model)

            # 如果原来MF_i=True,就把它标记为False,表示已有外部信息
            node.missing_flag = False
        
        # 更新node的guess_answer
        node.guess_answer = A_i
    
    return AC


# === Part 3: Final Answer Generation ===
function FINAL_ANSWER(AC, LLM_model):
    """
    输入:
        AC - 更新后的动作链
        LLM_model - 语言模型
    输出:
        final_answer - [Final Content] 形式的最终回答
    """
    # 准备一个让LLM进行最终整合的提示
    # 例如提示里会列出所有(子问题, 最终答案), 要模型写出“[Final Content]”开头的总回答
    prompt_for_final = build_final_prompt(AC)
    
    final_answer = LLM_model.generate_text(prompt_for_final)
    return final_answer


# === Main Pipeline ===
function COA_MAIN(Q):
    # 1) 生成动作链
    AC = CHAIN_GENERATION(Q, LLM_model)

    # 2) 执行动作链 (外部检索 & MRFS打分 & 修正)
    AC_updated = ACTIONS_EXECUTION_AND_VERIFICATION(AC, LLM_model, retrieval_modules)

    # 3) 最终答案
    answer = FINAL_ANSWER(AC_updated, LLM_model)
    return answer
伪代码说明
  1. CHAIN_GENERATION(Q, LLM_model)

    • 通过一个精心设计的prompt,让LLM只输出“动作链”,而不直接回答问题。

    • 每个节点包括Action, Sub, missing_flag, guess_answer四要素。

  2. ACTIONS_EXECUTION_AND_VERIFICATION(AC, LLM_model, retrieval_modules)

    • 对动作链中每个节点做检查:若missing_flag=True或模型置信度不高,就调用相应外部函数进行检索或分析。

    • 用MRFS检测回答和检索结果的吻合度,如果太低,则用检索到的信息修正答案。

  3. FINAL_ANSWER(AC, LLM_model)

    • 将更新后的节点(包含修正过的答案)组合成一个新的prompt,再次发送给LLM,让它进行最终输出

    • 这样可以避免LLM在信息不全的阶段就急着给结论。

  4. COA_MAIN(Q)

    • 将以上三个步骤组合成一个主函数。当用户输入问题时,就按照生成动作链 → 执行与验证 → 最后整合的顺序走完流程,并输出最终答案。


4. 如何串接各个阶段的输入输出

  • 第一阶段(生成动作链)的输出:是一个动作链。这个链类似一张“任务清单”,列出所有子问题,以及对每个子问题的处理指令。

  • 第二阶段(执行与验证)的输出:依旧是,但其中可能出现多次改写,比如补充了检索信息、对“guess_answer”做了修正等。

  • 第三阶段(最终答案)的输出:最终文本回答。例如:“[Final Content]: 现在的比特币价格与市场情绪如何……”。这才是面向用户的结果。

因此,每一阶段的输出都能作为下一阶段的输入,在整体管线中环环相扣。


5. 结语

通过上述流程及示例,我们可以看到CoA框架如何分步骤地结合LLM内部知识与外部检索信息,并且在需要时运用MRFS进行冲突检测和答案修正。

  • 这套流程能有效减少“幻觉”以及不必要的检索成本,解决了许多复杂问答场景的痛点。

  • 对于一个未看过论文的人,只要理解了动作链的组织方式MRFS打分与修正规则以及最终二次生成答案的思路,就能够大致复现CoA的核心运行机制。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

强化学习曾小健

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值