像ChatGPT 和GPT-4 這樣的大型語言模型(LLM) 聊天機器人經常會出錯,特別是如果您正在查找的資訊是最新的(「告訴我關於2024 年超級盃」)或不太受歡迎的主題( 「2024 年超級盃」))。 WikiChat 使用維基百科和以下 7 個階段管道來確保其回應是真實的。每個編號的階段涉及一個或多個 LLM 呼叫。
請查看我們的論文以了解更多詳細資訊:Sina J. Semnani、Violet Z. Yao*、Heidi C. Zhu* 和 Monica S. Lam。 2023. WikiChat:透過維基百科上的少鏡頭基礎來停止大型語言模型聊天機器人的幻覺。計算語言學協會的調查結果:EMNLP 2023,新加坡。計算語言學協會。
(2024 年 8 月 22 日)WikiChat 2.0 現已推出!主要更新包括:
除了文字之外,現在還支援從結構化資料(例如表格、資訊框和清單)中進行檢索。
擁有最高品質的公共維基百科預處理腳本
使用最先進的多語言檢索模型 BGE-M3。
使用 Qdrant 進行可擴展向量搜尋。
使用 RankGPT 對搜尋結果重新排名。
多語言支援:預設情況下,從 10 個不同的維基百科檢索資訊:??英語, ?中國人, ?西班牙語, ?葡萄牙語,??俄語,??德國人,??波斯語,??日本人, ?法語,還有?義大利語。
改進的資訊檢索
免費多語言維基百科搜尋 API:我們提供高品質、免費(但有速率限制)的搜尋 API,用於存取 10 個維基百科,包含超過 1.8 億個向量嵌入。
擴充的 LLM 相容性:借助 LiteLLM,透過統一介面支援 100 多個 LLM。
優化的管道:透過合併 WikiChat 的「生成」和「提取聲明」階段,可以選擇更快、更具成本效益的管道。
LangChain相容性:與LangChain完全相容??️?。
還有更多!
(2024年6月20日)WikiChat榮獲2024年維基媒體研究獎!
2024 年 @Wikimedia 年度研究獎頒給了「WikiChat:透過維基百科的幾次嘗試來阻止大型語言模型聊天機器人的幻覺」⚡
— 2024 年維基研討會 (@wikiworkshop) 2024 年 6 月 20 日
? https://t.co/d2M8Qrarkw pic.twitter.com/P2Sh47vkyi
(2024 年5 月16 日)我們的後續論文「? SPAGHETTI: Open-Domain Question Answering from Heterogeneous Data Sources with Retrieval and Semantic Parsing」被ACL 2024 的結果接受。化數據的支援和列表。
(2024 年 1 月 8 日)蒸餾 LLaMA-2 模型發表。您可以在本機上運行這些模型,以更便宜、更快速的方式取代付費 API。
(2023 年 12 月 8 日)我們在 EMNLP 2023 上展示我們的工作。
(2023 年 10 月 27 日)我們論文的相機版本現已在 arXiv 上提供。
(2023年10月6日)我們的論文被EMNLP 2023的結果接受。
安裝 WikiChat 涉及以下步驟:
安裝依賴項
配置您選擇的法學碩士。 WikiChat 支援超過 100 個 LLM,包括來自 OpenAI、Azure、Anthropic、Mistral、HuggingFace、Together.ai 和 Groq 的模型。
選擇資訊檢索來源。這可以是符合retrieve/retriever_server.py 中定義的介面的任何HTTP 端點。我們提供以下選項的說明和腳本:
使用我們免費、限速的 10 種語言維基百科 API。
自行下載並託管我們提供的維基百科索引。
從您自己的文件建立並執行新的自訂索引。
使用您所需的配置來運行 WikiChat。
[可選] 部署 WikiChat 以進行多用戶存取。我們提供部署簡單前端和後端的程式碼,以及連接到 Azure Cosmos DB 資料庫以儲存對話的說明。
該專案已在 Ubuntu 20.04 LTS (Focal Fossa) 上使用 Python 3.10 進行了測試,但它應該與許多其他 Linux 發行版相容。如果您打算在 Windows WSL 或 macOS 上使用它,或使用不同的 Python 版本,請準備好在安裝過程中進行潛在的故障排除。
硬體需求根據您的預期用途而有所不同:
基本用法:使用 LLM API 和我們的維基百科搜尋 API 來運行 WikiChat 的硬體需求最低,並且應該適用於大多數系統。
本機搜尋索引:如果您打算在本機託管搜尋索引,請確保有足夠的磁碟空間進行索引。對於大型索引,檢索延遲在很大程度上取決於磁碟速度,因此我們建議使用 SSD,最好使用 NVMe 磁碟機。例如,Azure 上的 Standard_L8s_v3 等儲存最佳化型 VM 就適合於此。
本機 LLM:如果您打算將 WikiChat 與本機 LLM 一起使用,則需要 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 建立 --檔案 conda_env.yaml conda 啟動維基聊天 python -m spacy download en_core_web_sm # 僅某些 WikiChat 設定需要 Spacy
如果執行聊天機器人後看到錯誤:Redis 查找失敗,可能表示 Redis 未正確安裝。您可以按照官方文件嘗試重新安裝。
對於所有後續命令,請保持此環境處於啟動狀態。
請依照 https://docs.docker.com/engine/install/ 中的說明為您的作業系統安裝 Docker。 WikiChat 主要使用 Docker 建立和提供用於檢索的向量資料庫,具體來說?文本嵌入推理和 Qdrant。在最新的 Ubuntu 版本上,您可以嘗試執行 inv install-docker。對於其他作業系統,請按照 docker 網站上的說明進行操作。
WikiChat 使用呼叫來新增用於各種目的的自訂命令。若要查看所有可用命令及其描述,請執行:
呼叫--列表
或簡寫:
反相-l
有關特定命令的更多詳細信息,請使用:
inv [指令名稱] --help
這些命令在tasks/資料夾中實作。
WikiChat 與各種 LLM 相容,包括 OpenAI、Azure、Anthropic、Mistral、Together.ai 和 Groq 的模型。您也可以透過 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 金鑰填寫以下值。確保密鑰後沒有多餘的空格。的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 個維基百科檢索資訊。如果您只想嘗試 WikiChat,則無需修改任何內容。
從 ? 下載 2024 年 8 月 1 日 10 種維基百科語言的索引?集線器並提取它:
inv 下載維基百科索引 --workdir ./workdir
請注意,索引包含約 180M 向量嵌入,因此需要至少 500 GB 的空磁碟空間。它使用 Qdrant 的二進制量化將 RAM 要求降低至 55 GB,而不會犧牲準確性或延遲。
啟動類似選項 1 的 FastAPI 伺服器來回應 HTTP POST 請求:
inv start-retriever --embedding-model BAAI/bge-m3 --retriever-port <連接埠號碼>
透過傳入此檢索器的 URL 來啟動 WikiChat。例如:
inv demo --retriever-endpoint "http://0.0.0.0:<連接埠號碼>/search"
請注意,該伺服器及其嵌入模型在 CPU 上運行,不需要 GPU。為了獲得更好的效能,在相容系統上,您可以新增 --use-onnx 以使用 ONNX 版本的嵌入模型,以顯著降低嵌入延遲。
以下命令將下載、預處理庫德維基百科的最新 HTML 轉儲並為其建立索引,我們在本範例中使用它是因為它的大小相對較小。
inv index-wikipedia-dump --embedding-model BAAI/bge-m3 --workdir ./workdir --語言 ku
將資料預處理為 JSON Lines 檔案(檔案副檔名為 .jsonl 或 .jsonl.gz),每行都具有以下欄位:
{“id”:“整數”,“content_string”:“字串”,“article_title”:“字串”,“full_section_title”:“字串”,“block_type”:“字串”,“語言”:“字串”,“ last_edit_date": "字串(可選)", "num_tokens": "整數(可選)"}
content_string 應該是文件的分割文字。我們建議將嵌入模型的分詞器分塊到少於 500 個分詞。有關分塊方法的概述,請參閱此內容。如果不需要它們,只需將它們設為 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 一個)。預設情況下,它使用與Ampere 80架構的NVIDIA GPU相容的docker映像,例如A100。也可以支援其他一些 GPU,但您需要從可用的 docker 映像中選擇正確的 docker 映像。
(可選)新增負載索引
python 檢索/add_payload_index.py
這將啟用根據語言或區塊類型進行過濾的查詢。請注意,對於大型索引,索引可能需要幾分鐘才能再次可用。
建立索引後,請按照選項 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 '{" query": ["GPT-4 是什麼? ", "LLaMA-3 是什麼?
透過傳入此檢索器的 URL 來啟動 WikiChat。例如:
inv demo --retriever-endpoint "http://0.0.0.0:<連接埠號碼>/search"
將索引分成更小的部分:
tar -cvf -|豬Z-P 14 | split --bytes=10GB --numeric-suffixes=0 --suffix-length=4 - <輸出資料夾的路徑>/qdrant_index.tar.gz.part-
上傳產生的部分:
python檢索/upload_folder_to_hf_hub.py --folder_path <輸出資料夾的路徑> --repo_id
您可以使用以下命令運行 WikiChat 的不同配置:
inv demo --engine gpt-4o # 引擎可以是 llm_config 中配置的任何值,例如,mistral-large、claude-sonnet-35、local inv demo --pipelinegenerate_and_ Correct # 可用的管道有early_combine、generate_and_ Correct和retrieve_and_generate inv demo --Temperature 0.9 # 改變使用者導向的階段的溫度,如細化
有關所有可用選項的完整列表,您可以運行 inv demo --help
該儲存庫提供了透過 Chainlit 部署基於 Web 的聊天介面的程式碼,並將使用者對話儲存到 Cosmos DB 資料庫中。這些分別在 backend_server.py 和 database.py 中實作。如果要使用其他資料庫或前端,則需要修改這些檔案。對於開發來說,應該很簡單地消除對 Cosmos DB 的依賴,並將對話簡單地儲存在記憶體中。您也可以設定 backend_server.py 中定義的聊天機器人參數,例如使用不同的 LLM 或新增/刪除 WikiChat 的階段。
透過Azure建立實例後,取得連接字串並將該值加入API_KEYS。
COSMOS_CONNECTION_STRING=[您的 Cosmos DB 連接字串]
運行此命令將啟動後端和前端伺服器。然後就可以在指定連接埠(預設為5001)存取前端。
您可以使用此 API 端點來建立高品質 RAG 系統的原型。請參閱 https://wikichat.genie.stanford.edu/search/redoc 以了解完整規格。
請注意,我們不提供有關此端點的任何保證,並且它不適合生產。
(即將推出...)
我們公開發布 10 種語言的預處理維基百科。
WikiChat 2.0 與已發佈的微調 LLaMA-2 檢查點不相容。目前請參考v1.0。
要評估聊天機器人,您可以使用使用者模擬器模擬對話。子集參數可以是head、tail或recent之一,對應WikiChat論文中介紹的三個子集。您也可以指定使用者的語言(WikiChat 始終以使用者的語言回應)。腳本從對應的 benchmark/topics/{subset}_articles_{language}.json 檔案中讀取主題(即維基百科標題和文章)。使用 --num-dialogues 設定要產生的模擬對話的數量,使用 --num-turns 指定每個對話的回合數。
inv模擬使用者--num-dialogues 1--num-turns 2--模擬模式通道--語言en--子集頭
根據您使用的引擎,這可能需要一些時間。模擬對話和日誌檔案將保存在 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的Few-Shot基礎來停止大型語言模型聊天機器人的幻覺”,author =“Semnani,新浪和Yao、Violet 和張、Heidi 和Lam、Monica”,編輯=“Bouamor、Houda 和Pino、Juan 和Bali、Kalika”,書名=“計算語言學協會的調查結果: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, Shi Cheng 和Lam, Monica”,編輯=“Ku,Lun-Wei 和Martins,Andre 和Srikumar,Vivek”,書名=“計算語言學協會ACL 2024 年的調查結果”,月=八月,年=“2024”,地址=“泰國曼谷和虛擬會議”,發布者=“計算語言學協會”,url =“https://aclanthology.org/2024.findings-acl.96”,pages =“1663- -1678", }