admin管理员组

文章数量:1445111

抽象推理链CoA能否增强RAG应用对用户问题的理解?

自从在《蚂蚁开源新RAG框架KAG,可达91%准确率》中提到蚂蚁集团使用 CoA 来推理问题后,我就一直心痒难耐,想亲自试试这种 CoA(Chain of Actions)在问题理解和工具调用中的实际表现。好多文章在说明高级RAG时候,我们应该尝试查询重写,扩展,分解。但实际写下来并不好用,那么CoA能否用来做用户问题理解呢?

虽然我们此前已经讲述过这种 Agent 推理工作流《Agentic workflow》,但当时并未意识到其效果竟如此显著。同时,也曾提到推理能力与大模型的参数规模密切相关。而如今,主流厂商纷纷推出具有深度思考能力的大模型,这进一步提升了推理效率和精度。

“虽然蚂蚁开源的 KAG 框架具有较高的准确率,但其复杂性和概念的多样性让实际应用显得困难重重……不过 CoA 的设计看起来的确简洁而高效。

那么,CoA 应该如何使用呢?虽然相关论文Efficient Tool Use with Chain-of-Abstraction Reasoning[1] 并未提供开源实现,而蚂蚁 KAG 中的实现又较为分散、提取困难,但幸运的是,我们在 LlamaIndex 上发现了一套开源实现[2],甚至包含了 Demo 演示。接下来,我们将测试这套实现。同时,我也在尝试将 CoA 接入到自己的项目中,分享具体的实践经验与心得。

1. Agent

LlamaIndex 对于 Agent 定义是一个自动化的推理和决策引擎。它接收用户的输入或查询,并能够为执行该查询做出内部决策,以返回正确的结果。代理的关键组件包括但不限于:

  • 将复杂问题分解为更小的问题
  • 选择需要使用的外部工具,并设计调用工具的参数
  • 规划一系列任务
  • 将已完成的任务存储在一个记忆模块中

其实分解问题属于大模型规划能力,不论是 CoT(Chain of Thought)还是 CoA (Chain of Abstraction)都是用来规划问题,然后就可以通过调用外部工具来解决分解的问题,将中间结果存储到 Agent 短期记忆中,最后根据获取的信息进行推理,从而生成最终的答案。

2. CoA

考虑到可能有人没读过上一篇,为了文章的完整性,这里简要介绍一下 CoA的背景,并附上论文 Efficient Tool Use with Chain-of-Abstraction Reasoning[3] 的链接和相关图示,方便大家理解。CoA 是一种高效的工具使用方法,核心在于通过抽象链式推理来解决复杂问题。这种方法能够将问题逐层分解,并结合工具调用来逐步生成答案,从而实现高效且可解释的推理过程。以下是论文中的关键内容和图示,帮助大家快速掌握 CoA 的原理和应用场景。

3. CoAAgent 使用

通过提示大模型来生成一系列思维链的工具调用格式,然后调用多个工具组合完成任务。一个 CoA 问题规划可能类似如下:

代码语言:javascript代码运行次数:0运行复制
After buying the apples, Sally has [FUNC add(3, 2) = y1] apples.
Then, the wizard casts a spell to multiply the number of apples by 3,
resulting in [FUNC multiply(y1, 3) = y2] apples.

从这个提示可以看出,我们只需提取这些工具并执行,最后将结果组合即可。接下来,我们将开始安装和使用,并演示一个案例:对 Uber 和 Lyft 的 2021 年报告进行问答。案例中使用了 CoA Agent 来规划复杂问题,并通过 RAG 抽取信息后给出答案。

3.1 安装依赖

代码语言:javascript代码运行次数:0运行复制
pip install llama-index-core llama-index-llms-openai
pip install llama-index-agent-coa
pip install llama-index-embeddings-siliconflow

3.2 初始设置

