ChatGPT 및 GPT-4와 같은 LLM(대형 언어 모델) 챗봇은 문제가 많이 발생합니다. 특히 찾고 있는 정보가 최근 정보("2024년 슈퍼볼에 대해 알려주세요.")이거나 덜 인기 있는 주제("무슨 일이 일어나고 있나요?")에 관한 정보인 경우에는 더욱 그렇습니다. [좋아하는 외국 감독 삽입]의 볼만한 좋은 영화가 있나요?"). WikiChat은 Wikipedia와 다음 7단계 파이프라인을 사용하여 응답이 사실인지 확인합니다. 번호가 매겨진 각 단계에는 하나 이상의 LLM 호출이 포함됩니다.
자세한 내용은 Sina J. Semnani, Violet Z. Yao*, Heidi C. Zhang* 및 Monica S. Lam의 논문을 확인하세요. 2023. WikiChat: Wikipedia의 Few-Shot Grounding을 통해 대규모 언어 모델 챗봇의 환각 중지. 전산언어학협회 조사 결과: EMNLP 2023, 싱가포르. 전산언어학협회.
(2024년 8월 22일) 이제 WikiChat 2.0을 사용할 수 있습니다! 주요 업데이트는 다음과 같습니다.
이제 텍스트 외에도 테이블, 정보 상자, 목록과 같은 구조화된 데이터에서 검색을 지원합니다.
최고 품질의 공개 Wikipedia 전처리 스크립트 보유
최첨단 다국어 검색 모델 BGE-M3을 사용합니다.
확장 가능한 벡터 검색을 위해 Qdrant를 사용합니다.
RankGPT를 사용하여 검색 결과의 순위를 다시 매깁니다.
다국어 지원: 기본적으로 10개의 다른 Wikipedia에서 정보를 검색합니다. 영어, ?? 중국인, ?? 스페인어, ?? 포르투갈어, ?? 러시아어, ?? 독일어, ?? 페르시아어, ?? 일본어, ?? 프랑스어, 그리고 ?? 이탈리아 사람.
향상된 정보 검색
무료 다국어 위키피디아 검색 API: 우리는 1억 8천만 개가 넘는 벡터 임베딩을 포함하는 10개의 위키피디아에 액세스할 수 있는 고품질의 무료(그러나 속도가 제한된) 검색 API를 제공합니다.
확장된 LLM 호환성: LiteLLM 덕분에 통합 인터페이스를 통해 100개 이상의 LLM을 지원합니다.
최적화된 파이프라인: WikiChat의 "청구 생성" 및 "청구 추출" 단계를 병합하여 더 빠르고 비용 효율적인 파이프라인을 위한 옵션입니다.
LangChain 호환성: LangChain ?️?과 완벽하게 호환됩니다.
그리고 훨씬 더!
(2024년 6월 20일) WikiChat이 2024 Wikimedia Research Award를 수상했습니다!
2024년 @Wikimedia 연구상은 "WikiChat: Wikipedia에 기반을 둔 소수의 대규모 언어 모델 챗봇의 환각 중지"에 수여됩니다.
— 2024년 위키 워크숍(@wikiworkshop) 2024년 6월 20일
? https://t.co/d2M8Qrarkw pic.twitter.com/P2Sh47vkyi
(2024년 5월 16일) 후속 논문 "? SPAGHETTI: 검색 및 의미 분석을 통한 이기종 데이터 소스의 오픈 도메인 질문 답변"이 ACL 2024 조사 결과에 채택되었습니다. 이 논문에서는 테이블, 정보 상자와 같은 구조화된 데이터에 대한 지원을 추가합니다. 그리고 목록.
(2024년 1월 8일) Distilled LLaMA-2 모델이 출시됩니다. 유료 API보다 저렴하고 빠른 대안을 위해 이러한 모델을 로컬에서 실행할 수 있습니다.
(2023년 12월 8일) 우리는 EMNLP 2023에서 우리의 작업을 발표합니다.
(2023년 10월 27일) 우리 논문의 카메라 지원 버전이 이제 arXiv에서 제공됩니다.
(2023년 10월 6일) 우리 논문은 EMNLP 2023 결과에 채택되었습니다.
WikiChat 설치에는 다음 단계가 포함됩니다.
종속성 설치
원하는 LLM을 구성하세요. WikiChat은 OpenAI, Azure, Anthropic, Mistral, HuggingFace, Together.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 메모리가 필요합니다.
먼저 저장소를 복제합니다.
자식 클론 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는 wikichat을 활성화합니다 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 웹사이트의 지침을 따르세요.
WikiChat은 다양한 목적을 위해 호출을 사용하여 사용자 정의 명령을 추가합니다. 사용 가능한 모든 명령과 설명을 보려면 다음을 실행하세요.
--list 호출
또는 약어:
inv -l
특정 명령에 대한 자세한 내용을 보려면 다음을 사용하세요.
inv [명령어 이름] --help
이러한 명령은 task/ 폴더에 구현됩니다.
WikiChat은 OpenAI, Azure, Anthropic, Mistral, Together.ai 및 Groq의 모델을 포함한 다양한 LLM과 호환됩니다. HuggingFace를 통해 로컬로 호스팅되는 많은 모델과 함께 WikiChat을 사용할 수도 있습니다.
LLM을 구성하려면:
llm_config.yaml에서 해당 필드를 입력합니다.
API_KEYS(.gitignore에 포함됨)라는 파일을 만듭니다.
API_KEYS 파일에서 사용하려는 LLM 엔드포인트에 대한 API 키를 설정합니다. API 키의 이름은 api_key 아래의 llm_config.yaml에 제공한 이름과 일치해야 합니다. 예를 들어 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만 사용해보고 싶다면 아무것도 수정할 필요가 없습니다.
2024년 8월 1일자 10개 Wikipedia 언어 색인을 다운로드하세요. 허브 및 추출:
inv 다운로드-wikipedia-index --workdir ./workdir
이 인덱스에는 ~180M 벡터 임베딩이 포함되어 있으므로 최소 500GB의 빈 디스크 공간이 필요합니다. Qdrant의 이진 양자화를 사용하여 정확도나 대기 시간을 희생하지 않고 RAM 요구 사항을 55GB로 줄입니다.
HTTP POST 요청에 응답하는 옵션 1과 유사한 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 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 및 언어는 검색 결과 필터링을 제공하는 데에만 사용됩니다. 필요하지 않은 경우에는 block_type=text 및 언어=en으로 설정하면 됩니다. 스크립트는 임베딩 벡터를 생성하기 위해 임베딩 모델에 full_section_title 및 content_string을 제공합니다.
Wikipedia HTML 덤프에 대해 이것이 어떻게 구현되는지에 대한 자세한 내용은 preprocessing/preprocess_wikipedia_html_dump.py를 참조하세요.
인덱싱 명령을 실행합니다.
inv index-collection --collection-path <전처리된 JSONL의 경로> --collection-name <이름>
이 명령은 ?에 대한 도커 컨테이너를 시작합니다. 텍스트 임베딩 추론(사용 가능한 GPU당 하나). 기본적으로 Ampere 80 아키텍처(예: A100)를 갖춘 NVIDIA GPU와 호환되는 도커 이미지를 사용합니다. 일부 다른 GPU에 대한 지원도 가능하지만 사용 가능한 도커 이미지 중에서 올바른 도커 이미지를 선택해야 합니다.
(선택사항) 페이로드 색인 추가
파이썬 검색/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 '{" query": ["GPT-4는 무엇입니까?", "LLaMA-3은 무엇입니까?"], "num_blocks": 3}'
이 검색기의 URL을 전달하여 WikiChat을 시작하세요. 예를 들어:
inv 데모 --retriever-endpoint "http://0.0.0.0:<포트 번호>/search"
인덱스를 더 작은 부분으로 분할합니다.
tar -cvf -| pigz -p 14 | 분할 --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
다음과 같은 명령을 사용하여 WikiChat의 다양한 구성을 실행할 수 있습니다.
inv 데모 --engine gpt-4o # 엔진은 llm_config에 구성된 모든 값일 수 있습니다(예: mistral-large, claude-sonnet-35, local). inv 데모 --pipeline generate_and_corret # 사용 가능한 파이프라인은 early_combine, generate_and_corret 및retrieve_and_generate입니다. inv 데모 --온도 0.9 # 개선과 같은 사용자가 직면하는 단계의 온도를 변경합니다.
사용 가능한 모든 옵션의 전체 목록을 보려면 inv deco --help를 실행하세요.
이 리포지토리는 Chainlit을 통해 웹 기반 채팅 인터페이스를 배포하고 사용자 대화를 Cosmos DB 데이터베이스에 저장하는 코드를 제공합니다. 이는 각각 backend_server.py 및 Database.py에서 구현됩니다. 다른 데이터베이스나 프런트 엔드를 사용하려면 이러한 파일을 수정해야 합니다. 개발을 위해서는 Cosmos DB에 대한 종속성을 제거하고 대화를 메모리에 저장하는 것이 간단해야 합니다. 예를 들어 다른 LLM을 사용하거나 WikiChat의 단계를 추가/제거하도록 backend_server.py에 정의된 챗봇 매개변수를 구성할 수도 있습니다.
Azure를 통해 인스턴스를 만든 후 연결 문자열을 가져와 API_KEYS에 이 값을 추가합니다.
COSMOS_CONNECTION_STRING=[Cosmos DB 연결 문자열]
이를 실행하면 백엔드 및 프런트엔드 서버가 시작됩니다. 그러면 지정된 포트(기본적으로 5001)에서 프런트엔드에 액세스할 수 있습니다.inv chainlit --backend-port 5001
고품질 RAG 시스템의 프로토타입을 제작하기 위해 이 API 엔드포인트를 사용할 수 있습니다. 전체 사양은 https://wikichat.genie.stanford.edu/search/redoc를 참조하세요.
이 엔드포인트에 대해서는 어떠한 보증도 제공하지 않으며 프로덕션에 적합하지 않습니다.
(곧 출시될 예정입니다...)
우리는 전처리된 Wikipedia를 10개 언어로 공개적으로 출시합니다.
WikiChat 2.0은 출시된 미세 조정된 LLaMA-2 체크포인트와 호환되지 않습니다. 지금은 v1.0을 참고하세요.
챗봇을 평가하려면 사용자 시뮬레이터를 사용하여 대화를 시뮬레이션할 수 있습니다. 하위 집합 매개 변수는 WikiChat 문서에 소개된 세 가지 하위 집합에 해당하는 head, tail 또는 최근 중 하나일 수 있습니다. 사용자의 언어를 지정할 수도 있습니다(WikiChat은 항상 사용자의 언어로 응답합니다). 이 스크립트는 해당 벤치마크/topics/{subset}_articles_{언어}.json 파일에서 주제(예: Wikipedia 제목 및 기사)를 읽습니다. --num-dialogues를 사용하여 생성할 시뮬레이션된 대화 수를 설정하고 --num-turns를 사용하여 각 대화의 회전 수를 지정합니다.
inv 시뮬레이션 사용자 --num-dialogues 1 --num-turns 2 --시뮬레이션 모드 통로 --언어 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의 Few-Shot Grounding을 통해 대규모 언어 모델 챗봇의 환각 중지",author = "Semnani, Sina and Yao, Violet 및 Zhang, Heidi 및 Lam, Monica",편집자 = "Bouamor, Houda 및 Pino, Juan 및 Bali, Kalika",booktitle = "전산 언어학 협회의 조사 결과: EMNLP 2023",월 = 12월, 연도 = "2023",주소 = "싱가포르", 출판사 = "전산 언어학 협회",url = "https://aclanthology.org/2023.findings-emnlp.157",pages = "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 = "전산 언어학 ACL 2024 협회의 조사 결과", 월 = 8월, 연도 = "2024",address = "태국 방콕과 가상 회의",publisher = "전산 언어학 협회",url = "https://aclanthology.org/2024.findings-acl.96",pages = "1663- -1678", }