MultiVector 多向量检索

这是什么?

MultiVector (多向量索引)是 LangChain 的一种高级检索技术。它的核心思想是:为每个文档生成多个假设性问题,将这些问题向量化用于检索,但最终返回的是原始文档

核心原理:

markdown 复制代码
原始文档 → LLM生成假设性问题 → 问题向量化存储
                ↓
         用户查询 → 向量检索 → 匹配假设性问题 → 返回原始文档

有什么用?

主要用途: • 电商产品搜索 - 用户可能用各种方式描述产品需求 • 文档问答系统 - 用户提问方式与文档表述不一致 • 知识库检索 - 提高检索准确率和召回率 • 客服系统 - 匹配用户多样化的提问方式

解决问题:传统向量检索中,文档表述与用户查询可能语义不匹配。MultiVector 通过生成多个假设性问题增加匹配概率。


示例代码

python 复制代码
from typing import List
from pydantic import BaseModel, Field
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
from langchain_core.documents import Document

# 1. 定义假设性问题的数据结构
class HypotheticalQuestions(BaseModel):
    """生成假设性问题"""
    questions: List[str] = Field(
        description="假设性问题列表,类型为字符串列表",
    )

# 2. 构建生成假设性问题的 prompt
prompt = ChatPromptTemplate.from_template(
    "生成一个包含3个假设性问题的列表,这些问题可以用于回答下面的文档:\n\n{doc}"
)

# 3. 创建 LLM 并绑定结构化输出
llm = ChatOpenAI(model="moonshot-v1-8k", temperature=0)
structured_llm = llm.with_structured_output(HypotheticalQuestions)

# 4. 创建链应用
chain = (
    {"doc": lambda x: x.page_content}
    | prompt
    | structured_llm
)

# 5. 调用链生成假设性问题
hypothetical_questions = chain.invoke(
    Document(page_content="我叫慕小课,我喜欢打篮球,游泳")
)

print(hypothetical_questions.questions)
# 输出示例:
# [
#   "慕小课喜欢什么运动?",
#   "谁喜欢打篮球和游泳?",
#   "慕小课的兴趣爱好是什么?"
# ]

流程图

markdown 复制代码
┌─────────────────────────────────────────────────────────────┐
│                    MultiVector 检索流程                      │
└─────────────────────────────────────────────────────────────┘

【索引构建阶段】

原始文档集合
     │
     ▼
┌─────────────────┐
│   遍历每个文档    │
└────────┬────────┘
         │
         ▼
┌─────────────────────────────────┐
│   LLM 生成假设性问题(3-5个)      │
│   - "这个文档可能回答什么问题?"     │
└────────┬────────────────────────┘
         │
         ▼
┌─────────────────────────────────┐
│   将假设性问题进行 Embedding      │
│   (问题 → 向量)                   │
└────────┬────────────────────────┘
         │
         ▼
┌─────────────────────────────────┐
│   存储到向量数据库                 │
│   - key: 问题向量                  │
│   - value: 原始文档                │
└─────────────────────────────────┘


【检索阶段】

用户查询
     │
     ▼
┌─────────────────────────────────┐
│   将查询转向量 (Query Embedding)  │
└────────┬────────────────────────┘
         │
         ▼
┌─────────────────────────────────┐
│   向量相似度搜索                   │
│   (找出最相似的假设性问题)          │
└────────┬────────────────────────┘
         │
         ▼
┌─────────────────────────────────┐
│   返回假设性问题对应的原始文档      │
└────────┬────────────────────────┘
         │
         ▼
┌─────────────────────────────────┐
│   使用检索到的文档回答用户查询      │
└─────────────────────────────────┘
相关推荐
不会敲代码15 小时前
手写 Mini React:从 JSX 到虚拟 DOM 再到 render,搞懂 React 底层原理
前端·javascript·react.js
kyriewen6 小时前
你的代码仓库变成“毛线团”了?Monorepo 用 Turborepo 拆成“乐高积木”
前端·javascript·面试
身如柳絮随风扬6 小时前
你知道什么是 Ajax 吗?—— 从入门到原理,一篇彻底搞懂
前端·ajax·okhttp
旷世奇才李先生7 小时前
Vue3\+TypeScript 2026实战——企业级前端项目架构搭建与性能优化全指南
前端·架构·typescript
Beginner x_u7 小时前
前端八股整理(工程化 02)|CommonJS/ESM、Webpack Loader/Plugin 与Vite 对比
前端·webpack·node.js·plugin·loader
openKaka_8 小时前
createRoot 到底创建了什么:FiberRootNode 和 HostRootFiber 的初始化过程
前端·javascript·react.js
习明然8 小时前
UniApp开发体验感受总结
前端·uni-app
AI人工智能+电脑小能手9 小时前
【大白话说Java面试题】【Java基础篇】第32题:Java的异常处理机制是什么
java·开发语言·后端·面试
ltl9 小时前
Softmax 与概率分布:从分数到选择的桥
后端
刀法如飞9 小时前
Claude Code Skills 推荐:2026年最值得安装的10个AI技能
前端·后端·ai编程