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);

内容预览已结束

此内容需要会员权限。请先登录以查看完整内容。