实用笔记:RAG领域的向量数据库内部机制:从分块存储到HNSW及
《实用笔记:RAG领域的向量数据库详解——从分块存储到HNSW》的操作指南:为采用该架构的团队提供的契约、校验规则以及可直接插入的代码片段。
可将此文档视为《深入理解 RAG 领域的向量数据库:从分块存储到 HNSW 与 IVF 搜索》中内容的操作员版重构版本:它明确了各个阶段、有序的代码模块,以及便于交接时参考的恢复说明。 在“概览”阶段,若将其视为可度量的基准面使用效果最佳。在扩大范围之前,先记录一份理想的操作流程、一个故障案例以及对应的回滚说明。 在功能结果旁还需记录执行时间以及令牌或查询成本。提前了解成本情况,可避免在从演示环境过渡到共享环境时出现意外费用。
标准方法(大多数系统所采用)
在“采用标准方法”阶段,应在修改代码之前明确输入参数、该步骤的负责人以及结束标准。操作人员应能够从已知的检查点重新运行该步骤,而无需猜测隐藏状态。 配置信息应置于应用程序代码之外。环境文件、密钥存储以及功能标志应集中存放于一个位置,以便操作人员无需查看整个系统结构即可进行审核。 需引用实际作为答案依据的段落。如果没有引用,操作人员就无法区分是幻觉内容还是索引缺失导致的错误。
{
"embedding": [0.123, 0.456, ...],
"text": "Transformer models are powerful...",
"metadata": {
"doc_id": "doc1",
"page": 5
}
}
为何要将分块数据与嵌入向量一起存储?
在“Why Store Chunk Embedding”阶段,修改代码之前需明确输入内容、该步骤的负责人以及结束标准。操作人员应能够从已知的检查点重新运行该步骤,而无需猜测隐藏状态。 需同时记录正常流程和异常恢复流程。重试机制、人工审核环节以及错误处理都是产品本身的组成部分,而非后续需要补充的功能。 必须引用支撑答案的具体内容。如果没有引用,操作人员就无法区分是幻觉还是索引缺失导致的错误。
检索机制的工作原理
在“检索原理”阶段,修改代码之前需明确输入参数、该步骤的负责人以及终止标准。操作人员应能够从已知的检查点重新运行该步骤,而无需猜测隐藏状态。 优先选择小型、可测试的单元,而非冗长的脚本。当某一步骤失败时,故障应指向单一责任点,而非复杂的流程链。 需引用实际作为答案依据的段落。没有引用的话,操作人员就无法区分是幻觉内容还是索引缺失导致的错误。 在“检索原理”阶段,修改代码之前需明确输入参数、该步骤的负责人以及终止标准。操作人员应能够从已知的检查点重新运行该步骤,而无需猜测隐藏状态。 除了功能结果外,还需记录执行时间以及令牌或查询成本。提前了解成本情况,可避免在从演示环境过渡到共享环境时出现意外费用。
向量数据库的实际工作原理(幕后机制)
在研究向量数据库的实际运作方式时,首先需明确相关规范:所需的输入参数、成功标志,以及部分失败时的处理方式。这样的检查清单能确保后续的代码修改保持一致性。 应将配置信息与应用程序代码分开存放。环境文件、密钥存储以及功能开关应集中管理,以便操作人员无需查看全部代码即可进行审计。 在调整提示词之前,需先使用固定的问题集来测试召回率。仅仅更换提示词往往无法解决检索效果不佳的问题。
HNSW(分层可导航小世界结构)
在实现 HNSW 分层可导航小型结构时,首先明确相关约定:所需输入、成功信号以及部分失败时的处理方式。这样的检查清单能确保后续代码修改的规范性。 同时记录正常流程与故障恢复路径。重试机制、人工审核环节以及死信处理都是产品本身的组成部分,而非后续需要补充的功能。 在调整提示词之前,先使用固定的问题集来衡量召回率。仅仅更换提示词很难改善较差的检索效果。
IVF 反向文件索引(用于快速搜索的聚类技术)
在处理IVF倒排文件索引阶段时,首先需明确相关约定:所需输入、成功标志以及部分失败时的处理方式。这样的清单能确保后续的代码修改保持一致性。 相比冗长的脚本,应优先选择小型且可测试的单元。当某个步骤失败时,故障应指向单一责任模块,而非复杂的流程链。 在调整提示词之前,需先使用固定的问题集来衡量检索效果。仅仅更换提示词很难解决检索能力不足的问题。 在处理IVF倒排文件索引阶段时,首先需明确相关约定:所需输入、成功标志以及部分失败时的处理方式。这样的清单能确保后续的代码修改保持一致性。 除了功能结果外,还需记录执行时间以及令牌或查询成本。提前了解成本情况,可避免在从演示环境过渡到共享环境时出现意外费用。
IVF与HNSW的对比
将试管婴儿技术与阶段性工作进行比较时,若将其视为可测量的指标会更为有效。在扩大范围之前,先记录一个成功的案例、一个失败的案例以及相关的回滚说明。 应将配置与应用程序代码分开。环境文件、密钥存储和功能标志应集中存放于一处,这样操作人员无需查看整个系统结构即可进行审计。 需将分块策略与检索策略区分开来。当质量指标发生变化时,修改其中一项不应迫使重新编写另一项。
纯向量搜索的弊端
将纯阶段式方法的问题视为可测量的指标来处理效果最佳。在扩大范围之前,先记录一个成功的案例、一个失败案例以及回滚说明。同时记录正常流程和恢复流程的文档。重试机制、人工审核环节以及死信处理都是产品本身的一部分,而非后续需要补充的内容。应将分块策略与检索策略分开,当质量指标发生变化时,修改其中一项不应迫使重新编写另一项。
混合搜索:两全其美
将“混合搜索最佳结果”阶段视为可度量的对象时,其效果最为理想。在扩大范围之前,先记录一个最佳案例、一个失败案例以及回滚说明。 相较于庞大的脚本,应优先选择小型且可测试的单元。当某一步骤失败时,故障应指向单一责任点,而非复杂的流程链。 应将分块策略与检索策略分开。当质量指标发生变化时,修改其中一项不应迫使重新编写另一项。 将“混合搜索最佳结果”阶段视为可度量的对象时,其效果最为理想。在扩大范围之前,先记录一个最佳案例、一个失败案例以及回滚说明。 除了功能结果外,还需记录处理时间以及令牌或查询成本。提前了解成本情况,可避免在从演示环境过渡到共享环境时出现意外费用。
RAG系统中的重排序:从良好结果到最佳结果
在RAG系统的重排序阶段,修改代码之前需明确输入内容、该步骤的负责人以及终止标准。操作人员应能够从已知的检查点重新运行该步骤,而无需猜测隐藏状态。 配置信息应置于应用程序代码之外。环境文件、密钥存储和功能标志应集中存放于一个位置,以便操作人员无需查看整个系统结构即可进行审核。 需注明实际作为答案依据的段落。如果没有引用,操作人员就无法区分是幻觉内容还是索引缺失导致的错误。
"""Super-simple CrossEncoder reranking example.
Steps:
1. Define a query and a few short documents.
2. Build (query, doc) pairs.
3. Use a CrossEncoder to get a relevance score for each pair.
4. Print raw scores, then print documents sorted by score.
"""
from sentence_transformers import CrossEncoder
def main() -> None:
# 1. Create model
model_name = "cross-encoder/ms-marco-MiniLM-L-6-v2"
print(f"Loading CrossEncoder model: {model_name}\n")
model = CrossEncoder(model_name)
# 2. Query and documents
query = "What is a vector database?"
documents = [
"A vector database stores embeddings and allows similarity search.",
"Relational databases store structured data in tables.",
"FAISS is a library for efficient similarity search of vectors.",
"Vector databases are used in AI applications like RAG.",
]
# 3. Build (query, doc) pairs
pairs = [(query, doc) for doc in documents]
# 4. Get scores
scores = model.predict(pairs)
print("Query:\n " + query + "\n")
print("Raw scores (higher = more relevant):")
for doc, score in zip(documents, scores):
print(f" score={score:.4f} | doc={doc}")
# 5. Sort by score (descending)
ranked = sorted(zip(documents, scores), key=lambda x: x[1], reverse=True)
print("\nDocuments sorted by cross-encoder score:\n")
for rank, (doc, score) in enumerate(ranked, start=1):
print(f"Rank {rank}: score={score:.4f}")
print(f" {doc}\n")
if __name__ == "__main__":
main()
Output
****************************************************
Query:
What is a vector database?
Raw scores (higher = more relevant):
score=8.4591 | doc=A vector database stores embeddings and allows similarity search.
score=-7.1590 | doc=Relational databases store structured data in tables.
score=1.0106 | doc=FAISS is a library for efficient similarity search of vectors.
score=7.0736 | doc=Vector databases are used in AI applications like RAG.
Documents sorted by cross-encoder score:
Rank 1: score=8.4591
A vector database stores embeddings and allows similarity search.
Rank 2: score=7.0736
Vector databases are used in AI applications like RAG.
Rank 3: score=1.0106
FAISS is a library for efficient similarity search of vectors.
Rank 4: score=-7.1590
Relational databases store structured data in tables.
理解向量搜索中的相似度度量方法(余弦值、点积、欧几里得距离)
在阶段性的相似度衡量理解工作中,修改代码之前需明确输入内容、该步骤的负责人以及终止标准。操作人员应能够从已知的检查点重新运行该步骤,而无需猜测隐藏状态。 需同时记录正常流程与异常恢复路径。重试机制、人工审核环节以及错误处理都属于产品功能的一部分,而非后续需要补充的内容。 必须引用实际作为答案依据的段落。若没有引用,操作人员就无法区分是幻觉内容还是索引缺失导致的错误。
结论
在结论阶段,应在修改代码之前明确输入参数、该步骤的负责人以及终止标准。操作人员应能够从已知的检查点重新运行该步骤,而无需猜测隐藏状态。 相较于冗长的脚本,更应采用小型且可测试的单元。当某个步骤失败时,故障原因应能指向单一责任点,而非复杂的流程链。 需引用实际作为答案依据的段落。没有引用的话,操作人员就无法区分是虚假信息还是索引缺失导致的错误。 在结论阶段,应在修改代码之前明确输入参数、该步骤的负责人以及终止标准。操作人员应能够从已知的检查点重新运行该步骤,而无需猜测隐藏状态。 除了功能结果外,还需记录执行时间以及令牌或查询成本。提前了解成本情况,可避免在流程从演示环境转向共享环境时出现意外费用。
操作检查清单
在处理操作检查清单阶段时,首先写下相关契约:所需的输入参数、成功标志以及部分失败时的处理方式。这样的检查清单能确保后续的代码修改保持一致性。
将此阶段视为输入与验证后输出之间的契约。为相关成果命名,明确成功标准,杜绝默许的不完整处理。
在调整提示词之前,先使用固定的问题集测试召回率。仅仅更换提示词往往无法解决检索效果不佳的问题。
锁定依赖项的版本,并记录用于演示的图像摘要。可重复性远比团队内部的经验更重要。
在功能结果旁记录执行时间以及token或查询成本。提前了解成本情况,可避免从演示环境过渡到共享环境时出现意外费用。
在调整提示词之前,先使用固定的问题集测试召回率。频繁更换提示词很难改善较差的检索效果。
在升级整个系统之前,先冻结现有版本,为关键流程记录标准文本,并明确回滚步骤。共享环境需要设置速率限制、租户验证机制,以及明确的密钥轮换负责人。与其追求华丽的临时演示,不如注重扎实的稳定性。
关于5984e1048405的批注:不要将服务提供商密钥放入代码仓库,为每个会话设置令牌使用上限,并将文本记录与评估用文件放在一起,以便后续更换模型时保持数据可比性。