Skip to main content
本例把 Embeddings、Rerank 与 Chat Completions 串成一个可运行的 Python 脚本。使用三条虚构图书馆资料演示,不需要向量数据库或新依赖。

数据如何流转

  1. 将问题和三段资料发给向量模型,按响应 index 恢复输入顺序。
  2. 归一化向量,按余弦相似度召回两段候选资料。
  3. 如果设置重排模型,将候选原文交给 /rerank。返回的 index 对应这次重排请求中的候选数组,不能用它直接索引原始知识库。
  4. 将候选 ID 和原文交给对话模型,只接受完整的 JSON 答案。
  5. 检查引用 ID 是否来自本次提供给模型的候选,再从应用持有的原文构造来源列表。
向量相似度与重排分数不是同一量纲,示例不会混合相加。检索与生成的概念可参考 OpenAI Retrieval 指南;本例自己管理文档与召回,不调用该指南的托管 Vector Stores API。

准备与运行

按 Python SDK安装依赖并设置 API_BASE_URL(包含 /v1)与 API_KEY。准备一个文本向量模型、一个支持 Chat Completions 和 system 消息的对话模型;重排模型可选。它们可以是不同的模型 ID,但均需在此部署可用。 保存下方代码为 rag.py。不启用重排时,显式清空 API_RERANK_MODEL,避免继承终端中的旧配置:
要启用重排,将 API_RERANK_MODEL 设为部署提供的重排模型 ID 后再次运行。开启时依次发送三个请求,否则发送两个;每次请求超时设为 60 秒,自动重试关闭,这不是整个流程的统一截止时间。示例每次都会重新编码资料,仅适合小规模演示。 向量模型需允许问题和文档使用同一种编码方式。若模型要求不同前缀或 query/document 任务类型,应先按照模型要求调整编码,不能直接混合输入。所有模型 ID 都是占位符,不能用对话模型代替向量或重排模型。

完整 Python 示例

输出与失败行为

成功输出一个 JSON 对象,answer 为回答,sources 包含经过校验的资料 ID 和原文。文本来自模型,具体措辞与排序不固定。示例没有启用 response_format,因此不要求渠道提供 JSON Schema 模式;普通文本生成仍可能产生非法 JSON,客户端会拒绝该结果,不能把提示词当作格式保证。需要模型端结构化约束时,先确认渠道能力,再参考结构化输出。 来源 ID 校验只能防止引用未提供的资料,不能证明答案被来源支持。提示词也不能彻底消除文档中的提示注入。将模型输出作为不可信文本处理,不直接执行;面向用户展示时按目标界面转义。使用独立评估检查事实支持、引用准确性和拒答率。

换成自己的知识库

  • 本例只包含公开的固定资料,不实现用户身份或权限系统。真实应用必须先在服务端筛选当前用户可访问的文档,再进行编码、召回、重排和生成,避免把无权访问的内容交给模型。
  • 文档离线分块并保存稳定的文档/分块 ID、来源、版本、向量模型和预处理方式;查询时只编码问题。使用兼容向量空间并重新评估更换模型后的检索质量。
  • 按目标模型的 token 限制控制问题、候选原文与输出预算。固定选两段只是演示策略,不保证任意文档都能放进上下文。
  • 用包含“有答案”“无答案”和冲突资料的评估集调整召回数量、阈值和重排策略。不要套用跨模型统一的相似度阈值,也不要把任意 top-k 结果视为充分证据。
  • 重排失败默认中止。若产品允许降级为仅向量召回,需要明确记录降级状态并单独评估质量;不要悄悄改变结果语义。
本地自动检查使用模拟 HTTP 服务验证请求顺序、模型选择、候选映射、失败短路与引用校验,不评估真实模型效果,也不验证向量数据库集成。排查接口错误见错误与重试。 Read in English