作成日: 2024年5月2日(水)
1.はじめに
Chatbot UIはVersion 2.0.0がリリースされていますが、本番稼働させるには少しリスクが高いため、安定板を使用してRAG(Retrieval-Augmented Generation)を用いて知識データベースの内容をベクトル検索して、LLM(Learge Language Model)に回答をさせようと考えました。
その際、Chatbot UIはlegacy版のできるだけ新しいものを使おうと思い、Mckay Wrigley氏によって作成されたChatbot UIのlegacyブランチ(2023/04/05 1:09:19最終コミット)を用いてローカル環境でChatbot UI legacyを起動させてみたのですが、「モデルの取得中にエラーが発生しました。」というエラーとなり動作しませんでした。
この記事ではChatbot UI 2023年04月20日版にできるだけ近いバージョンを構築して、回答が途切れる問題の対策、gpt-35-turbo-16kモデルの対応までをまとめます。
Chatbot UI legacy braunch
**モデルの取得中にエラーが発生しました。**
OpenAIのAPIキーがサイドバーの左下に設定されていることを確認してください。
このステップを完了した場合、OpenAIに問題が発生している可能性があります。
Q:\OneDrive\Git\chatbot-ui>npm run dev
> ai-chatbot-starter@0.1.0 dev
> next dev
ready - started server on 0.0.0.0:3000, url: http://localhost:3000
info - Loaded env from Q:\OneDrive\Git\chatbot-ui\.env.local
Browserslist: caniuse-lite is outdated. Please run:
npx update-browserslist-db@latest
Why you should do it regularly: https://github.com/browserslist/update-db#readme
event - compiled client and server successfully in 2.8s (233 modules)
wait - compiling...
event - compiled successfully in 329 ms (194 modules)
wait - compiling / (client and server)...
event - compiled client and server successfully in 6.5s (5469 modules)
wait - compiling /api/models (client and server)...
event - compiled successfully in 200 ms (43 modules)
wait - compiling...
event - compiled successfully in 0 ms (43 modules)
wait - compiling...
event - compiled successfully in 0 ms (43 modules)
**OpenAI API returned an error 404: {"error":{"code":"404","message": "Resource not found"}}
[Error: OpenAI API returned an error]**
OpenAI API returned an error 404: {"error":{"code":"404","message": "Resource not found"}}
[Error: OpenAI API returned an error]
コンソールメッセージ
2.情報収集
「モデルの取得中にエラーが発生しました。」というエラーは2023年5月15日にAzure OpenAIのAPI仕様が変わったときにも発生したエラーでKentatoAOKI氏によりPull Requests #936でCloseされていますが、マージはされていません。
実際にlegacyブランチのpages/api/models.tsとutils/server/index.tsを見てみるとAzureの新API仕様に対応されているようには見えません。
3.動作しない原因
Mckay Wrigley氏によって作成されたChatbot UIのlegacyブランチは2023/04/05 1:09:19のコミットをベースに作成されており、Azureで動作させるのに欠かせない#936の対応が含まれていないことが分かりました。
Discussionsの「Chatbot-UI legacy #1496」で2023年4月4日以降、2023年4月20日の「add Finnnish translations #618」までのコミットがlegacyに含まれていないため、Mckay Wrigley氏にコミットをお願いしている投稿がありましたが、Mckay Wrigley氏はこれに反応していませせん。
やむを得ず、2023年4月20日のコミットをベースに差分を吸収しようと思いましたが、mainブランチは2024年1月9日に一掃されており2023年4月4日~2023年4月20日のコミットを見つけられませんでした。
2023年4月20日の最後のコミットはAzureの新APIに対応できていなかったり、応答が1000トークンで中断される不具合がありましたが、比較的安定板だったので、ととも残念です。
4.forkからfork
幸いにもPull Request #936でAzureの新API対策を行ったKentaroAOKI氏がPull Requestのためにforkを作成していますので、今回はこのforkをベースにLLMの修正と応答が1000トークンで切れる問題の差分吸収をしていきます。
No | 区分 | リポジトリ | ブランチ | 備考 |
---|---|---|---|---|
1 | fork元 | https://github.com/KentaroAOKI/chatbot-ui/ | feature-supports-azure-openai-api-2023-05-15-or-later | 23/5/15のAzureでのAPI仕様変更に対応 |
2 | fork先 | https://github.com/potofo/chatbot-ui/ | feature-supports-azure-openai-api-2023-05-15-or-later |
※リポジトリをforkしていますのでブランチの記載はメモ程度の意味です。
https://github.com/KentaroAOKI/chatbot-ui/には以下のOpenAI API仕様変更に対策が含まれています。
5.安定板ブランチの作成
forkしたリポジトリとブランチから作業用のブランチを作成します。
No | 区分 | リポジトリ | ブランチ | 備考 |
---|---|---|---|---|
1 | ブランチ元 | https://github.com/potofo/chatbot-ui/ | feature-supports-azure-openai-api-2023-05-15-or-later | |
2 | ブランチ先 | https://github.com/potofo/chatbot-ui/ | fixed |
6.取り込む対策
No | 区分 | 題名 | 内容 | 備考 |
---|---|---|---|---|
1 | Issues | https://github.com/mckaywrigley/chatbot-ui/issues/316 | chatbot UIからの応答が無条件に1,000トークン付近で切れてしまう問題の対策です。 utils/server/index.tsのmax_tokensをUIで変更できないか(デフォルトで1,000に固定されているため、LLMからの応答が1,000トークン毎に切れてしまう。)「続けてください」と入力することで回避は可能だがかなり面倒 | 2024年1月10日にVer2.0.0にマージされているようです。 |
2 | Azure OpenAI gpt-35-turbo-16k | Azure OpenAIのgpt-35-turbo-16kモデルの追加 | types/openai.tsにAzure OpenAIのgpt-35-turbo-16k、gpt-4、gpt-4-32kを追加しています。これによりモデルの切り替えも可能です。 | |
3 | SyntaxError: Unexpected token 'D', "[DONE]" is not valid JSON | https://github.com/mckaywrigley/chatbot-ui/issues/580 | LLMからの非同期応答時に最後にJSONの代わりに文字列の”[DONE]”が応答される仕様ですが、utils/server/index.tsの93行目付近のtryが文字列の”[DONE]”に対応できずにSentax Errorで実行時エラーとなってしますため、dataが”[DONE]”以外の場合だけ処理するようにする |
7.動作確認
## 7.動作確認
gpt-35-turbo-16kで「生成AIについて10,000文字以上でブログ記事を書いてください。」というプロンプトでで2018文字の応答を途切れず生成
max_tokens: 1000をコメントアウトしないと989文字で応答が途切れてしまいました。
途切れた場合でも「続けてください」と入力すると続きは出力してくれますが、これは面倒です。