游乐游手机版
首页/AI热点日报/热点详情

结构化RAG约束JSON响应格式提升AI系统成功率82.55%

类型:热点整理2026-05-30
最近,不少朋友在折腾 Dify、Coze、元器这类 Workflow 工具时,应该都感受到了一个明显的变化:最牛的人工智能结果,越来越不是靠一个模型单打独斗能拿下的了,而是得靠多个组件拼起来的复合AI系统。但这里有个让人头疼的问题——这些组件之间要能顺畅交流,往往需要特定的输出格式,才能被下一个流程

最近,不少朋友在折腾 Dify、Coze、元器这类 Workflow 工具时,应该都感受到了一个明显的变化:最牛的人工智能结果,越来越不是靠一个模型单打独斗能拿下的了,而是得靠多个组件拼起来的复合AI系统。但这里有个让人头疼的问题——这些组件之间要能顺畅交流,往往需要特定的输出格式,才能被下一个流程正确解析。

可怎么让大模型老老实实地按规矩输出,比如生成结构严谨的 JSON 数据,一直是老大难。就在这个节骨眼上,向量数据库巨头 Wea viate 团队主导的 StructuredRAG 研究登场了。它不仅揭示了复合AI系统的巨大潜力,也为我们理解大模型在结构化输出这件事上的能力边界,提供了前所未有的视角。

要聊 StructuredRAG,得先搞明白“复合AI系统”这个概念。简单说,它就是把多个专门化的AI模型或工具组合起来,协同完成复杂任务的系统。这已经不再是靠一个超大模型包打天下的思路了。

Wea viate 作为向量数据库的领头羊,对复合AI系统的潜力自然门儿清。在这个体系里,向量数据库常常是核心枢纽,为不同组件提供高效的数据存取和检索。StructuredRAG 这项研究,正是为了解决复合AI系统里一个关键难题——如何保证大模型能稳定输出符合预设格式的结构化数据。下面,我们就来好好拆解这项开创性研究,看看它对AI行业到底意味着什么,以及它和 DSPy 这类前沿框架之间有什么内在联系。

01 为Compound AI Systems打地基

为什么结构化输出这么要紧?

很多朋友在搞智能体时都踩过类似的坑:明明设好了变量,加了约束语句,AI 助手的回复还是五花八门,格式乱成一锅粥。这会导致后续处理变得异常棘手。所以,提升大模型的结构化输出能力,是构建稳定、可靠AI系统的关键一环。

StructuredRAG 就提供了一种新思路,它把大模型的输出进行格式化,让结果变得更友好。它不只是给你一大段文字,而是把信息分层组织,给不同类型的内容打上标签(比如事实、观点、说明),再附上额外的元数据,帮你快速理解。

举个例子。以前它可能这么回复:

{
"text": "The capital of France is Paris. The Eiffel Tower is a famous landmark in Paris. Paris has a population of over 2 million people."
}

用了 StructuredRAG 之后,返回的内容就变成了这样:

{
"facts": [
{
"text": "The capital of France is Paris.",
"type": "geographic"
},
{
"text": "The Eiffel Tower is a famous landmark in Paris.",
"type": "landmark"
},
{
"text": "Paris has a population of over 2 million people.",
"type": "demographic"
}
],
"meta": {
"topic": "Paris, France",
"source": "Wikipedia"
}
}

这种结构化格式的好处显而易见:层级分明、类型清晰、还有上下文元数据,用户理解和交互起来都方便多了。它大大提升了LLM输出的可用性和可解释性。

StructuredRAG基准测试包含六个精心设计的任务:

1. 输出单个字符串

2. 输出单个整数

3. 输出布尔值

4. 输出字符串列表

5. 输出复合对象(包含答案和置信度)

6. 输出复合对象列表

这些任务看着简单,却基本覆盖了复合AI系统里常见的数据交换场景。比如,在多轮问答中,第一个组件可能得输出一个查询列表(任务4),第二个组件则要生成带置信度的答案(任务5)。从简单到复杂,这些任务为全面评估大模型的结构化输出能力,搭好了舞台。

StructuredRAG 的核心,就是把大模型那堆非结构化的文本,转成更有条理、带注释的 JSON 格式。这个过程大致分四步:

  1. 分段:先把LLM的输出切分成更小、语义清晰的片段(比如单个事实、观点或说明)。
  2. 类型注释:给每个片段标上具体类型(例如地理、人口统计、地标),说明它是什么信息。
  3. 分层组织:把片段组织成层级结构,相关内容放一起,该嵌套就嵌套。
  4. 上下文元数据:附加上下文元数据,比如主题、来源,帮用户更好地理解信息。

