ChatGPT や GPT-4 などの大規模言語モデル (LLM) チャットボットは、特に探している情報が最近のもの (「2024 年のスーパー ボウルについて教えてください。」) や、あまり人気のないトピックに関するもの (「2024 年のスーパー ボウルについて教えてください。」など) の場合によく起こります。 [あなたの好きな外国人監督を挿入してください] の観るべき良い映画はありますか?」)。 WikiChat は、Wikipedia と次の 7 段階のパイプラインを使用して、応答が事実であることを確認します。番号付きの各ステージには 1 つ以上の LLM 呼び出しが含まれます。
詳細については、Sina J. Semnani、Violet Z. Yao*、Heidi C. Zhang*、Monica S. Lam の論文をご覧ください。 2023. WikiChat: ウィキペディアでの少数ショット グラウンディングによる大規模言語モデル チャットボットの幻覚の停止。計算言語学協会の調査結果: EMNLP 2023、シンガポール。計算言語学協会。
(2024 年 8 月 22 日) WikiChat 2.0 が利用可能になりました。主な更新内容は次のとおりです。
テキストに加えて、テーブル、インフォボックス、リストなどの構造化データからの取得をサポートするようになりました。
最高品質の公開 Wikipedia 前処理スクリプトを備えています
最先端の多言語検索モデルBGE-M3を採用。
スケーラブルなベクトル検索に Qdrant を使用します。
RankGPT を使用して検索結果を再ランク付けします。
多言語サポート: デフォルトでは、10 の異なる Wikipedia から情報を取得します。英語、 ??中国人、??スペイン語、??ポルトガル語、??ロシア人、??ドイツ語、??ペルシア語、??日本語、 ??フランス語、そして??イタリア人。
情報検索の向上
無料の多言語 Wikipedia 検索 API: 1 億 8,000 万以上のベクトル埋め込みを含む 10 の Wikipedia にアクセスするための、高品質で無料 (ただしレート制限あり) の検索 API を提供します。
拡張された LLM 互換性: LiteLLM により、統合インターフェイスを通じて 100 以上の LLM をサポートします。
最適化されたパイプライン: WikiChat の「生成」ステージと「クレームの抽出」ステージを統合することにより、より高速でコスト効率の高いパイプラインを実現するオプション。
LangChain の互換性: LangChain ?️? と完全に互換性があります。
さらにたくさん!
(2024 年 6 月 20 日) WikiChat が 2024 Wikimedia Research Award を受賞しました!
2024 年の @Wikimedia Research Award of the Year は、「WikiChat: ウィキペディアでの数回のグラウンディングによる大規模言語モデルのチャットボットの幻覚の停止」に贈られます ⚡
— ウィキワークショップ2024 (@wikiworkshop) 2024年6月20日
? https://t.co/d2M8Qrarkw pic.twitter.com/P2Sh47vkyi
(2024 年 5 月 16 日) 私たちのフォローアップ論文「? SPAGHETTI: 取得とセマンティック解析を使用した異種データ ソースからのオープンドメイン質問応答」が ACL 2024 の調査結果に受理されました。この論文は、テーブル、インフォボックスなどの構造化データのサポートを追加します。とリスト。
(2024/1/8) LLaMA-2蒸留モデルを発売しました。これらのモデルをローカルで実行すると、有料 API に代わるより安価で高速な代替手段が得られます。
(2023年12月8日) EMNLP 2023で作品を発表します。
(2023 年 10 月 27 日) 私たちの論文のカメラ対応バージョンが arXiv で利用できるようになりました。
(2023年10月06日) 私たちの論文がFindings of EMNLP 2023に採択されました。
WikiChat のインストールには次の手順が含まれます。
依存関係をインストールする
選択した LLM を構成します。 WikiChat は、OpenAI、Azure、Anthropic、Mistral、HuggingFace、Togetter.ai、Groq のモデルを含む 100 以上の LLM をサポートしています。
情報の取得元を選択します。これは、retrieval/retriever_server.py で定義されたインターフェイスに準拠する任意の HTTP エンドポイントにすることができます。次のオプションの手順とスクリプトが提供されています。
10 か国語の Wikipedia 用に、無料のレート制限付き API を使用します。
私たちが提供する Wikipedia インデックスを自分でダウンロードしてホストしてください。
独自のドキュメントから新しいカスタム インデックスを作成して実行します。
希望する構成で WikiChat を実行します。
[オプション] マルチユーザー アクセス用に WikiChat を展開します。シンプルなフロントエンドとバックエンドをデプロイするコードと、会話を保存するために Azure Cosmos DB データベースに接続する手順が提供されます。
このプロジェクトは、Ubuntu 20.04 LTS (Focal Fossa) 上の Python 3.10 でテストされていますが、他の多くの Linux ディストリビューションと互換性があるはずです。これを Windows WSL または macOS で使用する場合、または別の Python バージョンで使用する場合は、インストール中に発生する可能性のあるトラブルシューティングに備えてください。
ハードウェア要件は使用目的によって異なります。
基本的な使用法: LLM API と Wikipedia 検索 API を使用して WikiChat を実行するには、最小限のハードウェア要件が必要で、ほとんどのシステムで動作します。
ローカル検索インデックス: 検索インデックスをローカルでホストする場合は、インデックス用に十分なディスク領域があることを確認してください。大きなインデックスの場合、取得遅延はディスク速度に大きく依存するため、SSD とできれば NVMe ドライブの使用をお勧めします。たとえば、Azure 上の Standard_L8s_v3 などのストレージ最適化 VM がこれに適しています。
ローカル LLM: ローカル LLM で WikiChat を使用する場合は、モデルをホストするために GPU が必要です。
新しい検索インデックスの作成: コレクションにインデックスを付けたい場合は、ドキュメントをベクトルに埋め込むための GPU が必要です。デフォルトの埋め込みモデル (BAAI/BGE-M3) を実行するには、少なくとも 13GB の GPU メモリが必要です。
まず、リポジトリのクローンを作成します。
git クローン https://github.com/stanford-oval/WikiChat.git cd ウィキチャット
conda_env.yaml で指定された conda 環境を使用することをお勧めします。この環境には、Python 3.10、pip、gcc、g++、make、Redis、および必要なすべての Python パッケージが含まれています。
Conda、Anaconda、または Miniconda のいずれかがインストールされていることを確認してください。次に、conda 環境を作成してアクティブ化します。
conda env create --file conda_env.yaml conda ウィキチャットをアクティブにする python -m spacy download en_core_web_sm # Spacy は特定の WikiChat 設定でのみ必要です
チャットボットの実行後に「エラー: Redis ルックアップに失敗しました」が表示された場合は、おそらく Redis が正しくインストールされていないことを意味します。公式ドキュメントに従って再インストールしてみてください。
後続のすべてのコマンドに対して、この環境をアクティブにしておきます。
https://docs.docker.com/engine/install/ の手順に従って、オペレーティング システムに Docker をインストールします。 WikiChat は主に、検索用のベクトル データベースの作成と提供に Docker を使用します。テキスト埋め込み推論と Qdrant。最近の Ubuntu バージョンでは、inv install-docker を実行してみてください。他のオペレーティング システムの場合は、Docker Web サイトの手順に従ってください。
WikiChat は invoke を使用して、さまざまな目的にカスタム コマンドを追加します。使用可能なすべてのコマンドとその説明を表示するには、次を実行します。
--list を呼び出す
または略記:
inv -l
特定のコマンドの詳細については、次を使用します。
inv [コマンド名] --help
これらのコマンドは、tasks/ フォルダーに実装されます。
WikiChat は、OpenAI、Azure、Anthropic、Mistral、Togetter.ai、Groq のモデルを含むさまざまな LLM と互換性があります。 HuggingFace を介して、ローカルでホストされている多くのモデルで WikiChat を使用することもできます。
LLM を設定するには:
llm_config.yaml の適切なフィールドに入力します。
API_KEYS という名前のファイルを作成します (.gitignore に含まれています)。
API_KEYS ファイルで、使用する LLM エンドポイントの API キーを設定します。 API キーの名前は、llm_config.yaml の api_key に指定した名前と一致する必要があります。たとえば、openai.com および Mistral エンドポイント経由で OpenAI モデルを使用している場合、API_KEYS ファイルは次のようになります。
# API キーを使用して次の値を入力します。キーの後に余分なスペースがないことを確認してください。# このファイルへの変更は git によって無視されるため、開発中にキーをここに安全に保存できます。OPENAI_API_KEY=[https://platform.openai.com/ からの OpenAI API キーAPIキー] MISTRAL_API_KEY=[https://console.mistral.ai/api-keys/ からの Mistral API キー]
ローカルでホストされるモデルには API キーは必要ありませんが、api_base で OpenAI 互換のエンドポイントを提供する必要があることに注意してください。コードは ? でテストされています。テキスト生成推論。
デフォルトでは、WikiChat は https://wikichat.genie.stanford.edu/search/ のエンドポイントを介して 10 の Wikipedia から情報を取得します。 WikiChat を試してみたいだけの場合は、何も変更する必要はありません。
ウィキペディア 10 言語の 2024 年 8 月 1 日のインデックスを、? からダウンロードします。ハブにして抽出します。
inv ダウンロード-wikipedia-index --workdir ./workdir
このインデックスには約 1 億 8,000 万のベクトル埋め込みが含まれているため、少なくとも 500 GB の空のディスク領域が必要であることに注意してください。 Qdrant のバイナリ量子化を使用して、精度や遅延を犠牲にすることなく RAM 要件を 55 GB に削減します。
オプション 1 と同様に、HTTP POST リクエストに応答する FastAPI サーバーを起動します。
inv start-retriever --embedding-model BAAI/bge-m3 --retriever-port <ポート番号>
この取得者の URL を渡して WikiChat を開始します。例えば:
inv デモ --retriever-endpoint "http://0.0.0.0:<ポート番号>/search"
このサーバーとその組み込みモデルは CPU 上で実行され、GPU を必要としないことに注意してください。パフォーマンスを向上させるために、互換性のあるシステムで --use-onnx を追加して ONNX バージョンの埋め込みモデルを使用し、埋め込み遅延を大幅に短縮できます。
次のコマンドは、クルド語 Wikipedia の最新の HTML ダンプをダウンロード、前処理、およびインデックス付けします。この例では、サイズが比較的小さいためこれを使用します。
inv インデックス-wikipedia-dump --embedding-model BAAI/bge-m3 --workdir ./workdir -- language ku
データを前処理して、各行に次のフィールドが含まれる JSON Lines ファイル (ファイル拡張子は .jsonl または .jsonl.gz 付き) にします。
{"id": "integer", "content_string": "string", "article_title": "string", "full_section_title": "string", "block_type": "string", " language": "string", " last_edit_date": "文字列 (オプション)"、"num_tokens": "整数 (オプション)"}
content_string は、ドキュメントのチャンク化されたテキストである必要があります。埋め込みモデルのトークナイザーのトークンを 500 未満に分割することをお勧めします。チャンク メソッドの概要については、これを参照してください。block_type と language は、検索結果のフィルタリングを提供するためにのみ使用されます。それらが必要ない場合は、単純に block_type=text および language=en に設定できます。スクリプトは、full_section_title と content_string を埋め込みモデルにフィードして、埋め込みベクトルを作成します。
これが Wikipedia HTML ダンプにどのように実装されるかについて詳しくは、preprocessing/preprocess_wikipedia_html_dump.py を参照してください。
インデックス作成コマンドを実行します。
inv Index-collection --collection-path <前処理された JSONL へのパス> --collection-name <名前>
このコマンドは、? の docker コンテナを起動します。テキスト埋め込み推論 (利用可能な GPU ごとに 1 つ)。デフォルトでは、Ampere 80 アーキテクチャの NVIDIA GPU (A100 など) と互換性のある Docker イメージを使用します。他の一部の GPU のサポートも利用できますが、利用可能な Docker イメージから適切な Docker イメージを選択する必要があります。
(オプション) ペイロードインデックスを追加します
Python 取得/add_payload_index.py
これにより、言語または block_type でフィルタリングするクエリが有効になります。大規模なインデックスの場合、インデックスが再び使用可能になるまでに数分かかる場合があることに注意してください。
インデックス作成後、オプション 2 のようにインデックスをロードして使用します。次に例を示します。
inv start-retriever --embedding-model BAAI/bge-m3 --retriever-port <ポート番号>curl -X POST 0.0.0.0:5100/search -H "Content-Type: application/json" -d '{"クエリ": ["GPT-4 とは何ですか?", "LLaMA-3 とは何ですか?"], "num_blocks": 3}'
この取得者の URL を渡して WikiChat を開始します。例えば:
inv デモ --retriever-endpoint "http://0.0.0.0:<ポート番号>/search"
インデックスをより小さな部分に分割します。
tar -cvf -|ピグズ-p 14 | Split --bytes=10GB --numeric-suffixes=0 --suffix-length=4 - <出力フォルダーへのパス>/qdrant_index.tar.gz.part-
結果のパーツをアップロードします。
python retrieval/upload_folder_to_hf_hub.py --folder_path <出力フォルダーへのパス> --repo_id <リポジトリ ID ?ハブ>
次のようなコマンドを使用して、WikiChat のさまざまな構成を実行できます。
invデモ --engine gpt-4o # エンジンには、llm_config で設定された任意の値を指定できます。たとえば、mistral-large、claude-sonnet-35、local invデモ --pipelinegenerate_and_correct # 利用可能なパイプラインは、early_combine、generate_and_correct、retrieve_and_generate です invデモ --temperature 0.9 # ユーザー向けステージの温度をリファインメントのように変更します
利用可能なすべてのオプションの完全なリストを表示するには、inv Demon --help を実行します。
このリポジトリは、Chainlit 経由で Web ベースのチャット インターフェイスをデプロイし、ユーザーの会話を Cosmos DB データベースに保存するためのコードを提供します。これらは、それぞれ backend_server.py と database.py に実装されています。他のデータベースまたはフロントエンドを使用する場合は、これらのファイルを変更する必要があります。開発の場合、Cosmos DB への依存関係を削除し、会話をメモリに保存するだけで済むはずです。たとえば、別の LLM を使用したり、WikiChat のステージを追加/削除したりするために、backend_server.py で定義されたチャットボット パラメーターを構成することもできます。
Azure 経由でインスタンスを作成した後、接続文字列を取得し、この値を API_KEYS に追加します。
COSMOS_CONNECTION_STRING=[Cosmos DB 接続文字列]
これを実行すると、バックエンド サーバーとフロントエンド サーバーが起動します。これで、指定したポート (デフォルトでは 5001) でフロントエンドにアクセスできるようになります。invchainlit --backend-port 5001
この API エンドポイントを使用して、高品質の RAG システムのプロトタイプを作成できます。完全な仕様については、https://wikichat.genie.stanford.edu/search/redoc を参照してください。
このエンドポイントについてはいかなる保証も提供しておらず、運用環境には適していないことに注意してください。
(近日公開...)
前処理された Wikipedia を 10 か国語で公開します。
WikiChat 2.0 は、リリースされた微調整された LLaMA-2 チェックポイントと互換性がありません。現時点ではv1.0を参照してください。
チャットボットを評価するには、ユーザー シミュレーターを使用して会話をシミュレートできます。サブセット パラメーターは、WikiChat 論文で紹介されている 3 つのサブセットに対応する、head、tail、recent のいずれかになります。ユーザーの言語を指定することもできます (WikiChat は常にユーザーの言語で応答します)。このスクリプトは、対応する Benchmark/topics/{subset}_articles_{ language}.json ファイルからトピック (つまり、Wikipedia のタイトルと記事) を読み取ります。 --num-dialogues を使用して生成するシミュレートされたダイアログの数を設定し、--num-turns を使用して各ダイアログのターン数を指定します。
inv Simulate-users --num-dialogues 1 --num-turns 2 --simulation-mode Passage -- language en --subset head
使用しているエンジンによっては、時間がかかる場合があります。シミュレートされたダイアログとログ ファイルは、benchmark/simulated_dialogues/ に保存されます。上記のパイプライン パラメーターのいずれかを指定することもできます。 Benchmark/user_simulator.py の user_characteristics を変更することで、さまざまなユーザー特性を試すことができます。
WikiChat コード、モデル、データは、Apache-2.0 ライセンスに基づいてリリースされています。
このリポジトリのコードまたはデータを使用した場合は、次の論文を引用してください。
@inproceedings{semnani-etal-2023-wikichat,title = "{W}iki{C}hat: {W}ikipedia での少数ショット接地による大規模言語モデル チャットボットの幻覚の阻止",author = "Semnani、Sina、ヤオ、バイオレットとチャン、ハイジとラム、モニカ"、編集者 = "ブアモル、フーダとピノ、フアンとバリ、カリカ"、本のタイトル = "計算言語学協会の調査結果: EMNLP 2023"、月 = 12 月、年 = "2023"、住所 = "シンガポール"、出版社 = "計算言語学協会"、url = "https://aclanthology.org/2023.findings-emnlp.157"、ページ = "2387--2413"、 }@inproceedings{zhang-etal-2024-spaghetti,title = "{SPAGHETTI}: 検索とセマンティック解析による異種データ ソースからのオープン ドメインの質問回答",author = "Zhang、Heidi と Semnani、Sina と Ghassemi、Farhad、 Xu、Jialiang、Liu、Shicheng、Lam、Monica"、編集者 = "Ku、Lun-Wei、Martins、Andre、Srikumar、Vivek"、booktitle = "Findinging of the Association for Computational Linguistics ACL 2024"、month = 8 月、年= "2024"、住所 = "タイ、バンコクと仮想会議"、出版社 = "計算言語学協会"、url = "https://aclanthology.org/2024.findings-acl.96"、ページ = "1663- -1678"、 }