代码语言:javascript代码运行次数:0运行复制
Settings.llm = OpenAI(
    model="glm-4-flash",
    api_base=";,
    api_key="xxx",
)
Settings.embed_model = SiliconFlowEmbedding(
    model="BAAI/bge-m3",
    api_key="xxx",
)

3.3 索引数据

代码语言:javascript代码运行次数:0运行复制
mkdir -p 'data/10k/'
wget '.pdf' -O 'data/10k/uber_2021.pdf'
wget '.pdf' -O 'data/10k/lyft_2021.pdf'
代码语言:javascript代码运行次数:0运行复制
# load data
lyft_docs = SimpleDirectoryReader(
    input_files=["../data/10k/lyft_2021.pdf"],
    # file_extractor=file_extractor,
).load_data()
uber_docs = SimpleDirectoryReader(
    input_files=["../data/10k/uber_2021.pdf"],
    # file_extractor=file_extractor,
).load_data()

# build index
lyft_index = VectorStoreIndex.from_documents(lyft_docs)
uber_index = VectorStoreIndex.from_documents(uber_docs)

3.4 构建工具

将索引作为检索工具

代码语言:javascript代码运行次数:0运行复制
from llama_index.core.tools import QueryEngineTool

lyft_engine = lyft_index.as_query_engine(similarity_top_k=2)
uber_engine = uber_index.as_query_engine(similarity_top_k=2)

query_engine_tools = [
    QueryEngineTool.from_defaults(
        query_engine=lyft_engine,
        name="lyft_10k",
        description=(
            "Provides information about Lyft financials for year 2021. "
            "Use a detailed plain text question as input to the tool."
        ),
    ),
    QueryEngineTool.from_defaults(
        query_engine=uber_engine,
        name="uber_10k",
        description=(
            "Provides information about Uber financials for year 2021. "
            "Use a detailed plain text question as input to the tool."
        ),
    ),
]

3.5 使用 CoAAgent

代码语言:javascript代码运行次数:0运行复制
from llama_index.packs.agents_coa import CoAAgentPack

pack = CoAAgentPack(tools=query_engine_tools, llm=Settings.llm)
response = pack.run("How did Ubers revenue growth compare to Lyfts in 2021?")

print(str(response))

image-20241227121447882

整个过程类似:

  • 工具被解析为类似 Python 的定义。
  • Agent 被提示生成一个 CoA(Chain of Actions,动作链)计划。
  • 从计划中提取函数调用并执行。
  • 填充计划中的值。
  • Agent 生成最终的响应。

总结

对于这种复杂问题,通过大模型拆解为简单问题,通过信息检索最后合并生成答案,根据我的测试效果非常不错,甚至还可以加入上下文以便 CoA 能够扩展问题或者分解问题。那么问题是什么呢?第一点,响应慢,CoA 需要等待一轮 LLM 的抽象推理,按照我的测试大约有 5 秒左右延迟。第二点,还是慢,目前实现并没有并发工具调用。第三点,中间结果我觉得也可以不要合成,而是直接提供检索信息,丢给大模型,让其根据规划步骤,自己推理每个结果并最终生成,这样应该能够将响应速度提到不少。

“如果你对 LlamaIndex 感兴趣,我强烈推荐一本好书:《基于大模型的RAG应用开发与优化》。这本书内容丰富,覆盖了LlamaIndex从入门到进阶的各个方面,既适合新手快速上手,也能为有经验的开发者提供深入的见解。我个人也在阅读中,收获颇丰,非常值得一读!

参考资料

[1]

Efficient Tool Use with Chain-of-Abstraction Reasoning: .17464

[2]

开源实现: .ipynb

[3]

Efficient Tool Use with Chain-of-Abstraction Reasoning: .17464

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。原始发表:2025-01-02,如有侵权请联系 cloudcommunity@tencent 删除开源测试工具论文模型

本文标签: 抽象推理链CoA能否增强RAG应用对用户问题的理解