EN

语义搜索实现:2026 年完整开发者指南

通过实际示例和生产模式掌握语义搜索实现

返回教程列表🌐 Read in English
进阶10 分钟

语义搜索实现:2026 年完整开发者指南

通过实际示例和生产模式掌握语义搜索实现

语义搜索实现完全指南(2026):分块→嵌入→向量库存储→近邻检索→重排的完整管线,含真实代码、向量库选型(Chroma/Qdrant/pgvector/Pinecone)、分块/混合检索/重排/元数据过滤等质量杠杆。RAG 的检索底座。

语义搜索实现:2026 年完整开发者指南

语义搜索根据含义而非精确关键词查找结果。你将文本转换为嵌入(稠密向量),存储在向量索引中,查询时嵌入查询并检索最近的向量。它是 RAG 的检索部分,也是“查找关于取消订阅的文档”能匹配到标题为“如何终止你的计划”页面的原因。

管线

  • 分块:将文档切分为段落(每段几百个 token)。
  • 嵌入:使用嵌入模型对每个块进行嵌入。
  • 存储:将向量和元数据存储在向量数据库中。
  • 查询:嵌入用户文本,检索 top-k 最近的块。
  • (可选)重排:在传递给 LLM 之前对 top-k 结果进行重排以提高精度。
  • python
    

    pip install openai

    from openai import OpenAI client = OpenAI()

    def embed(texts): r = client.embeddings.create(model="text-embedding-3-small", input=texts) return [d.embedding for d in r.data]

    docs = ["How to cancel your subscription", "Resetting your password", "Billing FAQ"] doc_vecs = embed(docs)

    import numpy as np def search(query, k=2): q = np.array(embed([query])[0]) sims = [float(np.dot(q, v) / (np.linalg.norm(q) * np.linalg.norm(v))) for v in doc_vecs] return sorted(zip(docs, sims), key=lambda x: -x[1])[:k]

    print(search("end my plan")) # → "How to cancel your subscription" 排名第一

    numpy 版本仅用于说明——生产环境中应使用向量数据库,以便在大规模下保持搜索速度。

    选择向量存储

  • 原型/本地:Chroma 或 pgvector——参见 Chroma vs Qdrantpgvector 指南
  • 生产/大规模:Qdrant、Pinecone 或 Weaviate——参见 Pinecone vs Weaviate
  • 质量杠杆

  • 分块比嵌入模型更重要。块太大则检索不精确;太小则丢失上下文。尝试 200–500 个 token,并带少量重叠。
  • 混合检索(结合语义 + 关键词/BM25)能捕获纯向量遗漏的精确术语(代码、名称)。
  • 重排:使用交叉编码器对较大的 top-k 结果进行重排,可在 LLM 看到之前显著提高精度。
  • 元数据过滤(日期、来源、语言)先缩小候选集范围。
  • 整个流程是 RAG 的检索阶段——要构建完整管线,请参见 LangChain vs LlamaIndex for RAGLlamaIndex 生产级 RAG

    常见问题

    嵌入 vs 关键词搜索? 关键词匹配精确术语;嵌入匹配含义。混合搜索两者兼用。 选择哪个嵌入模型? 当前通用模型即可开始;更大的收益来自分块和重排。 检索多少结果? 检索一个较大的 top-k(例如 20),重排,然后将最佳的几个传递给 LLM。

    总结

    语义搜索 = 嵌入、存储、通过近邻检索。正确分块,添加混合搜索和重排以提高精度,选择适合规模的向量存储。它是每个 RAG 系统的骨干。


    *最后更新:2026 年 6 月。请根据 OpenAI 文档验证嵌入 API。*

    相关工具

    LangChainOpenAIPython
    所属主题:RAG 检索增强生成