循环中使用Await调用getEmbedding后未获取嵌入值的问题排查
问题排查:GPT3嵌入生成后字段为空的问题
核心问题出在getEmbedding函数的返回逻辑上——你在axios.post的then回调里返回了嵌入结果,但这个return只属于回调函数本身,并没有成为getEmbedding函数的返回值,导致函数最终返回undefined,所以section.embedding字段为空。
修复方案
方案1:改用async/await+try/catch写法(推荐)
这种写法更直观,避免回调嵌套问题:
async function getEmbedding(textSample){ const embeddingModel = "text-search-davinci-doc-001"; if(DEBUGGING){ console.log(`DEBUG: getEmbedding(${textSample})`); } const OPENAI_REQEST_HEADERS = { "Content-Type":"application/json", "Authorization":`Bearer ${OPENAI_API_KEY}` } let data = { "input" : textSample, "model" : embeddingModel }; try { const response = await axios.post(EMBEDDINGS, data, {headers:OPENAI_REQEST_HEADERS}); if(DEBUGGING) { console.log(" Embedding: " + response.data.data[0].embedding); } // 直接返回嵌入结果 return response.data.data[0].embedding; } catch (error) { console.log("Error posting to OpenAI:"); console.log(error.response.data); // 可根据需求返回默认值或抛出错误 return null; } }
方案2:保留then/catch,调整返回逻辑
如果要保留原有的then/catch结构,需要把嵌入结果存储到外部变量,最后返回该变量:
async function getEmbedding(textSample){ const embeddingModel = "text-search-davinci-doc-001"; if(DEBUGGING){ console.log(`DEBUG: getEmbedding(${textSample})`); } const OPENAI_REQEST_HEADERS = { "Content-Type":"application/json", "Authorization":`Bearer ${OPENAI_API_KEY}` } let data = { "input" : textSample, "model" : embeddingModel }; let embeddingResult = null; await axios.post(EMBEDDINGS, data, {headers:OPENAI_REQEST_HEADERS}) .then((response) => { if(DEBUGGING) { console.log(" Embedding: " + response.data.data[0].embedding); } embeddingResult = response.data.data[0].embedding; }) .catch((error) => { console.log("Error posting to OpenAI:"); console.log(error.response.data); }); // 返回存储的结果 return embeddingResult; }
额外检查点
- 确认
Section类是否正确定义,允许动态添加embedding属性,或者构造函数中已包含该属性 - 确保
DEBUGGING为true时,控制台确实打印了嵌入内容,验证API请求成功获取到数据
内容的提问来源于stack exchange,提问作者user1672528
相关产品推荐
相关产品推荐

