
Время чтения: ~ 10 минут
Строительство Art Deco Rag Chatbot с использованием pulsejet github Repo: https://github.com/jet-engine/art-deco-chatbot
Этот пост можно прочитать по следующим ссылкам:
Большие языковые модели (LLM) значительно продвинулись, улучшая их способность отвечать на широкий спектр вопросов. Тем не менее, они по -прежнему сталкиваются с проблемами, особенно с конкретной или недавней информацией, часто приводящей к неточностям или «галлюцинациям». Чтобы решить эти вопросы, подход из поиска дополненного поколения (RAG) объединяет шаг поиска документа в процесс генерации ответов. Этот подход использует корпус документов и использует векторные базы данных для эффективного поиска, повышая точность и надежность ответов LLM через три ключевых шага:
Векторные базы данных облегчают поиск сходства и эффективное управление данными, что делает RAG мощным решением для расширения возможностей LLM.
Эра ар -деко, охватывающая ревущие 1920 -х годов до 1940 -х годов, оставила ослепительное наследие в архитектуре. Несмотря на возможности таких моделей, как Meta's Llama3.1, их ответы могут быть ненадежными, особенно для нюансированных или подробных запросов, характерных для ар -деко. Наша цель в Art Deco Chatbot - использовать RAG для улучшения качества ответов об архитектуре Art Deco, сравнивая их с теми, которые генерируются традиционными LLMS как в качестве качества, так и по эффективности времени.
Проектируя чат -бот Art Deco, мы также стремимся показать, как может быть построена сложная тряпичная система. Вы можете получить доступ к полному коду в репозитории GitHub Art Deco. Изучив код и прочитав этот Readme, вы узнаете:
Ollama - это программа, которая легко облегчает запуск моделей LLM на местных машинах.
ollama pull llama3.1 (LLM, который будет использоваться для тряпки)ollama pull nomic-embed-text (модель встраивания, которая будет использоваться для Rag) В этом проекте мы не только стремимся написать код, чтобы показать, как можно сделать тряпку, но и сравнить и сравнить результаты RAG с помощью запросов с различными LLMS. Некоторые из этих LLM не могут работать локально (например, GPT-4o ), в то время как другие тяжелые и работают на облачных сервисах (например, Llama3.1:70b на Groq).
Litellm предоставляет унифицированный интерфейс для запроса различных LLMS, что делает наш код чище и более читаемым. Рекомендуется проверить библиотеку Python Litellm, но не требуется для этого проекта.
Получите свои ключи API от Openai и Groq, чтобы использовать их в проекте. Имейте в виду, что вы можете быть выставлены счета за использование этих услуг. В то время как Groq API можно использовать бесплатно на момент написания, OpenAI API не является бесплатным.
Pulsejet-это высокопроизводительная векторная база данных, которая обеспечивает эффективное хранение и поиск документов. Чтобы настроить Pulsejet:
pip install pulsejetdocker run --name pulsejet_container -p 47044-47045:47044-47045 jetngine/pulsejet Примечание. Вы можете пропустить первый шаг, так как Pulsejet уже включен в файл requirements.txt .
Проверьте документы Pulsejet для получения подробной информации о запуске изображений Pulsejet Docker и использования библиотеки Pulsejet Python для операций векторной базы данных.
Установите все необходимые зависимости, работая:
pip install -r requirements.txt
Этот проект был разработан с использованием среды
condaсPython 3.11.
Поскольку мы не тестировали проект в разных средах, мы рекомендуем придерживаться этой конфигурации для оптимальной производительности и совместимости.
Art Deco Chatbot использует два файла YAML для конфигурации: config.template.yaml и secrets.yaml . Вот подробная разбивка каждого раздела:
Создайте файл secrets.yaml со своими клавишами API:
# api_keys:
openai_key : " your_openai_key_here "
groq_key : " your_groq_key_here " # models:
main_model : " llama3.1 "
embed_model : " nomic-embed-text "
# vector_db:
vector_db : " pulsejet "
# pulsejet:
pulsejet_location : " remote "
pulsejet_collection_name : " art-deco "
# paths:
rag_files_path : " rag_files/ "
questions_file_path : " evaluation/questions.csv "
evaluation_path : " evaluation/ "
rag_prompt_path : " evaluation/rag_prompt.txt "
metrics_file_path : " evaluation/metrics.json "
# embeddings:
embeddings_file_path : " embeddings_data/all_embeddings_HSNW.h5 "
use_precalculated_embeddings : true
# llm_models:
all_models :
gpt-4o : " gpt-4o "
groq-llama3.1-8b : " groq/llama-3.1-8b-instant "
groq-llama3.1-70b : " groq/llama-3.1-70b-versatile "
ollama-llama3.1 : " ollama/llama3.1 "
ollama-llama3.1-70b : " ollama/llama3.1:70b "
selected_models :
- " gpt-4o "
- " groq-llama3.1-70b "
- " ollama-llama3.1 "
# rag_parameters:
sentences_per_chunk : 10
chunk_overlap : 2
file_extension : " .txt "Вот подробное объяснение каждого раздела:
true система будет загружать встраивания из указанного файла. Когда он false , он будет генерировать новые встроения и сохранить их в этом файле. Убедитесь, что вы обновляете эти файлы конфигурации с помощью ваших конкретных настроек перед запуском проекта. Регулировка параметров RAG может значительно повлиять на производительность и точность системы RAG. Эксперименты с различными значениями могут потребоваться для поиска оптимальной конфигурации для вашего конкретного варианта использования и набора документов.
wiki-bot.pyЭтот шаг не является обязательным, поскольку файлы содержимого всех сокрасных статей из Википедии доступны в https://huggingface.co/datasets/jetengine/art_deco_usa_ds.
Вы можете скачать этот набор данных и скопировать все текстовые файлы из него в каталог RAG_FILES. Если вы планируете использовать предварительно рассчитанные вставки, которые будут объяснены в следующем разделе, вам на самом деле не нужно загружать этот набор данных.
Нет необходимости повторять процесс соскоба. Вы могли бы пропустить чтение остальной части этого раздела, если вы не заинтересованы в процессе скребевания данных.
Наш первоначальный шаг включает в себя сбор знаний об архитектуре искусства. Мы сосредоточены на американских структурах, учитывая их известность в движении искусства. Сценарий Wiki-bot.py автоматизирует сбор соответствующих статей Википедии, организуя их в структурированный каталог для простоты доступа.
Запустите бот, используя:
python wiki-bot.py
Когда вы запускаете Wiki-bot.py с пустым каталогом rag_files , он сохраняет содержимое сокраренных статей Википедии в подразделе, названном text под rag_files. Бот также создает различные подразделения для организации различных типов данных, таких как URL-адреса статьи, ссылки и т. Д. Поскольку наша текущая фокусировка сосредоточена только на содержании статей Википедии, чтобы уменьшить беспорядок, мы перенесем только содержимое из text подразделения в наш набор данных HG и удалили все другие подразделения.
Таким образом, если вы хотите запустить бот самостоятельно, который является необязательным, поскольку скрещенные документы уже доступны в обнимании, вам нужно либо скопировать все файлы из текстового подразделения в каталог rag_files , а затем удалить все субсолдеры в rag_files или просто изменить rag_files_path в config.yaml на rag_files/text .
indexing.pyИндексировать документы, работая:
python indexing.py
Этот скрипт обрабатывает документы, генерирует встраиваемые и хранит их в Pulsejet. Если вы не хотите терять время для генерации Entgeddings, вы можете загрузить предварительные вставки с https://huggingface.co/jetengine/rag_art_deco_embeddings и установить use_precalculated_embeddings: true в конфигурации.
В нашей настройке генерации встраиваний занимает около 15 минут , а вставка векторов в Pulsejet занимает около 4 секунд .
Скрипт выводит информацию о времени для:
chat.pyУбедитесь, что ваша конфигурация верна, затем запустите:
python chat.py
Этот скрипт запросит различные LLM и систему RAG, результаты вывода в форматах HTML, JSON и CSV для сравнения.
Pulsejet используется в этом проекте для эффективного векторного хранения и поиска. Вот подробный обзор того, как Pulsejet интегрирован в наш проект Art Deco Chatbot:
Инициализация клиента Pulsejet :
client = pj . PulsejetClient ( location = config [ 'pulsejet_location' ]) Это создает клиент Pulsejet. В нашем проекте мы используем удаленный экземпляр Pulsejet, поэтому location установлено для «удаленного». Это подключается к серверу Pulsejet, работающему в контейнере Docker.
Создание коллекции :
client . create_collection ( collection_name , vector_config ) Это создает новую коллекцию в Pulsejet для хранения наших документов. Параметр vector_config указывает конфигурацию для векторного хранилища, такую как размер вектора и тип индекса (например, HNSW для эффективного поиска сходства).
Вставка векторов : в нашем проекте мы используем следующий шаблон для вставки векторов:
collection [ 0 ]. insert_single ( collection [ 1 ], embed , meta )Сначала это может выглядеть запутанно, но вот что это значит:
collection[0] на самом деле является нашим экземпляром клиента Pulsejet.collection[1] - это название коллекции, в которую мы вставляем.embed вектор, который мы вставляем.meta - это дополнительные метаданные, связанные с вектором.Это эквивалентно вызова:
client . insert_single ( collection_name , vector , meta )Для объемных вставок мы используем:
client . insert_multi ( collection_name , embeds )Это вводит несколько встроков одновременно, что более эффективно для больших наборов данных.
Поиск векторов :
results = client [ 'db' ]. search_single ( collection , query_embed , limit = 5 , filter = None ) Это выполняет поиск сходства в указанной коллекции Pulsejet, чтобы найти наиболее соответствующие документы для данного вектора запросов. limit параметр указывает максимальное количество результатов для возврата.
В нашем проекте client['db'] используется для доступа к методам базы данных клиента Pulsejet. Это эквивалентно использованию клиента напрямую:
results = client . search_single ( collection_name , query_vector , limit = 5 , filter = None )Закрытие соединения :
client . close ()Это закрывает соединение с базой данных Pulsejet, когда она больше не нужна.
Класс PulsejetRagClient определяется в pulsejet_rag_client.py и обеспечивает интерфейс высокого уровня для взаимодействия с Pulsejet в контексте нашей тряпичной системы. Вот разбивка его ключевых компонентов:
Инициализация :
class PulsejetRagClient :
def __init__ ( self , config ):
self . config = config
self . collection_name = config [ 'pulsejet_collection_name' ]
self . main_model = config [ 'main_model' ]
self . embed_model = config [ 'embed_model' ]
self . client = pj . PulsejetClient ( location = config [ 'pulsejet_location' ])Клиент инициализируется с помощью параметров конфигурации, настраивая клиент Pulsejet и сохраняет соответствующие значения конфигурации.
Создание коллекции :
def create_collection ( self ):
vector_size = get_vector_size ( self . config [ 'embed_model' ])
vector_params = pj . VectorParams ( size = vector_size , index_type = pj . IndexType . HNSW )
try :
self . client . create_collection ( self . collection_name , vector_params )
logger . info ( f"Created new collection: { self . collection_name } " )
except Exception as e :
logger . info ( f"Collection ' { self . collection_name } ' already exists or error occurred: { str ( e ) } " ) Этот метод создает новую коллекцию в Pulsejet с указанными параметрами. Он использует функцию get_vector_size , чтобы определить соответствующий размер вектора для встраивания.
Вставка векторов :
def insert_vector ( self , vector , metadata = None ):
try :
self . client . insert_single ( self . collection_name , vector , metadata )
logger . debug ( f"Inserted vector with metadata: { metadata } " )
except Exception as e :
logger . error ( f"Error inserting vector: { str ( e ) } " )
def insert_vectors ( self , vectors , metadatas = None ):
try :
self . client . insert_multi ( self . collection_name , vectors , metadatas )
logger . debug ( f"Inserted { len ( vectors ) } vectors" )
except Exception as e :
logger . error ( f"Error inserting multiple vectors: { str ( e ) } " )Эти методы обрабатывают вставку отдельных и множественных векторов в коллекцию Pulsejet, а также связанные с ними метаданные.
Поиск векторов :
def search_similar_vectors ( self , query_vector , limit = 5 ):
try :
results = self . client . search_single ( self . collection_name , query_vector , limit = limit , filter = None )
return results
except Exception as e :
logger . error ( f"Error searching for similar vectors: { str ( e ) } " )
return []Этот метод выполняет поиск сходства в коллекции Pulsejet, чтобы найти наиболее соответствующие документы для данного вектора запросов.
Закрытие соединения :
def close ( self ):
try :
self . client . close ()
logger . info ( "Closed Pulsejet client connection" )
except Exception as e :
logger . error ( f"Error closing Pulsejet client connection: { str ( e ) } " )Этот метод закрывает соединение с базой данных Pulsejet, когда он больше не нужен.
PulsejetRagClient используется во всем проекте для взаимодействия с Pulsejet. Вот как это обычно создается и используется:
Создание :
from pulsejet_rag_client import create_pulsejet_rag_client
config = get_config ()
rag_client = create_pulsejet_rag_client ( config )Индексация документов :
В indexing.py мы используем клиент для создания векторов коллекции и вставки:
rag_client . create_collection ()
for file_name , file_embeddings in embeddings_data . items ():
for chunk_id , content , embed in file_embeddings :
metadata = { "filename" : file_name , "chunk_id" : chunk_id , "content" : content }
rag_client . insert_vector ( embed , metadata ) В rag.py мы используем клиент для поиска аналогичных векторов во время процесса Rag:
results = rag_client . search_similar_vectors ( query_embed , limit = 5 )После завершения операций мы закрываем соединение:
rag_client . close ()Эта реализация обеспечивает чистый, инкапсулированный интерфейс для всех операций Pulsejet в нашей тряпичной системе.
LLama3.1 занимает больше времени, чем простой ответ на вопрос из -за увеличенной длины запроса.Чатбот Art Deco демонстрирует, как LLMS можно лучше использовать с тряпкой. Наш проект предлагает всестороннее исследование реализации RAG, охватывающего каждый шаг от соскоба данных и документирования, до внедрения создания и интеграции векторных баз данных.
По мере того, как база документов для тряпичной системы становится все больше, производительность вставки и поисковых операций становится все более важной. Изучив, как интегрировать базу данных Vector Pulsejet в полноценную тряпичную систему, можно значительно извлечь выгоду из ее возможностей, особенно при работе с тряпичными приложениями на крупных базах документов.
Наши тряпичные ответы могли быть более точными. Чтобы повысить производительность нашего чат -бота в ар -деко, мы рассматриваем несколько экспериментальных подходов:
Мы планируем расширить этот проект с помощью следующих инициатив:
Мы призываем вас экспериментировать с чат -ботом Art Deco, изменить его параметры и адаптировать его к вашим собственным доменам, представляющим интерес.
Автор: Гювенш Усанмаз