spRAG:适用于金融等密集非结构化文本的RAG框架
RAG(检索增强生成)模型在NLP和信息检索领域确实是个好东西,但一碰到复杂的PDF文档、密集的非结构化文本数据,问题就来了——传统方法常常力不从心。SuperpoweredAI开源的spRAG,正是冲着这个痛点来的。它专门处理金融报告、法律文件、学术论文这类“高密度”文本,在复杂查询上的表现相当亮眼。

spRAG关键技术架构
AutoContext:注入文档级上下文
传统RAG模型有个通病:只盯着零散的文本块,完全不管整篇文档在说什么。AutoContext技术就是来破这个局的。它的思路很直接——在把文本切块嵌入之前,先自动把文档级别的上下文信息“塞进”每个块里,让嵌入的表示更准确、更完整。
# auto_context.py
from sprag.llm import LLM
import tiktoken
# ... (PROMPT, TRUNCATION_MESSAGE 等常量定义)
def truncate_content(content: str, max_tokens: int):
# ... (使用 tiktoken 库进行文本截断)
def get_document_context(auto_context_model: LLM, text: str, document_title: str, auto_context_guidance: str = ""):
# ... (截断文本,构建 prompt,调用 LLM 生成文档摘要)
def get_chunk_header(file_name, document_context):
# ... (将文件名和文档摘要拼接成 chunk header)
代码里的get_document_context函数负责干活:用LLM模型和预设的提示模板,生成1-2句话的文档摘要,把主题和关键信息提炼出来。它还会根据内容长度做截断,确保塞进模板后调用LLM生成摘要。然后get_chunk_header把文件名和摘要拼成“块头”,加到每个文本块的开头。这样一来,每个块都知道自己来自哪份文档、整体在讲什么,嵌入质量自然就上去了。
这种做法的好处很明显:检索结果更准、更相关;下游任务(问答、摘要等)因为有了更完整的上下文,模型误解的概率也大大降低。
Relevant Segment Extraction (RSE):智能组合相关文本块
RSE是spRAG的另一个杀手锏。传统RAG固定块长,经常把相关的内容割裂开。RSE的思路是:先智能识别和组合相关文本块,给语言模型提供更丰富的上下文。
# rse.py
import numpy as np
# ... (convert_rank_to_value 函数定义)
def get_best_segments(all_relevance_values: list[list], document_splits: list[int], max_length: int, overall_max_length: int, minimum_value: float) -> list[tuple]:
# ... (利用优化算法寻找最佳文本段组合)
def get_meta_document(all_ranked_results: list[list], top_k_for_document_selection: int = 7):
# ... (获取所有相关文档的信息,包括文档分割点和每个文档在元文档中的起始位置)
def get_relevance_values(all_ranked_results: list[list], meta_document_length: int, document_start_points: dict[str, int], unique_document_ids: list[str], irrelevant_chunk_penalty: float, decay_rate: int = 20):
# ... (计算每个文本块的 relevance value)
工作原理分三步走:
- :把检索到的相关块按语义相似度归堆。
文本块聚类
- :根据需要挑选和组合这些块,形成信息连贯的文本段。
文本段构建
- :把这个段喂给语言模型,帮它更准确地理解查询意图。
上下文提供
RSE的优势在于灵活性和准确性——可以根据问题动态组合上下文,而不是死板地切块。核心函数里,convert_rank_to_value把排序结果转成相关度分数,get_best_segments用优化算法找最佳组合,get_meta_document和get_relevance_values负责计算和定位。
spRAG核心技术组件
spRAG的组件设计得很灵活,可以按需替换。
- :BasicVectorDB用来存嵌入向量和少量元数据,支持高效的相似度搜索。
VectorDB
- :BasicChunkDB以嵌套字典格式存文本块内容,供RSE检索和组合。
ChunkDB
- :可选OpenAI(如text-embedding-ada-002)、Cohere、Voyage AI的嵌入模型,把文本映射到向量空间。
Embedding
- :CohereReranker可以对检索结果做二次排序,进一步提升准确性。
Reranker
- :OpenAIChatAPI或AnthropicChatAPI用于生成文档摘要,提取关键信息。
LLM
spRAG应用场景
哪里需要处理密集文本,哪里就有它的用武之地:
- :分析财报、研报,提取关键数据辅助投资决策。
金融领域
- :检索法条、判例,支持律师工作。
法律领域
- :快速检索论文、研究报告,辅助科研。
学术领域
- :构建更精准、个性化的问答系统。
智能客服
- :全面提升搜索引擎的检索质量。
信息检索
spRAG性能及效果
在FinanceBench基准测试中,spRAG的准确率高达83%,远超传统RAG模型。这成绩背后,AutoContext和RSE功不可没,当然也离不开灵活的技术架构和可定制的组件。可以说,spRAG在处理各类非结构化文本数据时,确实能提供更准确、更全面的信息检索服务。
-
- 关于宇宙的好的网名有哪些
- 角色扮演 | 1
- 网名