이 소규모 프로젝트는 검색 증강 생성(RAG) 기술을 활용하는 지식 기반에 WordPress 블로그 항목을 통합하는 것을 목표로 합니다.
이 프로젝트의 전제는 간단합니다. 일련의 스크립트가 명령줄을 통해 특정 작업을 수행한다는 것입니다. 각 스크립트는 자체 포함되어 있어 상대적으로 간단하게 자체 컨텍스트 내에서 각 작업을 보여 주는 데 도움이 됩니다.
기본적으로 포함된 스크립트는 무료 오픈 소스 라이브러리와 모델을 사용하지만 액세스 권한이 있는 경우 OpenAI의 LLM을 사용하는 옵션을 사용할 수 있습니다. 이 예제는 호환되는 GPU가 없고 YMMV가 있는 경우 CPU에서 실행될 수 있습니다.
RAG는 검색 시스템과 생성 언어 모델이라는 두 가지 구성 요소를 사용합니다. 검색 시스템은 데이터 저장소/지식 기반(예: 블로그 게시물 모음)의 쿼리와 관련된 문서를 쿼리합니다. 그런 다음 검색된 문서는 언어 모델에 입력되어 사용자에게 정보에 근거한 응답을 생성합니다. RAG를 사용하는 주요 이점 중 하나는 AI 시스템을 미세 조정이나 재훈련 없이도 훈련 데이터 이상으로 확장할 수 있다는 것입니다. 즉, 데이터 저장소에서 데이터를 동적으로 추가하고 업데이트할 수 있습니다. 쿼리 결과에는 언어 모델에서 제공하는 텍스트뿐만 아니라 관련 문서 또는 소스 모음도 포함될 수 있습니다. IBM 연구 블로그에서 RAG에 대한 자세한 내용을 읽을 수 있습니다.
이것은 시작하고 실행하기가 매우 쉬운 프로젝트입니다 ...
먼저 프로젝트의 가상 환경을 설정하고 활성화합니다.
python3 -m venv virtualenv
source ./virtualenv/bin/activate
requirements.txt
파일을 사용하여 이 프로젝트에 대한 모든 종속성을 설치할 수 있습니다. 그렇게 하는 경우 이 문서에서는 pip
통해 다른 패키지를 수동으로 설치할 필요가 없습니다.
pip install -r requirements.txt
env.example
지침으로 사용하여 .env
파일을 만듭니다.
cp env.example .env
이는 WordPress 데이터를 다운로드하는 데 중요합니다. Wordpress 사용자 이름, 애플리케이션 비밀번호 및 블로그 도메인을 .env
에 복사하세요. 참고: 이는 블로그가 루트 경로에 있다고 가정합니다.
pip install --upgrade python-dotenv requests pandas langchain langchain_community html2text sentence_transformers
wordpress 콘텐츠를 ./data
디렉터리에 다운로드합니다(현재는 블로그가 도메인 루트에 있다고 가정).
python3 wordpress-dl.py
PGVector는 Postgresql 데이터베이스에 텍스트 임베딩(벡터)을 저장하고 쿼리하는 데 사용됩니다. PGVector의 한 가지 이점은 기존 데이터베이스 시스템에 추가할 수 있고 독점 타사 제품이 필요하지 않다는 것입니다.
pgVector 임베딩 지원의 경우:
pip install pgvector psycopg2-binary
적절한 .env
값이 있는지 확인하세요. 로컬 개발에는 기본값이 적합하지만 기존 Postgres 데이터베이스를 사용하는 경우(즉, docker 이미지를 실행하지 않는 경우) 뭔가 다를 가능성이 있습니다. 여기서는 설정을 단순하게 유지하기 위해 Docker 이미지를 사용하지만, pgVector 확장을 직접 추가하고 로드할 수 있다면 다른 PostgreSQL 인스턴스를 쉽게 사용할 수 있습니다.
./postgres
에서 docker 이미지를 실행하려면 다음을 수행합니다.
docker compose up
embeddings 스크립트를 실행하여 wordpress 다운로드를 가져오고 postgres 데이터베이스에 embeddings를 저장합니다. 시간이 좀 걸릴 수 있습니다. _데이터베이스에 데이터를 삽입하려면, 즉 데이터를 지우고 깨끗한 데이터로 시작하려면 --embed
CLI 인수를 전달하세요.
python3 embed.py --embed
기본적으로 1개의 레코드만 테스트용으로 삽입됩니다(즉, --limit
지정하지 않고 1보다 큰 정수를 지정하면 첫 번째 레코드에 대한 벡터 임베딩만 생성됩니다). 따라서 추가 계산 시간을 너무 많이 소비하지 않고 더 쉽게 테스트할 수 있습니다.
추가 정보가 궁금하다면 --verbose
전달하세요.
샘플 호출은 다음과 같습니다.
python3 embed.py --verbose --embed --limit 100
...하지만 WordPress 블로그에 맞게 제한 크기를 늘리세요. 숫자가 항목 수보다 크면 문제 없습니다. 최대 레코드 수까지 가져올 수 있을 만큼 똑똑합니다.
이 저장소는 로컬 및 API 기반 사용 사례를 모두 보여줍니다. 로컬에서 실행되는 모델의 이점 중 하나는 데이터가 비공개로 유지되고 다른 사람의 모델을 교육하는 데 사용되지 않는다는 것입니다. 또한 쿼리를 서버나 네트워크에 로컬로 유지하면 성능이 향상될 수 있지만 자체 호스팅 시스템에서 API 사용 비용이 발생하지 않습니다. 반면 OpenAI는 이 프로젝트에 사용된 모델보다 훨씬 더 큰 컨텍스트 창을 갖고 있고 OpenAI 모델이 상당히 좋을 수 있으므로 API 사용이 바람직할 수 있습니다.
현지 언어 모델을 사용하려면 trsnformers
python 패키지와 pytorch( torch
)가 필요합니다.
pip install transformers torch llama-cpp-python
다음으로 이 오프라인 접근 방식에 사용되는 모델을 다운로드합니다. 언어 모델은 용량이 클 수 있으므로(수 GB) 이를 보여주는 더 작은 Llama 모델을 선택했습니다. 더 작은 모델도 사용할 수 있지만 상황 창의 한계에 도달하는 경우가 많으며 이는 완화될 수 있지만 이 프로젝트의 범위를 벗어납니다. 이 프로젝트는 TheBloke/Llama-2-7b-Chat-GGUF
( Q4_K_M
)를 사용합니다.
( huggingface-cli
설치되어 있지 않은 경우 여기에서 자세한 내용을 확인할 수 있습니다.)
huggingface-cli download TheBloke/Llama-2-7b-Chat-GGUF llama-2-7b-chat.Q4_K_M.gguf --local-dir ./models/ --local-dir-use-symlinks True
이 명령은 모델을 사용자 계정의 캐시 디렉터로 다운로드하고 모델 디렉터리에서 심볼릭 링크합니다.
모델이 다운로드되면 기본 옵션인 로컬 추론을 실행할 수 있습니다. 지침은 다음 섹션 쿼리 를 참조하세요.
OpenAI API 사용을 위해서는 설치가 필요합니다.
pip install langchain_openai
OpenAI API 키가 .env
파일에 저장되어 있는지 확인하세요. OpenAI Platform API Key 탭( OPENAI_API_KEY="...
에서 이를 구성할 수 있습니다.
문서(포함 및 검색, btw)는 이 프로젝트에서 다음과 같은 일반적인 구조를 갖습니다.
## document
## page_content
## metadata
## id
## link
## title
## categories
## tags
결과는 종종 튜플 List
(idx, Document)으로 반환되므로 목록을 열거하는 것이 적절합니다.
for ( idx , doc ) in enumerate ( results [" docs ]):
print ( f" { doc . metadata [ 'title' ] } " )
LLM 응답을 보강하는 데 가장 유용한 데이터는 포함 중에 입력되는 데이터 사전인 metadata
속성에 포함됩니다.
CLI에서 쿼리를 실행하는 것은 간단합니다.
...로컬 모델:
python3 query.py --query " Does RaspberryPi have GPIO that swift can use? "
...OpenAI 사용:
python3 query.py --query " Does RaspberryPi have GPIO that swift can use? " --use-api
잠시 후 다음과 같은 응답이 표시될 것으로 예상됩니다.
❓ 'Does RaspberryPi have GPIO that swift can use?'
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Yes, RasbperryPi has GPIO that swift can use as per the context given.
- - Supporing Docs - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
? Accessing Raspberry Pi GPIO Pins (With Swift) ? https://archive.mistercameron.com/2016/06/accessing-raspberry-pi-gpio-pins-with-swift/
? Currently, Swift on Raspberry Pi3 ? https://archive.mistercameron.com/2016/04/currently-swift-on-raspberry-pi3/
? Compile Swift 3.0 on Your ARM computers (Raspberry Pi, BeagleBone Black, etc) ? https://archive.mistercameron.com/2016/06/compile-swift-3-0-on-your-arm-computer/
? Ready Your Raspberry Pi for Swift ? https://archive.mistercameron.com/2016/05/ready-your-raspberry-pi-for-swift/
~ ~ ~ ~ ~ Finished in 14.80s ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
********************************************************************************
데이터와 모델을 테스트할 때 도움이 될 수 있는 추가 인수가 있습니다. 더 많은 옵션을 보려면 python3 query.py --help
실행하세요.