З розвитком великих мовних моделей (LLM) стало можливим генерувати людську мову. Вони можуть виконувати широкий спектр завдань, таких як генерація тексту, переклад, узагальнення та відповіді на запитання.
Проте, LLM навчаються на величезній кількості даних, і вони мають обмеження, коли йдеться про відповіді на спеціалізовані запити, пов'язані з вашими власними даними. Наприклад, ваша компанія може мати документацію для продуктів, і ви хочете отримувати відповіді на основі цієї документації. Оскільки LLM не були навчені на цих документах, вони не зможуть відповісти на запити, що стосуються цих документів. Щоб зробити ситуацію ще гіршою, LLM можуть галлюцинувати та надавати неточні відповіді. Подібна проблема може виникнути, коли дані часто оновлюються — не завжди практично перенавчати LLM щоразу, коли інформація оновлюється.
Retrieval Augmented Generation (RAG)
Retrieval-Augmented-Generation (RAG) — це техніка, яка допомагає генерувати більш точний, релевантний та актуальний текст у таких ситуаціях. У RAG LLM підключені до необхідних даних і тому можуть надати найбільш актуальну або релевантну інформацію на запит.
Текстові ембедінги
LLM не можуть підключатися до ваших даних у сирому форматі (таких як текст). Для ефективної роботи LLM дані потрібно вбудовувати та зберігати в векторній базі даних. Ембедінг — це процес перетворення текстових даних у векторне представлення. Текстові дані перетворюються в вектор у просторі високої розмірності. Схожі або пов'язані тексти потім представляються векторами, координати яких знаходяться близько один до одного. Потім можна здійснити пошук по базі даних для отримання даних, що є релевантними для запиту користувача.
Приємно, що існує багато бібліотек для створення текстових ембедінгів — тобто перетворення тексту у векторне представлення — і легко створювати векторні бази даних. У цьому демонстраційному прикладі ми використаємо функцію OpenAIEmbeddings, надану пакетом langchain_openai.
Створення векторної бази даних
У цьому демонстраційному прикладі я покажу легкий та простий спосіб створення векторної бази даних. Ми використаємо популярний роман Злочин і покарання Федора Достоєвського, який доступний для безкоштовного завантаження на сайті Project Gutenberg. Ви можете використовувати будь-який інший текстовий файл. Слідуйте інструкціям нижче, щоб створити векторну базу даних.
Крок 1: Отримайте ключ API OpenAI та встановіть його як змінну середовища.
$ # Для Linux/MacOS
$ export OPENAI_API_KEY="your-api-key-here"
$ # Для Windows
$ set OPENAI_API_KEY="your-api-key-here"
Крок 2: Завантажте файл з Project Gutenberg тут та збережіть його в директорії під назвою data. Як зазначалося вище, ви можете використовувати свій власний текстовий документ.
$ mkdir data
$ wget https://www.gutenberg.org/cache/epub/2554/pg2554.txt -O data/crime_and_punishment.md
Крок 3: Створіть віртуальне середовище та встановіть усі необхідні пакети. Я використовую uv для створення віртуального середовища.
Ви можете дізнатися, як почати використовувати uv в попередній статті.
$ uv venv venv
$ source venv/bin/activate
Альтернативно, ви можете використати пакет для віртуального середовища.
$ python3 -m virtualenv venv
$ sourcce venv/bin/activate
Далі, створіть файл requirements.txt.
# requirements.txt
langchain==0.3.13
langchain-community==0.3.13
langchain-chroma==0.1.4
unstructured==0.16.11
markdown==3.7
langchain_openai==0.2.14
chromadb==0.5.23
pysqlite3-binary==0.5.4
Потім встановіть пакети за допомогою uv або pip.
$ # запустіть це, якщо ви використовуєте uv
$ uv pip install -r requirements.txt
$ # запустіть це, якщо ви використовуєте virtualenvironment
$ pip install -r requirements.txt
Крок 4: Використовуйте pysqlite3 замість sqlite3
В деяких системах може виникнути конфлікт версій між Chroma DB та стандартним sqlite3. Щоб уникнути цього, ми замінюємо sqlite3 на pysqlite3.
__import__("pysqlite3")
import sys
sys.modules["sqlite3"] = sys.modules.pop("pysqlite3")
Крок 5: Завантажте документи в пам'ять. Ми використовуємо утиліту під назвою DirectoryLoader, яка дозволяє завантажувати кілька файлів.
from langchain_community.document_loaders import DirectoryLoader
loader = DirectoryLoader('data', glob='*.md')
docs = loader.load()
print(len(docs))
Вищезазначений код має вивести кількість завантажених документів. У моєму випадку я використав лише один документ (crimeandpunishment.md), тому на екрані з'явиться “1”.
Примітка: Якщо ваші файли мають інше розширення, наприклад .txt, змініть параметр glob відповідно.
Крок 6: Розбийте дані на менші частини.
Оскільки дані можуть бути дуже довгими, ми розбиваємо їх на менші частини. Кожна частина потім вбудовується. Ви можете вибрати розмір частини, перекриття частин та інші параметри. Нижче я вибрав деякі розумні значення.
from langchain.text_splitter import RecursiveCharacterTextSplitter
splitter = RecursiveCharacterTextSplitter(
chunk_size=1000,
chunk_overlap=300,
length_function=len,
add_start_index=True,
)
chunks = splitter.split_documents(docs)
print(len(chunks))
Усі дані розділені на 1719 частин, тому на екрані буде виведено “1719”. Якщо ви використовуєте інший вхідний файл або інші значення для параметрів, ви можете отримати іншу кількість.
Крок 7: Вбудовування та збереження даних
Останнім кроком є перетворення кожної частини в векторне представлення та збереження його у векторній базі даних. Як зазначалося раніше, ми використовуємо OpenAIEmbeddings для вбудовування, а для збереження даних використовуємо Chroma DB.
from langchain_community.vectorstores import Chroma
from langchain_openai import OpenAIEmbeddings
embedding_function = OpenAIEmbeddings()
db = Chroma.from_documents(
chunks,
embedding_function,
persist_directory='chroma',
)
Якщо ви не допустили помилок і все працює правильно, тепер ви побачите нову директорію під назвою chroma. Вона міститиме артефакти векторної бази даних, і ви зможете підключити її до LLM і запускати запити до неї. Я продемонструю це в наступній статті.
Резюме:
У цій статті я показав, як легко створити векторну базу даних на основі вашого текстового файлу. Потім її можна підключити до LLM для налаштування системи RAG. Таким чином, ви зможете здійснювати запити до ваших власних даних і генерувати точні та актуальні текстові відповіді.
Якщо ця стаття була корисною, не забувайте поставити лайк і підписатися на мене.
Перекладено з: Creating a Vector Database for RAG