
来自学员的企业级实战项目分享:全球国家零售知识RAG⽅案

目标是确保切块(Chunk)既包含足够信息,又具有明确的粒度和主题焦点,以利于后续的元数据标注和检索。
策略名称 | 适用数据类型 | 切分方法 |
|---|---|---|
A. 结构化切分(Table/List Chunking) | 财报、市场份额表格、关键指标列表 | 1. 标题保留:将表格或列表的标题作为切块的一部分。 2. 行/列切块:将整个表格转化为结构化格式,每行(一个实体的数据)作为独立的切块。 |
B. 层次化切分(Hierarchical Chunking) | 行业报告、深度分析文档 | 1. 大-中-小切块:基于文档结构(章节、段落)切分。- 大块(Macro):章节或小节,用于整体主题匹配。- 中块(Meso):1个相关段落,用于信息丰富度匹配。- 小块(Micro):2-3个句子,用于精准语义匹配。2. 滑动窗口:使用N句的滑动窗口切分,相邻切块之间有1句或2句的重叠(Overlap),以保留段落连贯性,如果一个窗口的内容少于500字符,就往前扩展最多200字符。 |
C. 摘要切分(Summary Chunking) | 所有切块(作为查询时的替代) | 对每一个中块或大块生成一个简洁摘要(Summary)。 |
元数据是 RAG 成功的关键,它使我们能够进行混合检索(关键词过滤 + 向量相似度)。
对于零售知识,元数据应覆盖零售的 5W1H。
元数据字段(Key) | 数据类型 | 作用与设计考量 |
|---|---|---|
country_code | String | 国家/地区:必须字段,便于地理维度过滤。 |
business_domain | string | 业务领域:明确区分"零售经济""宏观经济""供应链管理"等领域 |
entity_name | String | 实体名称:组织、机构或重要人物名称。 |
data_type | String | 信息类型/来源:用于评估信息的权威性。 |
fiscal_period | Date | 时间维度/财报周期:用于查询特定时间段的数据。 |
metric_tags | List | 关键指标标签:尤其用于标注表格和结构化数据。 |
chunk_level | String | 切块粒度:记录切块大小,用于重排和上下文填充。 |
language | string | 自然语言:便于按语言进行内容隔离或定向服务 |
retrieval_priority | String | 召回优先级:防止低价值内容挤占高价值结果 |
custom_metadata | object(键值对,灵活扩展) | 容器字段:应对复杂业务场景的动态需求,避免频繁修改主scheme |
MinerU(全称:MinerU Document Intelligence)是阿里巴巴达摩院推出的文档智能解析与信息抽取平台,主要用于从 PDF、Word、PPT、图片等复杂文档中:
能力点 | MinerU是否支持 | 说明 |
|---|---|---|
文档结构识别 | 支持 | MinerU能识别标题层级,通过版面分析判断文档结构 |
段落切分 | 支持 | 可按自然段落进行切分 |
大-中-小三级切块 | 不直接内置,但可实现 | MinerU输出段落级切块后,通过自定义层级处理实现 |
滑动窗口+Overlap | 不直接支持 | MinerU本身不提供滑动窗口功能,需切分后用代码实现N句滑动窗口逻辑 |
保留上下文连贯性 | 可间接实现 | 通过控制切块边界(如避免跨主题切割)间接实现 |