这么一来,最终的 StructuredRAG 格式对用户就直观多了,能快速抓住内容要点,识别不同类型的信息,更高效地浏览整个回复。

02 实验设计:两种模型,两种提示策略

这次实验选了两个有代表性的模型来摸底:

1. Gemini 1.5 Pro:代表了当前最先进的大规模语言模型。

2. Llama 3 8B-instruct (4位量化版本):代表了较小但经过指令微调的模型。

同时,还比较了两种不同的提示策略:

1. f-String提示:把任务相关的变量直接嵌入到提示里。

Task Instructions:{task_instructions}
References:{references}
Output the result as a JSON string with the following format:{response_format}
IMPORTANT!!Do not start the JSON with 'json or end it with

2. Follow the Format (FF)提示:采用更严格的格式,先解释任务,再给出响应格式,最后提供输入变量。

Follow the task_instructions(Input Field) and generate the response(Output Field)
according to the output format given by response_format(Input Field). You will be
given references from(Task-Specific Input Field)
Follow the format.
---
task_instructions:{task_instructions}
response_format:{response_format}
references:{references}
response:

这个实验设计,既能比较不同规模模型的能力差异,也能评估不同提示策略的效果。

WikiQuestions:模拟真实场景的数据集

为了让测试更贴近实际,研究人员专门建了个 WikiQuestions 数据集:

- 从维基百科随机选了56个标题和摘要

- 每个标题-摘要对应一个可回答的问题和一个不可回答的问题

- 总共112个问题用来测试

这个数据集很好地模拟了检索增强生成(RAG)系统里的真实情况,让测试更有实际意义。

惊人的结果:高方差与意外表现

实验结果一出,有点出人意料:

1. 总体成功率:在24次实验中,平均成功率达到82.55%。

2. 高度方差:有11次测试做到了100%成功,但也有2次测试掉到了25%以下。

3. Gemini vs Llama:Gemini 1.5 Pro 平均成功率93.4%,表现更好;Llama 3 8B-instruct 是71.7%。

4. 任务难度:单一类型输出(字符串、整数、布尔值)成功率普遍较高,列表和复合对象输出挑战更大。

5. 提示策略:对 Gemini 1.5 Pro 来说,f-String 提示更管用;而对 Llama 3 8B-instruct,FF 提示略胜一筹。

这些结果揭示了一个现实:大模型在结构化输出这件事上,情况相当复杂。哪怕是最先进的模型,在某些任务上也可能翻车。

成功与失败的原因

研究人员发现,最常见的翻车情况包括:

1. 模型只是确认了一下任务,却没去执行。

2. 输出中多了不少解释性的“废话”。

3. 类型搞错了(比如把整数输出成了字符串)。

这些失败模式告诉我们,即使是高度先进的LLM,在理解和严格执行结构化输出指令上,还有不小的改进空间。

OPRO:优化提示,突破极限

面对 Llama 3 8B-instruct 在某些任务上“低得可怜”的成功率,研究人员祭出了 OPRO(优化提示)技术。这个方法通过迭代优化提示,效果立竿见影:

1. 把 GenerateAnswersWithConfidences 任务的成功率从25%直接拉到了100%。

2. 优化后的提示包含了更详细的指导,比如“仔细审查任务说明”、“确保输出纯净且正确的 JSON”。

OPRO 的成功说明,哪怕是相对小的模型,只要提示设计得足够巧妙,也能在复杂任务上大放异彩。

关于 OPRO,可以看看这篇文章:谷歌DeepMind重磅:提示工程师必须掌握OPRO,用LLM就能自动优化Prompt|ICLR2024

03 StructuredRAG与DSPy

虽然 StructuredRAG 研究不是直接基于 DSPy 的,但它俩在不少方面表现出了惊人的默契:

1. 结构化输出的重要性:两者都强调在复杂AI系统里,处理结构化数据是核心。

2. 提示策略:StructuredRAG 的 FF 提示策略,跟 DSPy 的提示方法有异曲同工之妙。

3. 优化技术:OPRO 的成功,和 DSPy 的提示优化功能形成了有趣的呼应。

4. 评估方法:StructuredRAG 的基准测试,可以看作是给 DSPy 等框架补充的评估工具。

这些共性不仅反映了当前AI研究在复合AI系统方向上的共同趋势,也为未来的协同研究指了条路。来看看下面这段 DSPy 代码:

