A: xb 的核心区别:
// xb
xb.Of(&Doc{}).VectorSearch("embedding", vector).Build()
// 传统 ORM
// ❌ 不支持向量检索
A: 推荐使用场景:
✅ 推荐:
⚠️ 谨慎使用:
A:
推荐学习路径:
A: 当前支持:
未来计划:
A: 常见选择:
| 模型 | 维度 | 适用场景 |
|---|---|---|
| OpenAI Ada-002 | 1536 | 通用,英文优秀 |
| OpenAI text-embedding-3-small | 1536 | 更快更便宜 |
| OpenAI text-embedding-3-large | 3072 | 最高质量 |
| Cohere embed-multilingual | 768 | 多语言支持 |
| 本地模型 (BERT) | 768 | 私有部署 |
推荐:
A: 典型指标:
Recall@10: 0.90-0.95 (召回率)
Precision@10: 0.85-0.92 (准确率)
Latency (P95): < 50ms (延迟)
影响因素:
A: 5 个技巧:
// 保持语义完整性
chunks := ChunkBySentence(doc, 3-5) // 3-5 句话一块
// 结合标量过滤
xb.Of(&Doc{}).
VectorSearch("embedding", vec).
Eq("category", "tech"). // 过滤类别
Gte("score", 0.7) // 质量过滤
// 使用 Cross-Encoder 精排
reranked := RerankWithCrossEncoder(results, query)
// MMR 算法
diverse := ApplyMMR(results, lambda=0.7, topK=10)
// 生成相关查询
queries := []string{query, synonym1, synonym2}
// 合并结果
A: 端到端延迟分解:
总延迟 (P95): 250-500ms
组成:
├─ Embedding: 100ms (40%)
├─ 向量检索: 50ms (20%)
├─ 重排序: 30ms (12%)
└─ LLM 生成: 70ms (28%)
优化目标:
500ms: 需要优化
A: 三种策略:
策略 1: 层级分块
// 文档 → 章节 → 段落 → 句子
chunks := HierarchicalChunk(document)
策略 2: 滑动窗口
// 固定大小 + 重叠
chunks := ChunkWithOverlap(doc, size=500, overlap=50)
策略 3: 语义分块
// 基于语义边界
chunks := SemanticChunk(doc) // 自动识别段落
推荐: 混合使用,根据文档类型选择。
A: 5 个方法:
// 设置较高的相似度阈值
qx.ScoreThreshold(0.75) // 而非 0.5
Prompt: "仅根据以下文档回答,如果文档中没有相关信息,请明确说明。"
// 返回文档 ID 和分数
response.Sources = []Source
// 要求至少 2 个文档支持
if len(relevantDocs) < 2 {
return "信息不足,无法回答"
}
// 验证答案是否在文档中出现
if !ContainsInDocs(answer, docs) {
return "答案可能不准确"
}
A: 5 个优化点:
// Qdrant HNSW 参数调优
HNSWConfig{M: 32, EfConstruct: 256}
// 批量 embedding
embeddings := BatchEmbed(texts, batchSize=32)
// 缓存热门查询
cache.Set(queryHash, results, ttl=15*time.Minute)
// 多个查询并行执行
results := ParallelSearch(queries)
// 复用连接
pool := NewConnectionPool(minConns=10, maxConns=100)
A:
// 使用 int8 量化,减少 75% 内存
QuantizationConfig{Type: "int8"}
// 1536 → 768 维
reducedVector := PCA(vector, targetDim=768)
// 不要一次加载所有文档
for chunk := range documentStream {
process(chunk)
}
A: 性能参考:
| 规模 | 延迟 (P95) | 内存 | 推荐配置 |
|---|---|---|---|
| < 10万 | < 20ms | 2GB | 单节点 |
| 10-100万 | < 50ms | 8GB | 单节点 + 量化 |
| 100-1000万 | < 100ms | 32GB | 集群 (3节点) |
| > 1000万 | < 200ms | 128GB+ | 集群 (5+节点) |
A: 详见 LANGCHAIN_INTEGRATION.md
快速示例:
from langchain.vectorstores import XbVectorStore
vector_store = XbVectorStore(
backend_url="http://localhost:8080",
embedding=OpenAIEmbeddings()
)
A:
原生支持:
通过 HTTP API:
A:
Kubernetes:
# 参考 examples/k8s/deployment.yaml
Docker Compose:
# 参考 examples/docker-compose/rag-stack.yml
Serverless:
排查步骤:
fmt.Println(len(queryVector)) // 应该匹配 collection
qx.ScoreThreshold(0.5) // 临时降低
curl http://localhost:6333/collections/docs/points/count
// 移除所有过滤,只测试向量检索
xb.Of(&Doc{}).VectorSearch("embedding", vec)
常见原因:
export OPENAI_API_KEY="sk-..."
// 添加重试逻辑
for i := 0; i < 3; i++ {
if emb, err := callAPI(); err == nil {
return emb
}
time.Sleep(time.Second * time.Duration(math.Pow(2, float64(i))))
}
// OpenAI 限制 8191 tokens
if len(text) > 30000 {
text = text[:30000] // 截断
}
诊断工具:
import "time"
start := time.Now()
results, _ := executeQuery()
fmt.Printf("查询耗时: %v\n", time.Since(start))
// 分阶段测量
embeddingTime := measureEmbedding()
searchTime := measureSearch()
rerankTime := measureRerank()
常见瓶颈:
方法 1: 打印 SQL
sql, args, _ := xb.Of(&User{}).Eq("status", "active").Build()
fmt.Printf("SQL: %s\nArgs: %+v\n", sql, args)
方法 2: 使用 Interceptor
xb.RegisterInterceptor(func(sql string, args []interface{}) {
log.Printf("[XB] %s | %+v", sql, args)
})
方法 3: Qdrant 查询日志
built := builder.Build()
json, _ := built.ToQdrantJSON()
fmt.Printf("Qdrant Query: %s\n", json)
持续更新中… 如果您的问题未被列出,欢迎提交 Issue!