{
"chunk_id": "chunk_003",
"chunk_type": "table",
"text": "[{\"年份\":\"2023\",\"总额(万亿元)\": \"47.1\", \"增速(%)\": \"7.2\"}]",
"page_number": 1,
"title": "表1-1:2019–2023年社会消费品零售总额及增速",
"bbox": [72, 130, 550, 170],
"source_document": "2023年中国消费品零售市场发展报告.pdf",
"metadata": {
"country_code": "CN",
"business_domain": "零售经济",
"entity_name": "国家统计局",
"data_type": "行业报告",
"fiscal_period": {
"start_date": "2019-01-01",
"end_date": "2023-12-31",
"period_type": "年度"
},
"metric_tags": ["社会消费品零售总额", "同比增长率"],
"chunk_level": "meso",
"language": "zh",
"retrieval_priority": "high",
"custom_metadata": {
"region_detail": "全国",
"policy_type": "经济刺激"
}
}
},
{
"chunk_id": "chunk_015",
"chunk_type": "paragraph",
"text": "从城乡分布来看,2023年我国城镇消费品零售额达39.8万亿元,占全国总额的84.5%;乡村消费品零售额为7.3万亿元,占比15.5%。尽管乡村消费增速(8.5%)高于城镇(6.9%),但由于基数较低,绝对规模仍存在显著差距。这一结构性差异反映出我国城镇化进程中居民消费能力的梯度分布特征。",
"page_number": 2,
"bbox": [72, 130, 550, 170],
"font_size": 12,
"is_bold": false,
"line_spacing": 1.5,
"parent_heading_id": "chunk_004",
"source_document": "2023年中国消费品零售市场发展报告.pdf",
"metadata": {
"country_code": "CN",
"business_domain": "零售经济",
"entity_name": "国家统计局",
"data_type": "行业报告",
"fiscal_period": {
"start_date": "2023-01-01",
"end_date": "2023-12-31",
"period_type": "年度"
},
"metric_tags": ["城镇消费", "乡村消费", "消费占比"],
"chunk_level": "meso",
"language": "zh",
"retrieval_priority": "high",
"custom_metadata": {
"region_detail": "全国",
"policy_type": "城乡协调发展",
"consumer_segment": ["城镇居民", "农村居民"]
}
}
}
此阶段目标是理解用户查询的真实意图、完整上下文和依赖信息,并将用户输入的自然语言转化为精确的检索查询和提取元数据过滤条件。
预处理模块 | 作用机制 | 核心输出 |
|---|---|---|
意图识别 | 使用分类模型(或LLM)识别用户查询的类别。例如:财务指标查询、市场趋势对比、供应链分析。 | 意图标签:指导后续检索策略和LLM提示词。 |
元数据提取 | 从用户query中提取出精确的过滤条件,如国家代码(US)、时间范围(2024-Q1)。 | 元数据过滤条件:作为粗排阶段的路由优化输入。 |
用户query改写 | 将用户原始的、可能带有歧义、省略或上下文依赖的自然语言Query,转化为一条标准且无歧义的可供查询的语句 | 标准query:提高后续检索的准确性和召回的精准度 |
此阶段目标是高效且最大化覆盖率地从海量文档中召回大量潜在相关的文档切块,以供后续阶段筛选。
模型选择:BAAI/Embeding-BGE-M3
三路混合检索:
召回方式(Road) | 模型/算法 | 作用机制 |
|---|---|---|
路1:元数据过滤 | 向量数据库过滤器 | 基于元数据(如country_code, fiscal_period)进行预过滤。 |
路2:关键词匹配 | BM25 | 关键词匹配,捕捉精确的专有名词 |
路3:稀疏检索 | BGE-M3稀疏向量 | 关键词匹配,融合了语义能力 |
路4:稠密检索 | BGE-M3稠密向量 | 语义匹配,捕捉概念和意图相似性。 |
结果融合:
使用RRF算法对元数据过滤之后,BM25和Embeding-BGE-M3召回的结果进行融合。
RRF结合了不同召回方法的排名优势,生成一个统一的粗排列表。
此阶段目标是提高精度,利用更复杂的模型评估查询与粗排集中每个切块的真实相关性,并精简最终上下文。
模型选择:
BAAI/bge-reranker-base 或 cross-encoder/mmarco-mMiniLMv2-L12-H384-v1
步骤: Rerank模型将用户查询和每个切块配对输入,联合计算一个精细的相关性得分。从粗排的chunk块中选取最终重排后达到rerank模型阈值score的chunk块作为最终的上下文传递给LLM。
此阶段目标是利用高质量的召回上下文和强大的 LLM,生成准确、连贯且基于事实的答案。
上下文准备:
如果召回的chunk块中包含非常短的切块(例如单个句子),可以利用元数据中的父文档/大块 ID,在不超过 LLM 上下文窗口的限制下,适当地回溯填充部分相邻的上下文,确保 LLM 对事实的背景有完整理解。
LLM 生成:
提示工程 (Prompt Engineering):构建详细的提示词,明确要求 LLM:

