Целью этого небольшого проекта является включение записей блога WordPress в базу знаний, использующую методы поисково-дополненной генерации (RAG).
Идея этого проекта проста — серия скриптов будет выполнять определенные действия через командную строку. Каждый сценарий является автономным, что помогает относительно просто продемонстрировать каждое действие в его собственном контексте.
По умолчанию включенные сценарии используют бесплатные библиотеки и модели с открытым исходным кодом, хотя при наличии доступа доступна возможность использовать LLM OpenAI. Этот пример должен работать на ЦП, если у вас нет совместимого графического процессора, кроме YMMV.
RAG использует два компонента: поисковую систему и генеративную языковую модель. Поисковая система запрашивает документы, соответствующие запросу, из хранилища данных/базы знаний (например, сборник сообщений в блогах). Полученные документы затем передаются в языковую модель, которая выдает пользователю обоснованные ответы. Одним из основных преимуществ использования RAG является то, что оно позволяет системе искусственного интеллекта выходить за рамки обучающих данных без необходимости точной настройки или повторного обучения — данные можно добавлять и обновлять в хранилище данных динамически. Результаты запроса могут включать не только текст, предоставленный языковой моделью, но и коллекцию соответствующих документов или источников. Дополнительную информацию о RAG можно прочитать в исследовательском блоге IBM.
Это довольно простой проект, который можно запустить и запустить...
Сначала настройте виртуальную среду проекта и активируйте ее.
python3 -m venv virtualenv
source ./virtualenv/bin/activate
Вы можете установить все зависимости для этого проекта, используя файл requirements.txt
. Если вы это сделаете, вам не нужно вручную устанавливать другие пакеты через pip
описанные в этом документе.
pip install -r requirements.txt
Создайте файл .env
используя env.example
в качестве руководства.
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, чтобы упростить настройку, но вы можете легко использовать другой экземпляр PostgreSQL, если можете добавить и загрузить расширение pgvector самостоятельно.
Чтобы запустить образ докера в ./postgres
:
docker compose up
Запустите сценарий внедрения, чтобы загрузить WordPress и сохранить внедрения в базе данных postgres. Это может занять некоторое время. _Если вы хотите вставить данные в базу данных, то есть стереть и начать с чистых данных, передайте аргумент CLI --embed
:
python3 embed.py --embed
По умолчанию для тестирования вставляется только 1 запись (т. е. если не указывать --limit
, а затем некоторое целое число > 1, будет создано векторное встраивание только для первой записи) - так что вы можете упростить тестирование, не тратя слишком много дополнительного времени на вычисления.
Если вам интересна дополнительная информация, передайте --verbose
Пример вызова может выглядеть так:
python3 embed.py --verbose --embed --limit 100
... но увеличьте лимит, соответствующий размеру вашего блога WordPress. Нет проблем, если число превышает количество записей — достаточно разумно импортировать максимальное количество записей.
В этом репозитории показаны как локальные варианты использования, так и варианты использования на основе API. Одним из преимуществ модели, запускаемой локально, является то, что ваши данные остаются конфиденциальными и не будут использоваться для обучения чужих моделей. Кроме того, можно получить некоторый выигрыш в производительности, если запросы будут выполняться локально на сервере или в сети, но при этом не возникнут затраты на использование API в автономных системах. С другой стороны, использование API может быть желательным, поскольку OpenAI имеет гораздо большие контекстные окна, чем модель, используемая в этом проекте, и модели OpenAI могут быть весьма хорошими.
Для использования модели локального языка потребуется пакет Python trsnformers
и pytorch ( torch
).
pip install transformers torch llama-cpp-python
Затем загрузите модель, используемую в этом автономном подходе. Поскольку языковые модели могут быть большими (несколько ГБ), я выбрал меньшую модель 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
Убедитесь, что ключ API OpenAI сохранен в вашем файле .env
. Вы можете настроить его на вкладке «Ключ API платформы OpenAI»: OPENAI_API_KEY="...
Документы (встроенные и извлеченные, кстати) имеют следующую общую структуру в этом проекте.
## 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
чтобы получить дополнительные параметры.