2023/2/21 Scrapboxの内容を元にしたチャットbotを実装する
2023/2/21
実装が見えてモチベが沸いているので、この勢いで実装したいblu3mo.icon
実況していく(?)
既存の議論
GPT-3/ChatGPTでScrapboxの中身を元に回答を生成
GPTIndexにScrapboxの内容を突っ込んで遊ぶ
OperandでObsidian Vaultを検索
AIクオリアさんを井戸端に生成する
Bing AIで特定のScrapboxの内容を元に質問に回答
LangChain Chat
何を作るか
ユーザーがPromptを投げると、特定のScrapboxプロジェクトの内容を読み込んで、その内容を元に文章を生成する
Promptが質問であれば、回答を生成する
Promptが「要約してくれ」であれば、要約を生成する
Promptが「XXを書いてくれ」であれば、文章の内容を元にそれを生成する
Promptが「XXの話をしているページなんだっけ」であれば、そのページを見つけてくる
GPT-3のAPI Keyを突っ込めば動くWebサイトとして作る
Reactのフロントエンドだけで動きそう
なるほどnishio.icon
Mem, Operandなど英語ツールとかで出来ていることを、Scrapbox/日本語でやりたいblu3mo.icon
実装方法
GPT-3に渡す適切なScrapboxの内容をどう選ぶかがむずい
LangChain Chat のしくみ|npaka|note
https://assets.st-note.com/img/1676524237894-7VDUzEGA8S.png?width=2000&height=2000&fit=bounds&quality=85
文書をベクトル化したものを使っている
これをforkするかなblu3mo.icon
TextSplitterを、Scrapboxに対応させたい
現状、Markdownとかの構造を読んでいい感じに分割するようになっている
これを、Scrapboxでもできるようにしたいblu3mo.icon
Embeddingにも、OpenAIのAPIを使っているみたいblu3mo.icon
https://langchain.readthedocs.io/en/latest/modules/indexes/examples/embeddings.html
価格: $0.0004 / 1K tokens
2000 token/pageだと見積もったら、一万ページのembeddingに大体1000円かかる
まあそんなオーダーか、耐えそう
/blu3mo-publicを素朴なTextSplitterにかけてembeddingしたら、100円くらいだったblu3mo.icon
GitHub - minosvasilias/toolformer-zero: React app implementing OpenAI and Google APIs to re-create behavior of the toolformer paper.
Google Programmable SearchAPiを使っている
試しにsite:scrapbox.io/blu3mo-public 質問で検索すると良さそうな結果が出る
ので、悪く無いかも
というかBing AIで大体いける説はある
site:scrapbox.io/blu3mo-public の内容のみを参照して答えてください。と伝えた上で質疑をすれば良さそう
ただ、Scrapboxのリンク構造を読ませるなどもやってみたいので、似たものを再実装したい
あと、LangChainをScrapboxに最適化したい
GitHub - namuan/dr-doc-search: Converse with book - Built with GPT-3
GitHub - hwchase17/notion-qa
Langchainの人が最初に作ったやつ
これのScrapbox版をやりたい
2023/3/3
langchain chatをベースにscrapbox対応していく
対応にあたって、二つものが必要blu3mo.icon
1. Scrapbox対応のDocumentLoader
Evernote, Google Drive, Notion, Obsidian, PDF, .... など色々な形式のためのDocument Loaderが用意されている
https://github.com/hwchase17/langchain/tree/master/langchain/document_loaders
残念ながらScrapboxはないので、自力で作る
これはjsonを読むだけ
2. Scrapbox対応のTextSplitter
単純に文字数で分割、MarkDownの形式にそっていいところで分割、Pythonコードのいいところで分割、などのパターンが用意されている
https://github.com/hwchase17/langchain/blob/master/langchain/text_splitter.py
残念ながらScrapboxの箇条書き対応はない
Scrapboxの文章はLLMにも読みやすいのではという仮説があって、Scrapbox対応のTextSplitterをうまく作ればそれができるはず
@blu3mo: Scrapboxプロジェクト(/blu3mo-public)をGPT-3に食わせてチャットをやってみた
一部トンチンカンだけど、ちゃんとScrapboxの内容を元に答えられている
https://gyazo.com/08634c49ca5a56f310093a1d8cd6739ehttps://gyazo.com/8c0d904063cca26042390b1ddc93ef67
とりあえずできたblu3mo.icon
改善事項
現状毎回4チャンクだけ文章を取ってきているが、渡せるtokenいっぱいまで渡したい
Scrapboxの文章はLLMにも読みやすいのではに書いた、箇条書き最適なTextSplitterを作る
https://github.com/blu3mo/scrapchat
scrapchat
2023/3/5
与えた情報を絶対に使おうとしてつぎはぎな答えを出してきて微妙なので、promptをいじったblu3mo.icon
If any of the above is not relevant, you can ignore it.
promptを少しいじっただけで、結構挙動がよくなった気がするblu3mo.icon
(ちゃんと検証していないけど、感覚として)
つぎはぎ感が結構減った
ちなみにこのPromptはGitHub Copilotが書いてくれた
なんて書こうかな〜と迷っていたらスッと欲しいものをCopilotが出してくれた
マジかwwwnishio.icon
プロンプトもプログラミング言語もCopilotに取っては違いはない、と!
https://gyazo.com/93c6e7a54f15344f49b16d8dff56b046 https://gyazo.com/5f8a7a73e435b4f719195df3bef2dc27
いい感じblu3mo.icon
デプロイしたい
deta cloudとvercelはダメだった
numpyとかみたいな重めのライブラリが色々必要で、容量オーバー
ガーン、vercelでやろうとしてたnishio.icon
herokuはいけるかも
https://scrapchat.herokuapp.com/
まだちゃんと動いていないな
うーん、、、
ERROR:root:IndexFlat.search() missing 3 required positional arguments: 'k', 'distances', and 'labels'
質問を送ると、このエラーが出る
langchainがfaiss(ベクトル検索ライブラリ)を呼ぶ時にエラーが出ているみたい
python verもライブラリのバージョンも全て合わせたのに、localとHerokuで何かが違うみたい
うーん、一番可能性が高いのは「全て合わせたつもりだけど合ってなかった」な気がするnishio.icon
わからんので一旦放置
英語でもちゃんと動作する
Scrapbox内で日本語で説明した内容について、英語で答えてくれる
https://gyazo.com/de6bf9fd754ae42de4cd8897e02e87ff
これはScrapboxはページ翻訳ができない問題の解決に繋がりそうblu3mo.icon*2
続きはScrapbox ChatGPT Connector by nishio.icon
こっちはlangchainを使っていない