285 - 《minicc 和 OpenAI embedding》
发布于 2023年4月6日
上周末刚习地的技能,感觉不写下来,这个知识点就要被遗忘了。
背景是写了个 minicc 的命令,接入在 Telegram 里。他的训练集里包含 90% 的日更文章里的内容,并且可以根据你的问题作出回答。效果图如下。
怎么实现的?分两步。
1、生成 embeddings 向量数据
2、回答问题
提取了个最简可运行的代码如下,保存、填入 apiKey,安装 openai 和 @stdlib/blas 依赖,然后就可以跑了。如果顺利,他会回答你「Node is chicken.」。
import { Configuration, OpenAIApi } from "openai";
import ddot from '@stdlib/blas/base/ddot';
import assert from "assert";
const contents = [
`what's javascript? javascript is egg.`,
`what's node? node is chicken.`,
];
const question = 'what is node?';
const apiKey = ''; /* 替换成自己的 */
(async () => {
const config = new Configuration({
apiKey,
});
const openai = new OpenAIApi(config);
// 1、Generate embedding map
const embeddingsMap = new Map();
const { data } = await openai.createEmbedding({
model: 'text-embedding-ada-002',
input: contents,
});
data.data.forEach((item, index) => {
embeddingsMap.set(contents[index], item.embedding);
});
// 2、Ask and answer
// 2.1、Generate question embedding
const { data: questionData } = await openai.createEmbedding({
model: 'text-embedding-ada-002',
input: [question],
});
const questionEmbedding = questionData.data[0].embedding;
// 2.2、Calculate cosine similarity
const x = new Float64Array(questionEmbedding);
const matched = Array.from(embeddingsMap.entries())
.map(([k, v]) => {
const y = new Float64Array(v);