一、面试题目
面试官:请设计实时数据型 RAG 架构 ,支持接入订单、商家、物流、天气、动态库存这类实时变化数据,对比传统静态 RAG,说明技术方案、更新机制、检索方式、落地难点与优化手段。
二、知识储备
1. 传统静态 RAG 痛点
传统 RAG 基于文档离线切块+向量化入库 ,适合知识库、规则、手册等长期不变数据 。
对实时高频变化数据(订单、库存、物流、天气)存在致命问题:
- 向量库更新慢,无法秒级同步
- 数据实时性差,回答容易过期、幻觉
- 频繁全量重建索引,成本高、延迟大
- 无法支持用户个人隐私数据(订单)权限隔离
2. 实时数据 RAG 整体架构
实时数据源 → 实时接入层 → 实时向量/结构化存储层 → 混合检索层 → 权限过滤 → LLM 生成
核心思路:结构化实时查询 + 轻量化向量检索 + 元数据强过滤 + 旁路缓存,不把实时数据全部灌入向量库。
3. 五大实时数据源接入方案
(1)订单数据(用户个人隐私)
- 特点:强权限隔离、个人专属、实时变化、不能全局检索
- 方案:不走全局向量库,直接结构化查询
用户提问 → 鉴权 → 调用订单接口查实时数据 → 直接喂给 LLM - 向量仅存:订单规则、售后政策,不存订单明细
(2)商家数据(营业状态、评分、活动)
- 特点:频繁更新(营业、爆单、打烊、优惠)
- 方案:
-
- 结构化库存最新状态
- 向量库存商家简介、品类、历史评价
- 检索时先查结构化实时状态,再匹配向量语义
(3)物流轨迹(骑手位置、实时进度)
- 特点:秒级变化、时序强、位置敏感
- 方案:纯结构化实时查询 ,不做向量化
Agent 直接调用物流 API 获取实时点位、预计送达时间
(4)天气数据(温度、降雨、预警)
- 特点:地域+时间实时更新
- 方案:定时同步 + 实时接口兜底
向量库存天气规则,实时接口查当日天气
(5)动态库存(外卖商品、酒店房间、机票)
- 特点:高频扣减、秒杀、实时售罄
- 方案:
-
- 库存明细结构化实时查询
- 向量库存商品介绍、规格、卖点
- 回答时实时拼接库存状态,避免幻觉
4. 实时 RAG 核心技术方案(面试必背)
1)分层检索:结构化优先,向量辅助
- 实时数据:直接查数据库/接口(MySQL、Redis、实时API)
- 静态知识:向量库检索(Milvus)
- LLM 合并两部分结果回答
2)增量向量更新,拒绝全量重建
- 实时变化字段:只更新对应向量分片
- 冷热分离:高频变动数据放 Redis,低频变动入向量库
- 流式写入、增量索引构建
3)强元数据过滤 + 权限隔离
每条向量绑定:user_id / shop_id / area / time
检索前先过滤:
- 订单:只能查自己的
- 库存:只能查当前城市/门店
- 天气:按用户位置过滤
4)旁路缓存,降低实时查询压力
- 热点商家、热门商品库存:Redis 缓存 30s--5min
- 非高频实时数据:准实时同步向量库
- 秒杀/突发场景:熔断保护,直接读缓存
5)混合检索(实时结构化 + 向量 + BM25)
- 语义意图用向量召回
- 实时事实用结构化接口兜底
- 关键词、编号、订单号用 BM25
6)幻觉严格治理
- 实时数据禁止模型编造,必须来自接口返回
- 输出前校验:库存、订单状态、物流时间必须与实时接口一致
5. 完整执行流程(以本地生活 Agent 举例)
用户提问:这家店还有可乐吗?我的外卖到哪了?
- 意图识别:库存查询 + 物流查询
- 实时结构化查询:
-
- 商品实时库存接口
- 骑手实时位置接口
- 向量 RAG:召回商品介绍、售后规则
- 合并实时数据 + 向量知识
- LLM 生成回答,禁止编造实时信息
6. 落地难点与解决方案
- 实时性不足、回答过时
→ 结构化接口直查,向量只存静态信息 - 频繁更新向量库压力大
→ 增量更新、Redis 缓存、冷热分离 - 用户订单隐私泄露
→ 强权限过滤,订单不入全局向量库 - 库存高频扣减导致幻觉
→ 实时接口兜底,禁止模型推断库存
三、破局之道(面试满分总结)
实时数据 RAG 不能照搬传统静态 RAG 全量向量化思路,核心是结构化实时查询为主、向量语义检索为辅 。
对订单、物流、库存、天气、商家这类高频变动数据,优先走接口/数据库直查 ;向量库只存规则、简介、静态知识;通过增量更新、元数据过滤、缓存兜底、权限隔离,实现"实时数据准、静态知识全、回答不幻觉",适配本地生活、电商、出行等强实时业务。
四、极简代码实现
Python
python
# 实时RAG:结构化优先 + 向量辅助
def realtime_rag(user_query, user_id, location):
# 1. 意图识别
intent = llm_intent(user_query)
real_data = {}
# 2. 实时结构化查询
if "订单" in intent:
real_data["order"] = api_query_order(user_id)
if "库存" in intent:
real_data["stock"] = api_query_stock(location)
if "物流" in intent:
real_data["logistics"] = api_query_logistics(user_id)
# 3. 静态知识向量检索
static_chunks = vector_search(user_query)
# 4. 合并实时+静态,禁止编造实时信息
prompt = f"""
实时数据:{real_data}
知识库:{static_chunks}
回答必须基于实时数据,禁止编造库存/订单/物流信息
问题:{user_query}
"""
return llm(prompt)
JavaScript
javascript
async function realtimeRag(userQuery, userId, location) {
const intent = await llmIntent(userQuery);
let realData = {};
if(intent.includes("订单")) realData.order = await apiQueryOrder(userId);
if(intent.includes("库存")) realData.stock = await apiQueryStock(location);
if(intent.includes("物流")) realData.logistics = await apiQueryLogistics(userId);
const staticChunks = await vectorSearch(userQuery);
const prompt = `
实时数据:${JSON.stringify(realData)}
知识库:${staticChunks}
回答必须基于实时数据,禁止编造库存/订单/物流信息
问题:${userQuery}
`;
return await llm(prompt);
}