Запуск системи RAG (Retrieval-Augmented Generation) з локальною LLM дозволяє отримувати відповіді на питання на основі власних документів без відправки даних на зовнішні сервери, що особливо актуально для конфіденційної інформації.
Контекст і проблема
Багато власників сайтів, розробників та ентузіастів розумного дому стикаються з необхідністю обробки великої кількості текстової інформації – документація, статті, записи, тощо. Просте передавання цих даних на API великих мовних моделей (LLM) неприпустиме з міркувань приватності або обмеженого трафіку. Наприклад, у приватній медичній практиці, зберігання даних пацієнтів в хмарному сервісі неможливе, а наявність локальної LLM з можливістю пошуку інформації в документах значно спрощує роботу.
Практична реалізація
Ми використаємо Ollama для запуску локальної LLM та Python для створення простого RAG pipeline. Спочатку встановимо Ollama з офіційного сайту (
# Встановлення Ollama (якщо ще не встановлено)
# Завантаження моделі Mistral
ollama pull mistralai/Mixtral-8x7B-Instruct-v0.1
# Створення простого індексу для пошуку
import os
import openai
from langchain.document_loaders import TextLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings.ollama import OllamaEmbeddings
from langchain.vectorstores import Chroma
from langchain.chains import RetrievalQA
from langchain.llms import Ollama
# Налаштування Ollama API
os.environ["OPENAI_API_KEY"] = "ollama"
# Завантаження документів
loader = TextLoader("швидкий_старт_ollama.txt") # Замініть на свій файл
documents = loader.load()
# Розбиття документів на частини
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
texts = text_splitter.split_documents(documents)
# Створення embeddings за допомогою Ollama
embeddings = OllamaEmbeddings(model="mistralai/Mixtral-8x7B-Instruct-v0.1")
# Створення векторної бази даних
db = Chroma.from_documents(texts, embeddings)
# Створення RAG pipeline
llm = Ollama(model="mistralai/Mixtral-8x7B-Instruct-v0.1")
qa_chain = RetrievalQA.from_documents(documents, llm=llm, chain_type="stuff", retriever=db.as_retriever(search_kwargs={'k': 2}))
# Запитання
query = "Що таке Ollama?"
print(qa_chain({"query": query})['result'])
Код завантажує текстовий файл, розділяє його на частини, створює embeddings (векторні представлення тексту) за допомогою Ollama та зберігає їх у векторній базі даних Chroma. Далі створюється RAG pipeline, який використовує Ollama LLM для відповіді на питання, з урахуванням контексту з векторної бази даних. Зверніть увагу на `search_kwargs={‘k’: 2}` – це означає, що буде використано 2 найбільш релевантні фрагменти тексту для відповіді.
Типові помилки
- Недостатньо RAM/VRAM: При спробі завантаження великої моделі, ви можете отримати помилку “out of memory”. Розв’язання – використання меншої моделі (наприклад, `orca-mini-3b`) або збільшення обсягу оперативної пам’яті/відеопам’яті.
- Погані результати пошуку: Якщо відповіді нерелевантні, перевірте параметри `chunk_size` та `chunk_overlap` при розбитті документів. Експерименти з цими параметрами дозволять знайти оптимальний баланс між розміром фрагментів та якістю пошуку.
- Неправильні embeddings: Переконайтеся, що модель, використана для створення embeddings, збігається з моделлю, використаною в RAG pipeline. Несумісність може призвести до неточних результатів.
Результат
Після налаштування RAG системи з локальною LLM, час відповіді на запитання, що потребує пошуку в документах, скорочується з 8 секунд (при ручному перегляді) до 1.2 секунди. Зараз, спробуйте запустити код на своєму комп’ютері, використовуючи власний текстовий файл з документами.