
现代 RAG 机器人的工作方式
良好的 RAG 流水线不仅仅是”把文档放进向量数据库”。基本流程如下:
重排序步骤是使这比基本 RAG 演示更有用的升级。向量搜索快速且擅长查找语义相似的 chunk,但它仍可能返回与主题相邻而非直接有用的段落。Cross-encoder 一起读取问题和每个候选 chunk,然后评分该 chunk 实际回答问题的程度。
安装依赖项
我们将使用 OpenAI Python SDK,因为 Venice 暴露了 OpenAI 兼容的 API。我们还将使用支持 FastEmbed 的 Qdrant Python 客户端:requirements.txt:
选择模型
创建一个名为rag_bot.py 的文件,然后从添加导入、数据结构、API URL 和模型名称开始:
base_url 和 API 密钥来迁移。
您可以使用以下命令列出可用的 Venice 模型:
创建 Venice 和 Qdrant 客户端
为嵌入和聊天补全创建一个 OpenAI 兼容的 Venice 客户端:
对于私有本地机器人,从磁盘上的本地 Qdrant 路径开始:
加载和分块文档
在本教程中,我们将让机器人摄取本地文件或文件夹。从.md、.rst 和 .txt 文件开始:
1000 字符的起始 chunk 大小加 150 字符的重叠对于混合 Markdown 和文本文档是一个良好的默认值。较小的 chunk 可以提高精度。较大的 chunk 可以保留更多上下文。正确的设置通常取决于您存储的文档类型。
使用 Venice 嵌入文档
有了 chunk 后,我们批量嵌入它们:在 Qdrant 中存储向量
在插入点之前,使用正确的向量大小创建 Qdrant 集合。知道向量大小最简单的方法是嵌入第一批,然后使用len(embeddings[0])。
source、chunk_index 和内容派生的确定性 UUID。这使得对未更改 chunk 的重复摄取具有幂等性。
检索候选 chunk
在问题时间,机器人嵌入用户的问题并向 Qdrant 请求顶级向量匹配:limit 是候选数量。它通常应该高于您计划发送给模型的 chunk 数量,因为下一步将对它们进行重新排序。一个良好的默认值是检索 8 个候选并将最佳 4 个发送到聊天模型。
使用 FastEmbed 重新排序
现在我们添加使检索感觉更智能的部分。- 用向量搜索检索更大的候选集。
- 在本地仅重新排序这些候选。
- 将顶部几个 chunk 发送到语言模型。
candidate_k=8 和 top_k=4。如果正确的来源经常在附近但未进入最终上下文,则增加 candidate_k。
使用 Venice 聊天补全回答
选择上下文后,用源编号格式化它:运行机器人
将各部分组装成脚本后,将其保存为rag_bot.py。简单的首次运行可以使用一些内置示例文档,以便您在摄取自己的文件之前验证流水线:
有用的 CLI 选项
将主要的检索旋钮作为 CLI 选项暴露,以便您可以在不编辑代码的情况下调整机器人:
对于重复的本地开发,常见流程是:
隐私注意事项
对于私有 RAG 设置,请单独考虑每一层:
本教程最私密的默认值是使用 Venice 进行推理、磁盘上的本地 Qdrant 和本地 FastEmbed 重新排序。这为您提供了一个实用的 RAG 机器人,而无需将您的向量数据库 payload 发送到第三方向量存储。
需要预先处理的常见错误
如果您更改嵌入模型,请重建 Qdrant 集合。不同的嵌入模型可能产生不同维度的向量,而 Qdrant 集合期望固定的向量大小。
接下来去哪里
一旦您让基线运行起来,最高影响的改进通常是:- 添加针对 PDF、HTML、工单或内部 wiki 页面的文档特定加载器。
- 存储更丰富的元数据,如标题、标头、日期、所有者和 URL。
- 在实际问题上调整
candidate_k、top_k、chunk 大小和重叠。 - 添加评估问题,以便您可以衡量更改前后的检索质量。
- 流式传输最终的 Venice 聊天补全以获得更好的交互式聊天体验。