Rich Hickey GPTを作ってみた
TL;DR
最近流行りのChatGPT APIを活用したPaul Graham GPT(GitHub)にインスパイアされたので、Clojureの作者であり「Simple Made Easy」等で著名なRich Hickey版を作ってみました。
Rich Hickeyのありがたい言葉をすぐに解説してくれるぞ!
ついでにTypeScriptでのOpenAI APIの扱い方も解説しておきます。
使い方
$ git clone https://github.com/iwamatsu0430/rich-hickey-gpt
$ cd rich-hickey-gpt
$ npm install
$ export OPENAI_API_KEY=YOUR_API_KEY
$ npm run answer "What is Simple?"
処理の流れ
本家(Paul Graham GPT)の処理をほぼ参考にさせていただきました。
2023/03/13現在、Chat GPTでは会話で扱えるコンテキスト(文字数もしくはトークン)に制限があります。[1]よって、事前に類似性の高い文章を検索させて効率良く回答できるようにする必要があります。
- 前処理
- 参考資料(Rich Hickey登壇書き起こし)のスクレイピング
- API上限を超えないよう文章を適度に分割
- 文章をベクトル化(Embedding)
- DBへ保存
- 参考資料(Rich Hickey登壇書き起こし)のスクレイピング
- 検索
- クエリのベクトルを取得
- コサイン類似度の比較
- Chat GPT APIから回答を得る
文章のベクトル化
OpenAIでは文章をベクトル化するAPIが提供されています。どういう次元のベクトルになっているのかはわかりませんが、ここで得られたベクトル同士からコサイン類似度を計算することで、意図の近い文章を探すことができます。
Node.js向けにライブラリが提供されているため、簡単に利用することができます。
import { Configuration, OpenAIApi } from "openai";
const configuration = new Configuration({ apiKey: "YOUR_API_KEY" });
const openai = new OpenAIApi(configuration);
const response = await openai.createEmbedding({
model: "text-embedding-ada-002",
input: query, // 任意の文字列
});
const [{ embedding }] = response.data.data; // これがベクトル
類似度の比較
あらかじめ取得した参考資料のベクトルと、入力されたクエリのベクトルを比較することで類似の文章を探していきます。
本家では、コサイン類似度の比較にpgvectorを利用していましたが、Node.jsでもライブラリが提供されているのでこちらを利用しました。数値配列を渡すだけなのでとても簡単です。
Chat GPT APIから回答を得る
ここまでに得られたクエリや参考資料を加工してプロンプトにすることで、いい感じの回答を得ています。ここは本家をそのまま真似させていただきました。
const references = searchResult.map((row) => row.chunk).join("\n\n"); // 類似文章を並べる
const messages = [
{
role: "system",
content:
"You are a helpful assistant that accurately answers queries using Rich Hickey's talks. Use the text provided to form your answer, but avoid copying word-for-word from the talks. Try to use your own words when possible. Keep your answer under 5 sentences. Be accurate, helpful, concise, and clear.",
},
{
role: "user",
content: `Use the following passages to provide an answer to the query: "${query}"\n\n${references}`,
},
]
ということでRich Hickeyが話したことをベースとするChat GPTが出来上がります。なんかそれっぽいことを言ってますね。
実装にあたり困ったこと
API無料枠の問題なのか、頻繁に The server is currently overloaded with other requests
となってしまうので、文章のベクトル化にとても時間がかかってしまいました。より多くの参考資料を用意する場合は注意しましょう(そもそも類似度の比較処理もボトルネックになりそう)。
Discussion