HyDE - 假设文档嵌入查询扩展
Skill-HyDE-Hypothetical-Document · 08-知识图谱
1. 解决的问题
HyDE(Hypothetical Document Embeddings) 的洞察极其简单却有效
2. 核心算法逻辑
HyDE(Hypothetical Document Embeddings) 的洞察极其简单却有效:
3. 业务应用场景
业务背景:中国消费者在海外购物平台用中文口语提问("这个奶瓶能放微波炉加热吗"),需要检索英文产品说明书中的专业表述("Microwave sterilization: Polypropylene (PP) materials are rated for microwave use up to 120°C for 5 minutes maximum")。直接用中文 embedding 检索英文文档,因语言差异召回率仅 38%。
HyDE 方案: 1. 中文查询 → LLM 生成英文假设答案:"Microwave heating for PP baby bottles is safe under specific conditions..." 2. 用英文假设文档 embedding 检索英文产品手册 3. 检索结果翻译返回用户
量化 ROI: | 指标 | 无 HyDE | 有 HyDE | 提升 | |---|---|---|---| | 跨语言检索召回率 | 38% | 71% | +87% | | MRR@10 | 0.31 | 0.58 | +87% | | 用户找到正确信息率 | 41% | 76% | +85% | | 退货(错误操作导致)| 3.8% | 1.9% | -50% |
4. 输入数据要求
请查看原始代码模板获取输入规格。
5. 输出结果
请查看原始代码模板获取输出规格。
6. 业务价值 / ROI
未自动抽取;请查看原始 Skill 卡片。
7. 代码模板
代码块数量:5 · 路径:未检测到
"""
HyDE - 假设文档嵌入查询扩展
arXiv: 2212.10496 (HyDE, CMU, 2022)
实现要点:
1. LLM 生成假设文档(mock)
2. 用假设文档 embedding 替代查询 embedding 检索
3. 支持多假设文档平均(HyDE-Multi)
4. 支持查询-假设文档混合权重
运行环境:Python 3.9+,无需外部 API(全 mock)
"""
import ast
import math
import random
from typing import Dict, List, Optional, Tuple
# ─────────────────────────────────────────────
# 数据结构
# ─────────────────────────────────────────────
class Document:
"""检索文档"""
def __init__(self, doc_id: str, text: str, metadata: Optional[Dict] = None):
self.doc_id = doc_id
self.text = text
self.metadata = metadata or {}
self.embedding: Optional[List[float]] = None
# ─────────────────────────────────────────────
# Mock 工具函数
# ─────────────────────────────────────────────
def mock_embed(text: str, dim: int = 32) -> List[float]:
"""
Mock embedding:deterministic,基于文本内容
关键设计:专业词汇相似的文本会产生相近 embedding,
模拟 HyDE "假设文档与真实文档措辞相近" 的效果
"""
random.seed(hash(text) % (2 ** 31))
base = [random.gauss(0, 1) for _ in range(dim)]
# 注入领域信号:包含相同关键词的文本 embedding 更接近
professional_keywords = [
"月龄", "婴儿", "配方", "BPA", "FDA", "CE认证",
"polypropylene", "BPA-free", "infant", "formula",
"microwave", "sterilization", "0-6", "newborn",
"双边", "水解", "低敏",
]
for keyword in professional_keywords:
if keyword.lower() in text.lower():
random.seed(hash(keyword) % (2 ** 31))
signal = [random.gauss(0, 0.3) for _ in range(dim)]
base = [b + s for b, s in zip(base, signal)]
norm = math.sqrt(sum(v * v for v in base)) + 1e-9
8. 论文来源
- 2212.10496