大模型生成式搜索是怎么玩的?
用户用自然语言提问 → 系统先检索相关资料 → 再让大模型阅读这些资料并生成答案 → 给出带引用的、有结构的回答,而不是只给你一堆链接
一、什么是「大模型生成式搜索」?
一句话:
用户用自然语言提问 → 系统先检索相关资料 → 再让大模型阅读这些资料并生成答案 → 给出带引用的、有结构的回答,而不是只给你一堆链接。
和传统搜索对比:
- 传统搜索:
- 核心是“匹配关键词”
- 返回的是“文档/网页列表”
- 由用户自己点开、阅读、总结
- 生成式搜索:
- 核心是“理解语义 + 生成回答”
- 先找资料,再总结、归纳、对比
- 返回的是“直接可读的答案 + 引用来源”
核心关键:
不是大模型“凭空乱想”,而是大模型“在检索到的资料上做总结” → 这就是常说的 RAG:Retrieval-Augmented Generation(检索增强生成)。
二、整体流程:从提问到回答的完整链路
用一个简单的流程图来理解:
- 用户提问:
- “大模型生成式搜索是怎么实现的?”
- 系统理解问题 → 解析需求、抽取关键词、识别意图
- 去知识库/互联网里检索相关内容(文档、网页、API等)
- 选出最相关的一批内容(Top K)
- 把问题 + 资料喂给大模型,让它“读完再回答”
- 大模型生成结构化回答,并附上引用
- 返回给用户,界面可以支持追问、继续对话
用一句类比:
传统搜索像去图书馆找书;生成式搜索像请一个很懂行的图书管理员,帮你把书找好并读完,给你讲重点。
三、底层关键技术模块总览
大模型生成式搜索 = 多个模块协同工作:
- 前端交互层
- 聊天界面 / 搜索框 / API
- 业务编排 & Orchestration(流程编排)
- 决定什么时候检索、什么时候调用大模型、怎么组合结果
- 检索系统(搜索引擎部分)
- 索引构建(倒排索引 + 向量索引)
- 召回(BM25 / 向量检索 / 混合检索)
- 排序(Re-ranking)
- 向量数据库 / 语义索引
- 文本嵌入、向量存储、相似度搜索
- 大语言模型(LLM)
- GPT、LLaMA、Qwen 等
- 负责阅读、理解、总结、生成
- RAG 逻辑层(检索增强生成)
- Prompt 构造、上下文拼接、引用控制、反事实检测等
- 安全与质量控制
- 防幻觉、防隐私泄露、不当内容过滤
- 监控 & 反馈 & 优化
- 日志、用户反馈、在线学习
四、核心一:检索系统是“眼睛”,负责找到可靠资料
大模型再聪明,也得有“材料”可读。检索就像是它的“眼睛”。
4.1 索引是怎么建的?
通常有两类索引:
-
倒排索引(Inverted Index)——传统搜索的基石
- 把每个词出现在哪些文档里记下来
- 适合关键词匹配、布尔检索、BM25 等传统算法
- 优点:快、成熟、可解释
- 缺点:对语义理解有限,词不同就找不到(如“车”和“汽车”)
-
向量索引(Vector Index)——语义检索的基石
- 每段文本变成一个向量(Embedding),比如 768 维
- 一段话的向量接近,就认为语义相近
- 使用向量数据库(Faiss、Milvus、pgvector、qdrant 等)
- 优点:能理解语义相似,不怕词不完全一样
- 缺点:近似搜索,有误差;维护成本高
实践中:
大多用“混合检索”——倒排 + 向量,两者结果再融合。
4.2 文档预处理:切块、向量化
一个文档太长,大模型上下文放不下,因此一般要:
- 分段 / 切块(chunking)
- 按段落、按标题、按固定长度(比如 300~800 tokens)
- 可能还会做“滑动窗口”切块,避免切断上下文
- 对每个块做向量化(Embedding)
- 用专门的 embedding 模型(如 text-embedding-3-large 等)
- 存到向量数据库里,附带元数据(来源、时间、标签等)
- 在倒排索引里,也用段级粒度建立索引
- 可更精细地检索到“某一段”
这样,将来检索时,可以直接找到“最相关的几个段落”,而不是整篇长文。
4.3 查询时是怎么“找资料”的?
假设用户问题是:“详细介绍大模型生成式搜索实现原理和技术架构”。
通常流程:
-
Query 预处理
- 分词、去停用词、拼写纠错、同义词扩展
- 可能还用小模型先识别意图、领域
-
向量检索
- 用 embedding 模型把问题变成向量 q
- 在向量索引里找“最相似的 K 个文档块”
- 相似度可以是 cosine / dot-product 等
-
关键词检索(倒排)
- 用 BM25 等在常规搜索引擎(ElasticSearch、OpenSearch、Solr、自研)中检索
- 也得到一批候选文档块
-
结果融合
- 把向量检索结果 + 关键词检索结果融合
- 常见做法:
- 简单加权:score = a * semantic_score + b * keyword_score
- 学习排序:用训练好的模型决定最终排序
-
Re-ranking(重排序)
- 用更强一点的模型(如 cross-encoder、mini-LM)对候选文档与查询逐对计算“相关性”,重新排序
- 这样精度更高,只是稍慢,但只对 Top-N 做即可
最后得到:一批按相关性排序的“文档片段” + 元数据。
五、核心二:大模型是“大脑”,负责理解和生成答案
有了资料,还需要有人“看懂并讲出来”——大模型就是这个角色。
5.1 RAG(检索增强生成)的基本套路
典型的 Prompt 结构:
角色:
你是一个专业的 XXX 领域助手。背景资料(检索到的内容):
[文档1片段]
[文档2片段]
…用户问题:
[用户的原始问题]要求:
- 只基于上述资料回答
- 不要编造资料中没有的信息
- 用通俗语言解释,并给出关键要点
- 在回答中用【[1]】【[2]】标注引用来源
模型看到的是:一个“问题 + 多段相关资料 + 明确的指令”。
它的任务就是:在这些资料的范围内组织答案,而不是随意发挥。
5.2 上下文拼接与“引用长度”问题
LLM 有上下文长度限制(比如 8K、32K、128K tokens 等),所以:
- 检索到的文档块不能全塞,通常只放 Top-K(例如 5~20 段)
- 还要控制每段文本长度,做摘要或截断
- 有些系统会先对长文做“多级摘要”(分层 RAG):
- 先检索到几篇长文 → 对每篇做段内摘要 → 再把摘要给 LLM
当问题复杂、需要跨多个文档时,可能采用:
- 多轮 RAG:模型先分解子问题 → 每个子问题单独检索 → 最后汇总
- Graph RAG / 知识图谱结合:先从文档构建概念图,再沿图检索更精准的知识点
5.3 防“乱编”:约束大模型的几种手段
- Prompt 中明确写:只能依据给定资料,不要随意猜测
- 让模型对答案中每一段,尽量附加引用来源
- 没有来源的内容权重更低,甚至可以过滤
- 答案后处理:事实检查 / Consistency Check
- 如:用另一次检索校验核心事实
- 或用一个“评审模型”评估答案是否与资料一致
六、技术架构:从系统视角看整体设计
可以想象一个简化架构(逻辑层次):
6.1 在线服务主链路
- API 网关 / 前端
- 接收用户请求,做鉴权、限流
- 对话管理 / 请求编排层(Orchestrator)
- 判定请求类型:问答、聊天、代码解释、工具调用等
- 负责:
- 是否需要检索?
- 调哪个搜索引擎?
- 调哪个大模型?(大模型路由)
- 是否调用工具(计算器、数据库、业务系统)?
- 检索服务层
- Query 分析、召回、重排
- 访问:
- 文本库(文档、知识库)
- 向量数据库
- 网页抓取 / Web 搜索接口
- 上下文构建 & Prompt 工程层
- 把用户问题 + 检索结果 + 系统指令 拼好 Prompt
- 控制内容长度、格式、引用
- 大模型服务层(LLM Service)
- 本地部署 / 云端 API
- 有模型路由、负载均衡、多模型管理
- 结果后处理层
- 引用格式化、高亮、分段标题
- 敏感内容过滤(安全策略、合规)
- 返回前端
6.2 离线/批处理部分(支撑系统)
- 数据采集 & 清洗
- 爬虫、文档上传、业务数据同步
- 去重、去广告、去噪声
- 文档解析 & 切块
- PDF/Word/网页 → 结构化文本 → 按块切分
- 向量化 & 索引构建
- 调用 embedding 模型生成向量
- 写入向量数据库
- 建立倒排索引(ES 等)
- 质量评估 & 标注
- 人工/半自动标注问答对
- 评估检索质量、模型回答质量
- 模型训练 / 微调 / 对齐
- 针对领域数据做 SFT/LoRA
- 训练重排序模型、意图识别模型、安全过滤模型等
七、在真实系统中的一些关键“工程问题”
7.1 延迟与性能
- 检索 + 大模型生成,时间可能较长
- 常用优化:
- 检索和模型调用并行或流水线
- 缓存热点问题的答案
- 用小模型做预判,大模型做“高价值问题”
- 使用 streaming 流式输出,先让用户看到部分内容
7.2 成本控制
- LLM 接口价格高 → 尽量减少不必要调用:
- 问题很简单时直接检索 + 模板回答
- 使用小模型做简单问题
- 对重复问题使用缓存
7.3 安全与合规
- 敏感内容过滤:
- 在输入前做用户请求过滤(如禁止违法内容)
- 在输出后做内容审核过滤(暴力、色情、仇恨等)
- 隐私保护:
- 不将敏感用户数据用于模型训练
- 企业内网部署时,确保数据不外流
7.4 评估与迭代
- 评估指标:
- 检索质量:召回率、精确率、nDCG
- 回答质量:正确性、完整性、可读性、引用准确度
- 常用方法:
- 人工评测(专家打分)
- A/B 测试
- 结合用户行为(是否追问、是否点来源链接)
八、几种典型的应用场景架构差异
8.1 通用互联网搜索(如 Perplexity部分新版搜索引擎)
- 数据来源:全网网页 + 新闻 + wiki
- 强调实时性:
- 增量爬取、实时索引
- 更复杂的查询理解和多轮对话:
- 比如“帮我比较 iPhone 16 和 小米 15 的配置”
8.2 企业知识库搜索 / 内部问答
- 私有数据:内部文档、会议纪要、知识库、代码仓库
- 重点是:
- 权限控制(不同角色看到不同文档)
- 与业务系统集成(工单系统、CRM、ERP)
- 高准确率 + 审计可追踪
8.3 垂直领域搜索(法律、医疗、金融等)
- 数据更专业,容错率更低
- 通常会:
- 用领域大模型或微调模型
- 加强规则校验(如引用条款号、药品说明书等)
- 增加“不能回答”机制:不确定就拒答或提示风险
九、自己搭一个简化版生成式搜索,需要哪些步骤?
-
数据准备
- 收集若干 PDF/Markdown/网页
- 提取文字,并按段落/标题切块
-
向量和索引
- 选一个向量数据库(如 qdrant / Milvus / pgvector)
- 用 OpenAI embedding 或其他 embedding 模型将块向量化
- 建立普通全文索引(如 ES / OpenSearch)可选
-
简单检索服务
- 写一个后端服务(Python/FastAPI 或 Node 等)
- 输入:问题
- 输出:Top-K 文本块 + 相关性得分
-
RAG 聚合层
- 在后端拼装 Prompt:
- 系统指令 + Top-K 文本 + 用户问题
- 调用大语言模型 API(如 GPT-4.1)
- 返回模型回答
- 在后端拼装 Prompt:
-
前端界面
- 简单的聊天框
- 下方列出引用的文档段落和原始链接
-
迭代优化
- 调整 chunk 大小、Top-K 数量
- 增加 Re-ranking
- 调 Prompt 让引用更准确
十、倒排索引和向量索引详细介绍
可以把“搜索”想象成在一个巨大的图书馆里找书:
-
倒排索引:
像一本“关键词 → 书和页码”的字典。
你查“生成式搜索”,它告诉你:哪几本书、哪几页出现过这个词。 -
向量索引:
把每一段文字变成一个“语义坐标点”,放在一个看不见的空间里。
你问一个问题,它也变成一个点,然后系统在这个空间里找离它最近的点——这些点对应的段落,就是“语义上最相似的内容”。
一句话概括:
- 倒排索引:“哪个词在哪儿出现过” → 更偏“字面匹配”
- 向量索引:“哪段话跟这句话说的是类似的意思” → 更偏“语义匹配”
10.1 倒排索引:传统搜索引擎的“关键词目录”
倒排索引的核心思想
倒排索引(Inverted Index)这个名字容易劝退,其实非常简单:
- 正排:文档 → 里面有哪些词
- 倒排:词 → 出现在了哪些文档里
为什么叫“倒排”?
因为它把“文档里有啥词”这个关系倒过来,按“词”来作为查找入口。
类比:
- 正常记笔记:
「第1篇文章:有‘大模型’、‘搜索’、‘RAG’」
「第2篇文章:有‘搜索’、‘PageRank’」 - 倒排笔记:
「大模型:出现在 文档1」
「搜索:出现在 文档1、文档2」
「RAG:出现在 文档1」
「PageRank:出现在 文档2」
当你搜索“搜索 RAG”时,只要看:
- “搜索” → 文档1、2
- “RAG” → 文档1
- 两者交集 → 文档1
就知道文档1最相关。
倒排索引是怎么构建的?
简单版流程:
-
文本预处理
- 分词:把“我喜欢生成式搜索”变成 [我, 喜欢, 生成式, 搜索]
- 小写化、去标点、去停用词(的、了、和……)
-
为每篇文档分配一个文档 ID(docID)
例如:doc1, doc2, doc3… -
扫每篇文档,记录每个词出现在哪些文档里
形成这样的结构:“生成式” → [doc1, doc5, doc20] “搜索” → [doc1, doc2, doc8, doc20] “大模型” → [doc1, doc3] -
可以进一步记录:
- 出现次数(Term Frequency)
- 出现位置(哪个字段、哪一行)
方便后续做排序和高亮。
这个“词 → 文档列表”的结构,就是典型的倒排索引。
查询时倒排索引怎么用?
例子:用户搜索 “大模型 搜索 原理”。
- 同样先做分词、清洗 → [大模型, 搜索, 原理]
- 从倒排索引查:
- “大模型” → [doc1, doc3, doc7]
- “搜索” → [doc1, doc2, doc7, doc9]
- “原理” → [doc1, doc5, doc7]
- 做集合运算:
- 交集(AND):三个词都出现 → [doc1, doc7]
- 并集(OR):至少一个词出现 → [doc1, doc2, doc3, doc5, doc7, doc9]
- 对候选文档打分排序:
- 词出现得越多、越重要的位置(标题、开头) → 得分越高
- 使用典型公式:TF-IDF、BM25 等
最终按得分排序,把最相关的文档列表返回给用户。
倒排索引的优点与局限
优点:
-
高效成熟:
- 对大规模数据(几十亿条文档)依然能快速搜索
- 所有传统搜索引擎(Google、ES、Solr)都以此为核心
-
可解释性强:
- 你能说清楚某个结果为什么匹配(包含哪些词)
-
支持复杂检索逻辑:
- “必须包含 A,不包含 B,时间在某段区间,作者是某人”等
局限:
-
只懂词面,不懂语义
- 问 “汽车保养” 时,可能漏掉只写“车辆维护”的文档
- 同义词、近义词、多语言问题都很麻烦,需要额外的同义词词典、规则等
-
对自然语言问题不友好
- 如 “为什么我家猫不吃东西” 这样的问句,倒排只能拆成若干关键词来匹配,很难理解“真正意图”
-
无法自然处理“相似意思但用词不同”的情况
- 用户说“模型是怎么记住知识的?”
- 文档里写“参数中编码了统计规律”
- 字面差异很大,但语义其实相关,倒排难以捕捉。
10.2 向量索引:让机器“按意思”来找东西
倒排索引按“词”来找,向量索引按“意义”来找。
什么是“向量表示”?
在向量索引中,每一段文本不会只被当成“字串”,而是被转成一个高维向量。
可以理解为:
- Embedding 模型给每段文本一个“语义坐标”
- 维度可以是 256、768、1024……(取决于模型)
- 相似的意思,其向量就“靠得近”
类比:
- 把电影按“风格维度”来表示,比如:
- 喜剧程度、动作程度、爱情程度、科幻程度、年代感……
- 一部电影就变成一个点
- 喜欢《星际穿越》的用户,再找“相似电影”,就是找在这个空间里离它近的点。
文本向量是类似的,只不过维度多得多,而且是模型自动学习的。
向量索引是怎么构建的?
构建向量索引的基本步骤:
-
文本预处理和切块
- 和前面 RAG 一样:把文档切成合适长度的块(段落/小节)
-
使用 Embedding 模型将每个块转成向量
- 比如某模型输出 768 维向量
- 得到一个形如
[0.13, -0.27, 0.05, …]的浮点数组
-
把这些向量和原始文本一起存入向量数据库
- 常见选型:Faiss、Milvus、qdrant、pgvector 等
- 向量库会建立“近似最近邻索引”(ANN Index),比如 HNSW、IVF 等,用于快速找到相似向量
结果就是:
“向量空间里的一个点” ↔ “某段具体文本” 的一一对应表。
查询时向量索引怎么工作?
假设你问:“如何实现大模型生成式搜索?”
-
把这个问题用同一个 Embedding 模型转成一个向量
q -
在向量数据库里执行“相似搜索”:
- 找所有向量中,和
q距离最近的 K 个 - 距离度量常用:
- 余弦相似度(cosine)
- 内积(dot product)
- 欧氏距离(L2)等
- 找所有向量中,和
-
找到最相近的若干文本块,并返回这些块作为“检索结果”
这些结果不一定包含你的问题里的关键词,但“说的是同一回事”。
比如:
- 问:“大模型怎么和搜索引擎结合?”
- 文档里写的是:“RAG(检索增强生成)将LLM与信息检索系统集成……”
- 关键词不同,但语义接近 → 向量搜索就能找到。
向量索引的优点与局限
优点:
-
语义级匹配
- 不需要关键词完全一致,也能找出相同意思的内容
- 对同义词、近义表达、不同语言(跨语言 embedding)有天然优势
-
对自然语言查询更友好
- 用户可以随便用口语提问
- 系统根据语义理解,找到对应知识点
-
可以统一表示多种模态
- 文本、图片、音频都可以转成向量
- 从文本找图片(“猫在沙发上睡觉”→ 找对应图片)
局限:
-
计算和存储成本较高
- 每个文本块要存一个高维向量
- 相似搜索需要专门的索引结构和算法
-
精准控制能力弱
- 很难做到“必须包含某个具体词”“排除某个词”这种严格过滤
- 很难做复杂的布尔逻辑条件
-
可解释性差
- 很难给用户解释“为什么这段结果被认为相似”
- 向量空间本身对人类不可见
-
质量高度依赖 embedding 模型
- 模型好 → 向量表示语义清晰 → 检索准确
- 模型差 → 检索结果会“语义跑偏”
10.3 现实系统中常用的“混合检索”
在实际的大模型生成式搜索系统里,往往不是二选一,而是两者结合:
- 用户提问 Q(自然语言)
- 向量召回:
- 用 embedding 模型把 Q 变成向量 q
- 在向量索引里找出语义上最相近的 Top N 个文档块(粗筛)
- 倒排 + Re-ranking 精排:
- 用倒排索引找“包含关键字”的相关文档块
- 合并召回结果 → 得到候选集
- 用重排模型(re-ranker)对 [Q, 文档块] 一对一打分,重新排序
- 再筛出 Top K 个“最靠谱、最匹配”的文档块
- 丢给大模型生成答案:
- 把 Q + Top K 文档块 + 指令 组成一个 Prompt
- 让大模型在这些资料基础上生成结构化回答,并尽量引用来源。
用向量索引做“召回”:先大致找对方向
为什么第一步要用“向量召回”?
因为用户的问题常常是自然语言 + 口语 + 模糊意图,例如:
“怎么用大模型+搜索给用户更直接的答案?”
你的文档里可能是这样写的:
“本文介绍的是 RAG(检索增强生成)系统架构,将 LLM 与检索引擎结合……”
关键词很难完全对上(“大模型+搜索” vs “RAG + LLM + 检索引擎”),
但语义其实非常接近。传统倒排基于关键词,容易漏掉这些“错位但同义”的内容。
向量召回的目标:
只要意思接近,就能先拉进候选集里。
这一阶段不要求“特别精准”,只要把大方向对的都找上来。
向量召回的原理:
-
训练好(或使用现成的)Embedding 模型
- 输入一句话(文本块),输出一个固定长度的向量,例如 768 维
- 这个向量可以理解为这句话的“语义坐标”
-
构建向量索引
- 对每个文档块都做一次 embedding → 得到向量 v_i
- 把 {向量 v_i, 文本内容, 文档ID, 其他元数据} 存入向量数据库
- 向量数据库内部建“近似最近邻索引”(ANN),用图结构 / 聚类等方法加速“找最近的向量”
-
查询时
- 把用户问题 Q 用同一个 embedding 模型变成向量 q
- 在向量库中寻找与 q 距离最近的 N 个向量 v_i
- 获取对应的 N 个文档块(记为候选集合 C_vector)
距离怎么测?常见有:
- 余弦相似度(cosine similarity)
- 点积(dot product)
- 欧式距离(L2 distance)
向量越近 → 语义越相似。
用倒排 + Re-ranking 提升精度:从“大致相关”到“真正相关”
有了向量召回的候选集合C_vector, 接下来会遇到两个问题:
-
向量召回有“噪声”:
- 有些文档在语义空间里看起来接近,但其实与你的问题不那么匹配
- 例如问“搜索系统中的 RAG 架构”,可能召回“推荐系统中的召回策略”——听起来都有“召回”,但语境不同
-
还需要结合“关键词”和其他约束:
- 必须包含某些关键词
- 某些时间范围 / 作者 / 业务系统等过滤条件
- 这类结构化过滤,倒排系统更擅长。
所以我们引入:倒排检索 + Re-ranking。
倒排检索:补充另一批候选 & 支持过滤
倒排检索会做几件事:
- 对同一个问题 Q 按关键词拆解,执行 BM25 等搜索
- 得到另一个候选集合 C_bm25(关键词匹配较好的文档块)
- 支持各种过滤条件(比如只看某产品线、某时间之后的文档、只看你有权限的文档)
然后:
- C_all = C_vector ∪ C_bm25
- 再根据一些逻辑做去重(同一文档块不要重复)
为什么要两套召回?
- C_vector:保证语义召回(即使关键词不完全一致)
- C_bm25:保证关键词控制 & 精准匹配(重要专有名词、ID、代码等不漏)
Re-ranking(重排序):用小模型精细打分
你现在有了一批候选文档块 C_all,但它们的排序:
- 一部分是按向量相似度排的
- 一部分是按 BM25 等关键词相关度排的
这两套打分的指标和尺度不同,不太好直接比较,因此需要一个统一的“裁判”:重排序模型。
原理上是这样:
- 重排模型一般是个小一点的 Transformer(比如 mini-LM、cross-encoder)
- 输入:
- Query(用户问题 Q)
- Candidate(某个文档块 D)
组成一个输入:[Q] [SEP] [D]
- 输出:
- 一个相关度分数(0~1 或者任意实数范围)
- 表示“这段文本 D 和问题 Q 的匹配程度”
工作流程:
- 对 C_all 中每个候选文档块 D_i,都计算一次 score_i = f(Q, D_i)
- 根据 score_i 降序排序
- 选前 K 个作为最终要喂给大模型的“精选五段”
这样做的好处:
- 向量召回只做“粗筛”,速度快、范围广
- 重排模型逐个精细“理解”Q 和 D_i 的关系,准确率更高
- K 可以比较小(例如 5~20),对大模型也更友好(上下文有限)
实现步骤
离线阶段:
- 训练或选用一个现成的 Re-ranking 模型
- 例如开源的句子对相关性模型(MS MARCO 等数据训练的)
- 或者自己用业务内的问答点击数据微调一个
在线阶段:
-
得到 C_vector(向量召回 Top N)
-
得到 C_bm25(倒排召回 Top M)
-
合并去重得到 C_all(如 200 条以内)
-
对 C_all 中每条候选 D_i:
- 构造输入:
[CLS] Q [SEP] D_i [SEP] - 喂给重排序模型
- 得到 score_i
- 构造输入:
-
按 score_i 排序,选前 K 条 → C_final(比如 K=8)
之后,C_final 里的每个元素都带:
- content:具体文本(段落)
- score:最终相关度分数
- source:来源文档信息(标题、URL、时间等)
更多推荐



所有评论(0)