正确路径是调用/v1/embeddings获取向量→存入本地向量库→相似性查询;input必须为字符串列表,向量维度1536且需转float32,faiss用indexflatip(1536),长文档须按512 token切块、64 token重叠。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

直接调用 /v1/embeddings 获取向量,别绕弯走搜索接口
DeepSeek 没有独立的“语义搜索 API”,所谓语义搜索是两步合成动作:先嵌入、再检索。很多新手误以为调用 /v1/search 就能直接返回语义结果,但该接口实际是旧版混合检索(含关键词+轻量向量),不支持自定义索引或精确余弦相似度排序,且已逐步弃用。真正可控、可复现、可部署的路径只有一条:/v1/embeddings → 本地向量库 → 相似性查询。
input 字段必须是 list,单文本也要包成数组
常见报错 "input must be a list of strings" 就是因为传了字符串而非列表。哪怕只处理一句话,也得写成 ["我爱编程"],不能是 "我爱编程"。否则服务端直接 400 拒绝,不进模型也不返回向量。
实操建议:
- 批量请求时,把 5–8 个语义连贯的短文本(如分句后的段落)合并为一个 list,总 token 控制在 ≤2048,提升吞吐效率
- 中文文本务必用 DeepSeek 官方 tokenizer(
deepseek-ai/deepseek-embedding)预估长度,别依赖字符数或正则粗略估算 - 若某次响应含
"message": "input_too_long",说明该 batch 超限,立刻拆分为单条请求,别重试原 payload
向量维度固定为 1536,但 FAISS 索引前必须转 float32
DeepSeek V4 返回的 embedding 是 Python list of float,直接喂给 FAISS 会报类型错误:expected array of type float32。这不是精度问题,而是 FAISS 底层强制要求。
正确做法:
- 用
numpy.array(embedding, dtype='float32')转换,别用np.float64或默认np.float - 构建
IndexFlatIP(1536)(内积索引),它等价于余弦相似度——前提是所有向量已归一化;但 DeepSeek 返回的是未归一化向量,所以必须用IndexFlatIP,不能用IndexFlatL2 - 插入前检查维度:
len(embedding) == 1536,少一位或多一位都说明 token 截断异常或解析出错
长文档要滑动窗口切块,64-token 重叠不是可选项
对一份 20 万字 PDF 做全文嵌入?直接 input = [full_text] 必然失败:API 限 2048 token / request,客户端内存爆掉,且语义断裂严重。“保留上下文”不是靠猜,是靠结构化重叠。
关键参数(经实测收敛):
-
chunk_size = 512tokens(约 380 中文字符),对应 DeepSeek tokenizer 的精确计数 -
overlap = 64tokens(约 45 中文字符),足够覆盖跨句主谓、术语缩写(如“BERT”首次出现后下一段才解释)、以及带编号的条款衔接 - 切完必须过滤:
len(chunk.strip()) 的碎片丢弃,它们生成的向量噪声大、相似度虚高 - 每块附加元数据:
{"doc_id": "manual_v3", "chunk_idx": 12, "text": "..."},后续召回才能定位原文位置
真正容易被忽略的点:向量检索返回的是 chunk ID,不是原始段落。不做元数据绑定,搜到结果根本不知道来自哪一页、哪一节——语义搜索就退化成了黑盒匹配。









