ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;background-color: rgb(255, 255, 255);visibility: visible;line-height: normal;"> ingFang SC", system-ui, -apple-system, BlinkMacSystemFont, "Helvetica Neue", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;letter-spacing: 0.544px;text-wrap: wrap;background-color: rgb(255, 255, 255);text-align: left;visibility: visible;line-height: 1.5em;margin-bottom: 16px;">近期,很多朋友在用Dify、Coze、元器等Workflow时能明确感受到:最先进的人工智能结果越来越多地通过具有多个组件的复合AI系统才能获得,而不仅仅是单一模型。但这些组件通常需要特定的输出格式才能被解析并发送到下一个组件或流程当中。ingFang SC", system-ui, -apple-system, BlinkMacSystemFont, "Helvetica Neue", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;letter-spacing: 0.544px;text-wrap: wrap;background-color: rgb(255, 255, 255);text-align: left;visibility: visible;line-height: 1.5em;margin-bottom: 16px;">然而,如何让这些模型能够可靠地生成结构化输出,如JSON格式的数据,一直是一个挑战。在这个关键时刻,由向量数据库巨头Weaviate团队主导的StructuredRAG研究应运而生,为我们揭示了Compound AI Systems(复合AI系统)的无限潜力,同时也为LLM在结构化输出方面的能力提供了前所未有的洞察。 ingFang SC", system-ui, -apple-system, BlinkMacSystemFont, "Helvetica Neue", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;letter-spacing: 0.544px;text-wrap: wrap;background-color: rgb(255, 255, 255);text-align: left;visibility: visible;line-height: 1.5em;margin-bottom: 16px;">在深入StructuredRAG之前,我们需要理解Compound AI Systems这一概念的重要性。Compound AI Systems,即复合AI系统,指的是由多个AI组件协同工作的复杂系统。这种系统不再依赖单一的大模型,而是将多个专门化的AI模型或工具组合起来,以完成更复杂、更精细的任务。
Weaviate作为领先的向量数据库提供商,深谙Compound
AI Systems的潜力。在这种系统中,向量数据库常常扮演着核心角色,为不同的AI组件提供高效的数据存储和检索服务。StructuredRAG的研究正是基于这样的背景,旨在解决Compound AI Systems中的一个关键挑战:如何确保LLM能够可靠地生成符合预定格式的结构化输出。本文将深入剖析这项开创性研究,探讨其对AI领域的深远影响,并审视其与DSPy等先进框架的内在联系。  ingFang SC", system-ui, -apple-system, BlinkMacSystemFont, "Helvetica Neue", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;letter-spacing: 0.544px;text-wrap: wrap;background-color: rgb(255, 255, 255);text-align: right;visibility: visible;line-height: 1.5em;margin-bottom: 16px;">图片由修猫创作ingFang SC", system-ui, -apple-system, BlinkMacSystemFont, "Helvetica Neue", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;letter-spacing: 0.544px;text-align: left;text-wrap: wrap;">为Compound AI Systems筑基 ingFang SC", system-ui, -apple-system, BlinkMacSystemFont, "Helvetica Neue", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;letter-spacing: 0.544px;text-wrap: wrap;background-color: rgb(255, 255, 255);text-align: left;visibility: visible;line-height: 1.5em;margin-bottom: 16px;">为什么结构化输出如此重要?
ingFang SC", system-ui, -apple-system, BlinkMacSystemFont, "Helvetica Neue", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;letter-spacing: 0.544px;text-wrap: wrap;background-color: rgb(255, 255, 255);text-align: left;visibility: visible;line-height: 1.5em;margin-bottom: 16px;">很多朋友在设计智能体时遇到过这样的问题,一个AI助手在回答问题时总是给出格式混乱的回复,不管再设计变量还是增添约束语句控制,似乎都不起什么作用。后续的处理将变得异常困难。因此,提高LLM生成结构化输出的能力,对于构建高效、可靠的AI系统至关重要。
ingFang SC", system-ui, -apple-system, BlinkMacSystemFont, "Helvetica Neue", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;letter-spacing: 0.544px;text-wrap: wrap;background-color: rgb(255, 255, 255);text-align: left;visibility: visible;line-height: 1.5em;margin-bottom: 16px;">StructuredRAG 是一种格式化大型语言模型( LLMs ) 响应的新方法,使其更加用户友好。StructuredRAG 框架不仅仅获取一大块文本,而是分层组织信息,标记不同类型的内容(如事实、观点或说明),并提供额外的元数据来帮助用户理解他们所看到的内容。
ingFang SC", system-ui, -apple-system, BlinkMacSystemFont, "Helvetica Neue", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;letter-spacing: 0.544px;text-wrap: wrap;background-color: rgb(255, 255, 255);text-align: left;visibility: visible;line-height: 1.5em;margin-bottom: 16px;">例如,而不是像这样的JSON 响应:{ "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提供的信息并与之交互。层次结构、类型注释和上下文元数据都有助于提高LLM输出的可用性和可解释性。
StructuredRAG基准测试包含六个精心设计的任务:

1. 输出单个字符串
2. 输出单个整数
3. 输出布尔值
4. 输出字符串列表
5. 输出复合对象(包含答案和置信度)
6. 输出复合对象列表
看到这里,你是不是 从疑问?(...)到→确定 !(...)你可以按照下面的例子写一个输出Example(就是你Fewshot中的): <output example> {
"answer":The National Gallery of Art,Washington D.C.,andthe Pinacoteca diBrera,Milan,Italy.",
"confidence":5
}
</output example>
这些任务看似简单,实则涵盖了Compound
AI Systems中常见的数据交换场景。例如,在一个多阶段的问答系统中,第一个组件可能需要输出一个查询列表(任务4),而第二个组件则需要生成带有置信度的答案(任务5)。这些任务涵盖了从简单到复杂的各种输出类型,为全面评估LLM的结构化输出能力提供了可能。 StructuredRAG 背后的核心思想是获取大型语言模型的非结构化文本输出,并将其转换为更有组织、带注释的JSON 格式。这是通过多步骤过程实现的:
分段:LLM的输出首先被分为更小的、语义上有意义的分段(例如,单独的事实、意见或说明)。
类型注释:每个片段都标有特定类型(例如地理、人口统计、地标)以指示其包含的信息的性质。
分层组织:片段被组织成分层结构,相关内容分组在一起并相应地嵌套。
上下文元数据:附加附加元数据以提供有关整个主题、来源或其他可以帮助用户解释信息的详细信息的相关上下文。
由此产生的StructuredRAG 格式旨在对最终用户更加直观和有用,使他们能够快速理解内容、识别不同类型的信息并更有效地导航响应。
研究者选择了两个代表性的模型进行测试:
1. Gemini 1.5 Pro:代表当前最先进的大规模语言模型
2. Llama 3 8B-instruct (4位量化版本):代表较小规模但经过指令微调的模型
同时,研究者还比较了两种不同的提示策略:
1. f-String提示:将任务特定变量嵌入到提示中 Task Instructions task_instructions} References references} Output the result asa JSONstringwiththe following format rseponse_format} IMPORTANT!!Do not start the JSONwith'json or end it with
2. Follow the Format (FF)提示:采用更严格的格式,先解释任务,然后给出响应格式,最后提供输入变量 Follow the task_instructions(Input Field)andgenerate the response(Output Field) according tothe output format given by response_format(Input Field).You will be given references from(Task-Specific Input Field) Follow the format.--- task_instructions Input Field) response_format Input Field) references Task-Specific Input Field) response Output Field)--- 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提示略胜一筹。
这些结果揭示了LLM在结构化输出方面的复杂性。即使是最先进的模型,在某些任务上也会出现显著失败。
成功与失败的原因
研究者发现,最常见的失败情况包括:
1. 模型回应任务确认而非执行任务
2. 添加额外的解释性文本
3. 类型错误(如将整数输出为字符串)
这些失败模式提示我们,即使是高度先进的LLM,在理解和严格执行结构化输出指令方面仍有改进空间。
OPRO:优化提示,突破极限
面对Llama 3
8B-instruct在某些任务上的低成功率,研究者尝试了OPRO(Optimizing
PROmpts)技术。这种方法通过迭代优化提示,显著提高了模型性能:
1. 将GenerateAnswersWithConfidences任务的成功率从25%提升到100%
2. 优化后的提示包含更详细的指导,如"仔细审查任务说明"和"确保纯粹且正确的JSON输出"
OPRO的成功表明,即使是相对较小的模型,通过精心设计的提示也能在复杂任务上取得出色表现。
关于OPRO,这篇文章建议你看一下:
谷歌DeepMind重磅:提示工程师必须掌握OPRO,用LLM就能自动优化Prompt|ICLR2024 虽然StructuredRAG研究并非直接基于DSPy,但两者在多个方面展现了令人耳目一新的共性:
1. 结构化输出的重要性:两者都强调了在复杂AI系统中处理结构化数据的关键作用 2. 提示策略:StructuredRAG的FF提示策略与DSPy的提示方法有异曲同工之妙
3. 优化技术:OPRO的成功与DSPy的提示优化功能形成了有趣的呼应
4. 评估方法:StructuredRAG的基准测试可以看作是对DSPy等框架的补充评估工具
这些共性不仅反映了当前AI研究在Compound AI Systems方向上的共同趋势,还为未来的协同研究指明了方向。请看以下DSPy代码: importdspy fromtyping importOptional, Any, Dict fromstructured_rag.dspy_signatures importGenerateResponse
classdspy_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)
defconfigure_llm(self, api_key: Optional[str] = None): ifself.model_provider == "ollama": llm = dspy.OllamaLocal(model=self.model_name, max_tokens=4000, timeout_s=480) elifself.model_provider == "google": llm = dspy.Google(model=self.model_name, api_key=api_key) else: raiseValueError(f"Unsupported model provider: {self.model_provider}")
print("Running LLM connection test (say hello)...") print(llm("say hello")) dspy.settings.configure(lm=llm)
defforward(self, test: str, question: str, context: Optional[str] = "")-> Any: references = {"context": context, "question": question} references = "".join(f"{k}: {v}"fork, v inreferences.items()) response = self.generate_response( task_instructions=self.test_params['task_instructions'], response_format=self.test_params['response_format'], references=references ).response
returnresponse
虽然论文中没有直接提到,但值得注意的是,DSPy的一些核心开发者(如Omar Khattab)也参与了类似领域的研究工作。这表明StructuredRAG和DSPy背后可能有共同的研究背景和思想源流。
虽然StructuredRAG论文并不直接讨论DSPy,但它们在研究目标、方法论和未来发展方向上有很多共通之处。StructuredRAG的研究结果可能会为DSPy的进一步发展和应用提供有价值的参考,同时DSPy的实践经验也可能反过来影响类似StructuredRAG这样的基准测试的设计和应用。这种相互影响反映了当前AI研究领域的密切联系和快速发展态势。 关于输出约束,您看以下几篇“惊雷”系列文章
一记惊雷:改一下Prompt的输出顺序,就能显著影响LLM的评估结果 又见惊雷,结构化Prompt格式小小变化竟能让LLM性能波动高达76%,ICLR2024 StructuredRAG的研究结果为Compound
AI Systems的开发者提供了多层次的指导:
1. 模型选择策略
- 根据任务复杂度和资源限制,在大型通用模型和小型专门模型间权衡
- 考虑在系统中混合使用不同规模的模型,以平衡性能和效率
2. 提示工程的艺术
- 为不同模型和任务定制提示策略
- 利用OPRO等技术动态优化提示,提升系统整体性能
3. 错误处理机制设计
- 基于研究揭示的常见失败模式,设计robust的错误检测和恢复策略
- 实现跨组件的错误传播控制,防止局部错误影响整体系统
4. 持续评估与优化
- 将StructuredRAG等基准测试纳入开发流程,定期评估系统性能
- 建立动态优化机制,根据实时性能数据调整系统配置
5. 接口设计与标准化
- 基于研究中的结构化输出任务,设计标准化的组件间通信接口
- 推动行业内的接口标准化,提高不同Compound AI Systems间的互操作性 6. 更多优化策略
研究者指出,还有多个潜在的优化方向值得探索:
1. 集成(Ensembling):利用LLM的随机性,为每个输入生成多个输出
2. 重试机制:对失败的输出应用"重试"提示
3. 思维链(Chain-of-Thought)提示:添加"理由"键来改善模型推理
4. 高级提示优化:探索如MIPRO等更复杂的优化技术
这些方向为进一步提高LLM的结构化输出能力提供了广阔空间。
StructuredRAG研究展示了Weaviate在尖端AI研究领域的实力,Weaviate也在从单纯的数据存储提供商,向Compound AI Systems的核心基础设施提供商转变。利用StructuredRAG的研究成果,不断优化您的提示策略和系统设计,相信您将能够创造出更加卓越的AI产品! |