1. 构建第一层热点问题集检索:聚焦高频零售趋势、中美等关键市场财报数据及FAQ,采用Elasticsearch(兼具优秀关键词与向量检索能力、查询快),保障热门查询极低时延响应;零售分析师或业务人员查询时,系统优先快速检索此热点库。
2. 设置第二层冷数据/全量知识库兜底:若热点库未命中或召回结果相关性低于预设阈值,自动切换至此层;该库含全球详细行业报告、历史市场数据、深度消费者分析及完整供应链信息等低频但全面数据,采用Milvus等专业向量数据库管理大规模向量数据,确保细致、跨国界复杂零售查询获准确完整召回。
3. 两级检索机制优势:既显著提升核心热门零售问题响应速度与分析效率,又保证必要时可全面覆盖检索全球零售知识。
动态优化的精髓在于使用系统运行过程中产生的实际数据来校准元数据。
元数据 | 核心痛点 | 动态优化信号 |
|---|---|---|
metric_tags | 标签过于宽泛或不够精确。 | 用户查询/点击日志:用户查询的关键词与metric_tags的匹配度。如果用户频繁查询"利润",但系统生成的标签只有"收入",说明标签不精确。 |
retrieval_priority | 优先级主观性强,导致低价值内容被高估。 | 用户交互信号:用户在文档中停留的时间、高亮次数、或文档被采纳为最终答案的频率。 |
元数据的动态优化通常采用异步、批量、定期的策略,以确保系统的稳定性和效率。
策略名称 | 频率/时间点 | 优化目标 | 核心逻辑 |
|---|---|---|---|
实时信号采集 | 每次用户查询/交互时 | 收集原始数据 | 系统记录用户查询、点击、停留时间等信息存入数仓。(只记录,不更新) |
日/周批量更新 | 每日凌晨(低峰期)或每周一次 | 核心元数据的校准与稳定 | 这是元数据优化的主要执行时间。系统汇总当日/当周的所有用户行为数据,计算出更稳定的metric_tags匹配度和retrieval_priority量化指标,更新至索引中。 |
触发式更新 | 当文档内容发生重大变化时 | 确保元数据与内容一致 | 例如,当一个文档被编辑或版本更新时,触发元数据重新计算和更新。 |
知识图谱侧重于丰富从向量数据库中检索到的文本片段。
1. 初始检索:RAG 系统首先通过向量搜索找到K个最相似的文本片段(例如:一篇关于中国零售业的报告片段)。
2. 实体提取:使用命名实体识别(NER)技术从这K个片段中提取关键实体(例如:中国、电商、关税政策)。
3. 图谱遍历:使用这些提取的实体作为起始点,在 KG 中进行一次或两次的邻居节点遍历,提取与这些实体相关的三元组事实。
4. 上下文增强:将这些提取出的结构化事实附加到原始文本片段中,形成一个增强的上下文包,输入给 LLM。
示例:文本片段只提到"关税提高"。KG 召回事实:关税政策调整时间、涉及商品品类、对供应链成本的影响。LLM 收到更完整的上下文,回答更准确。
将复杂问题拆解为多个子查询,分别召回后合并
改写为子任务:
1. 东南亚包括哪些国家?(获取国家列表)
2. 每个国家的零售业增速是多少?(按年/最新数据)
3. 按增速从高到低排序,取前5名。
改写为子任务:
1. 泰国和印尼的零售业增速分别是多少?
2. 对获取到的数据进行一个对比分析
如果涉及到全球或区域维度的问题,一般只会关注对应国家相关零售指标的对比分析,这时也可以将结构化数据存入数仓中,通过写sql的方式获取对应数据,交给LLM做分析。