Skip to main content
Glama

AutoDev Codebase MCP Server

by anrgct
250703-troubleshooting-nan-embeddings.md4.09 kB
# 硅流API嵌入向量NaN问题处理经验 ## 问题描述 在使用硅流API(SiliconFlow)进行代码嵌入向量生成时,遇到了Qdrant向量数据库报错: ``` Failed to upsert points: ApiError: Bad Request Format error in JSON body: data did not match any variant of untagged enum VectorStruct ``` ## 问题根因分析 ### 1. 错误表象 - Qdrant拒绝接收向量数据 - 错误信息指向JSON格式问题 ### 2. 深入调试发现 通过添加调试日志发现: - 硅流API返回的某些嵌入向量base64数据是无效的 - 具体表现:base64字符串解码后的buffer内容全是 `[255, 255, 255, 127, ...]` 模式 - 这种字节模式在IEEE 754标准中对应NaN(Not a Number) - 导致整个嵌入向量数组全是NaN值 ### 3. 问题示例 ```javascript // 有问题的base64数据 "////f////3////9/////f////3////9/////f////3////9/" // 解码后的buffer (前32字节) [255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, ...] // 转换为Float32Array后 [NaN, NaN, NaN, NaN, NaN, NaN, ...] ``` ## 解决方案 ### 1. 检测机制 在OpenAI Compatible Embedder中添加NaN检测: ```typescript // Check for NaN values const nanCount = Array.from(float32Array).filter(x => Number.isNaN(x)).length if (nanCount > 0) { console.warn(`[WARN] Invalid embedding data at index ${index}, using fallback`) invalidIndices.push(index) // 标记为无效,稍后处理 } ``` ### 2. 降级处理 为无效的嵌入向量生成fallback数据: ```typescript // Handle invalid embeddings by generating fallbacks if (invalidIndices.length > 0) { console.warn(`[WARN] Generated ${invalidIndices.length} fallback embeddings for invalid data`) // Get dimension from first valid embedding const validEmbedding = processedEmbeddings.find(item => Array.isArray(item.embedding) && item.embedding.length > 0 ) const dimension = validEmbedding?.embedding?.length || 1536 for (const invalidIndex of invalidIndices) { const fallbackEmbedding = Array.from({ length: dimension }, () => (Math.random() - 0.5) * 0.001 ) processedEmbeddings[invalidIndex].embedding = fallbackEmbedding } } ``` ### 3. 特点说明 - **自动检测**:无需手动干预,自动识别NaN向量 - **动态维度**:从有效向量中获取正确的维度信息 - **微小随机值**:fallback向量使用很小的随机值(-0.0005到0.0005),不会干扰搜索结果 - **继续处理**:不会因单个无效向量停止整个索引过程 ## 技术细节 ### Base64解码过程 ```typescript const buffer = Buffer.from(item.embedding, "base64") const float32Array = new Float32Array(buffer.buffer, buffer.byteOffset, buffer.byteLength / 4) ``` ### IEEE 754标准 - `255, 255, 255, 127` 字节序列在IEEE 754中表示NaN - 硅流API某些情况下会返回这种填充模式而不是有效的浮点数据 ### 影响范围 - 主要影响使用硅流API的OpenAI Compatible Embedder - 其他嵌入提供商(OpenAI原生、Ollama)不受影响 ## 预防措施 ### 1. 日志监控 监控以下警告信息: ``` [WARN] Invalid embedding data at index X, using fallback [WARN] Generated X fallback embeddings for invalid data ``` ### 2. API稳定性 - 考虑使用多个嵌入API提供商作为备份 - 监控硅流API的稳定性和数据质量 ### 3. 数据验证 - 在关键应用中可以添加额外的向量质量检查 - 考虑重试机制(虽然本案例中重试结果相同) ## 相关文件 - `/src/code-index/embedders/openai-compatible.ts` - 主要修复代码 - `/docs/troubleshooting-nan-embeddings.md` - 本文档 ## 总结 这是一个典型的第三方API数据质量问题。通过添加robust的错误处理和fallback机制,系统能够优雅地处理这种异常情况,确保索引过程的稳定性和连续性。 关键教训: 1. **永远验证外部API返回的数据** 2. **提供合理的fallback机制** 3. **详细的错误日志有助于快速定位问题** 4. **IEEE 754标准知识在处理浮点数据时很重要**

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/anrgct/autodev-codebase'

If you have feedback or need assistance with the MCP directory API, please join our Discord server