import dspy
from typing import Optional, Any, Dict
from structured_rag.dspy_signatures import GenerateResponse

class dspy_Program(dspy.Module):
    def __init__(self, 
                 test_params: Dict[str, str],
                 model_name: str, model_provider: str, api_key: Optional[str] = None) -> None:
        super().__init__()
        self.test_params = test_params
        self.model_name = model_name
        self.model_provider = model_provider
        self.configure_llm(api_key)
        self.generate_response = dspy.ChainOfThought(GenerateResponse)
        
    def configure_llm(self, api_key: Optional[str] = None):
        if self.model_provider == "ollama":
            llm = dspy.OllamaLocal(model=self.model_name, max_tokens=4000, timeout_s=480)
        elif self.model_provider == "google":
            llm = dspy.Google(model=self.model_name, api_key=api_key)
        else:
            raise ValueError(f"Unsupported model provider: {self.model_provider}")

        print("Running LLM connection test (say hello)...")
        print(llm("say hello"))
        dspy.settings.configure(lm=llm)

    def forward(self, test: str, question: str, context: Optional[str] = "") -> Any:
        references = {"context": context, "question": question}
        references = "".join(f"{k}: {v}" for k, v in references.items())
        response = self.generate_response(
            task_instructions=self.test_params['task_instructions'],
            response_format=self.test_params['response_format'],
            references=references
        ).response

        return response

虽然论文里没直接点明,但要注意的是,DSPy 的一些核心开发者(比如 Omar Khattab)也参与了类似领域的研究。这说明 StructuredRAG 和 DSPy 背后可能有着共同的研究背景和思想源流。

尽管 StructuredRAG 论文不直接聊 DSPy,但它们在研究目标、方法论和未来发展方向上有很多共通之处。StructuredRAG 的研究成果,很可能会给 DSPy 的进一步发展和应用提供有价值的参考;反过来,DSPy 的实践经验也可能影响 StructuredRAG 这类基准测试的设计和应用。这种相互影响,恰恰是当前AI研究领域紧密联系、快速发展的一个缩影。

关于输出约束,可以看看这几篇“惊雷”系列文章:一记惊雷:改一下Prompt的输出顺序,就能显著影响LLM的评估结果;又见惊雷,结构化Prompt格式小小变化竟能让LLM性能波动高达76%,ICLR2024

04 对开发者的深度启示

StructuredRAG 的研究成果,给复合AI系统的开发者提供了好几点实用的指导:

1. 模型选择策略

- 根据任务复杂度和资源限制,在大型通用模型和小型专门模型之间找到平衡点。

- 可以考虑在系统里混搭不同规模的模型,平衡好性能和效率。

2. 提示工程的艺术

- 为不同的模型和任务,定制对应的提示策略。

- 利用 OPRO 这类技术动态优化提示,提升系统整体表现。

3. 错误处理机制设计

- 根据研究揭示的常见失败模式,设计健壮的错误检测和恢复策略。

- 做好跨组件的错误传播控制,防止局部问题拖垮整个系统。

4. 持续评估与优化

- 把 StructuredRAG 这类基准测试纳入开发流程,定期给系统“体检”。

- 建立动态优化机制,根据实时性能数据调整系统配置。

5. 接口设计与标准化

- 基于研究中的结构化输出任务,设计标准化的组件间通信接口。

- 推动行业内的接口标准化,让不同的复合AI系统之间更好配合。

6. 更多优化策略

研究人员还指出了几个值得探索的优化方向:

1. 集成:利用LLM的随机性,每次输入生成多个输出,然后“投票”选最好的。

2. 重试机制:对失败的输出,再试一次,并加上“重试”提示。

3. 思维链提示:加上“理由”键,让模型先想清楚再回答。

4. 高级提示优化:探索像 MIPRO 这种更复杂的优化技术。

这些方向为进一步提升大模型的结构化输出能力,留出了广阔的想象空间。

StructuredRAG 这项研究,展示了 Wea viate 在尖端AI研究领域的硬实力。它也在从单纯的数据存储提供商,向复合AI系统的核心基础设施提供商转变。说白了,用好 StructuredRAG 的研究成果,不断打磨你的提示策略和系统设计,你完全有可能搞出更厉害的 AI 产品。

来源:https://www.53ai.com/news/RAG/2024090587691.html

相关热点

继续查看同栏目近期热点。

延伸阅读

补充最近整理过的热点入口。