Este problema me parece la repetición de una pesadilla. El proyecto es entrenar un chatbot usando gpt3 y estoy experimentando con incrustaciones.
Tengo un documento y estoy tratando de crear incrustaciones para las diferentes secciones. getEmbeddings() parece devolver un valor de acuerdo con mis pruebas. Sin embargo, cuando mi ciclo finaliza, parece que no tengo una incrustación en mi sección (solo hay una... cuesta dinero hacer incrustaciones, así que solo ejecutaré el ciclo una vez hasta que funcione).
¿Qué estoy haciendo mal?
begin(); async function begin(){ let sections = []; let inputFileName = "sourceDocument.jsonl"; let filecontents = fs.readFileSync(inputFileName,{encoding:'utf-8'}) let inputRows = [] = String(filecontents).split(/\r?\n/); for(let i = 0; i < inputRows.length; i++) { let row = inputRows[i]; if(row.trim().length == 0) continue; let dataObject = JSON.parse(row); let text = dataObject.completion; let section = new Section(); let titleend = text.indexOf("'>") //console.log(dataObject); section.title = text.substring(1,titleend); section.text = String(text).substring( (titleend + 2), (text.length - 10) ); section.embedding = await getEmbedding(section.text); sections.push(section); break; } console.log(sections[0]); } 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 res; await axios.post(EMBEDDINGS, data, {headers:OPENAI_REQEST_HEADERS}) .then((response) => { if(DEBUGGING) { console.log(" Embedding: " + response.data.data[0].embedding); } let embedding = response.data.data[0].embedding; return embedding; }) .catch((error) => { console.log("Error posting to OpenAI:"); console.log(error.response.data); }) }Use async / await o use then patrón nativo de Promises, pero trate de evitar usar ambos: se vuelve confuso y ahí es donde se equivocó. Su declaración de return regresa del método then , pero no del método getEmbedding externo en sí.
Hay 2 formas de resolver esto: una es devolver el resultado de axios.post pero el otro método, un poco más fácil de leer, usa async / await en todo momento.
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); } }