paint-brush
Создайте свое собственное приложение RAG: пошаговое руководство по локальной настройке LLM с использованием Ollama, Python и ChromaDBк@nassermaronie
7,828 чтения
7,828 чтения

Создайте свое собственное приложение RAG: пошаговое руководство по локальной настройке LLM с использованием Ollama, Python и ChromaDB

к Nasser Maronie13m2024/07/04
Read on Terminal Reader

Слишком долго; Читать

Это руководство проведет вас через процесс создания собственного чат-бота с использованием [Ollama], [Python 3 и [ChromaDB]. Локальное размещение собственного приложения дополненной генерации (RAG) означает, что у вас есть полный контроль над настройкой и настройкой.
featured image - Создайте свое собственное приложение RAG: пошаговое руководство по локальной настройке LLM с использованием Ollama, Python и ChromaDB
Nasser Maronie HackerNoon profile picture
0-item
1-item

В эпоху, когда конфиденциальность данных имеет первостепенное значение, создание собственной языковой модели (LLM) является важным решением как для компаний, так и для частных лиц. Это руководство предназначено для того, чтобы помочь вам пройти процесс создания собственного чат-бота с использованием Ollama , Python 3 и ChromaDB , которые размещаются локально в вашей системе. Вот основные причины, по которым вам нужен этот урок:


  • Полная настройка. Размещение собственного приложения дополненной генерации (RAG) локально означает, что у вас есть полный контроль над установкой и настройкой. Вы можете настроить модель в соответствии с вашими конкретными потребностями, не полагаясь на внешние сервисы.
  • Повышенная конфиденциальность: настраивая модель LLM локально, вы избегаете рисков, связанных с отправкой конфиденциальных данных через Интернет. Это особенно важно для компаний, которые обрабатывают конфиденциальную информацию. Обучение вашей модели личными данными локально гарантирует, что ваши данные останутся под вашим контролем.
  • Безопасность данных. Использование сторонних моделей LLM может привести к потенциальному взлому и неправильному использованию ваших данных. Локальное развертывание снижает эти риски, сохраняя данные обучения, такие как PDF-документы, в вашей безопасной среде.
  • Контроль над обработкой данных. Когда вы размещаете свой собственный LLM, у вас есть возможность управлять и обрабатывать свои данные именно так, как вы хотите. Это включает в себя встраивание ваших личных данных в векторное хранилище ChromaDB, гарантируя, что обработка ваших данных соответствует вашим стандартам и требованиям.
  • Независимость от подключения к Интернету. Запуск чат-бота локально означает, что вы не зависите от подключения к Интернету. Это гарантирует бесперебойное обслуживание и доступ к вашему чат-боту даже в автономном режиме.


Это руководство поможет вам создать надежного и безопасного локального чат-бота, адаптированного к вашим потребностям, без ущерба для конфиденциальности и контроля.

Точная настройка модели


Поисково-дополненная генерация (RAG)

Генерация с расширенным поиском (RAG) — это усовершенствованный метод, который сочетает в себе сильные стороны поиска информации и генерации текста для создания более точных и контекстуально релевантных ответов. Вот описание того, как работает RAG и почему это выгодно:

Что такое РАГ?

RAG — это гибридная модель, которая расширяет возможности языковых моделей за счет включения внешней базы знаний или хранилища документов. Процесс включает в себя два основных компонента:

  • Поиск: на этом этапе модель извлекает соответствующие документы или фрагменты информации из внешнего источника, такого как база данных или векторное хранилище, на основе входного запроса.
  • Генерация: полученная информация затем используется генеративной языковой моделью для создания последовательного и контекстуально соответствующего ответа.

Как работает РАГ?

  • Ввод запроса: пользователь вводит запрос или вопрос.
  • Поиск документов: система использует запрос для поиска во внешней базе знаний, извлекая наиболее релевантные документы или фрагменты информации.
  • Генерация ответа: генеративная модель обрабатывает полученную информацию, интегрируя ее со своими собственными знаниями для генерации подробного и точного ответа.
  • Выход: окончательный ответ, обогащенный конкретными и значимыми деталями из базы знаний, представляется пользователю.

Преимущества РАГ

  • Повышенная точность. Используя внешние данные, модели RAG могут давать более точные и подробные ответы, особенно на запросы, специфичные для предметной области.
  • Контекстная релевантность. Компонент поиска гарантирует, что сгенерированный ответ основан на актуальной и актуальной информации, что повышает общее качество ответа.
  • Масштабируемость: системы RAG можно легко масштабировать для включения огромных объемов данных, что позволяет им обрабатывать широкий спектр запросов и тем.
  • Гибкость: эти модели можно адаптировать к различным областям путем простого обновления или расширения внешней базы знаний, что делает их очень универсальными.

Зачем использовать RAG локально?

  • Конфиденциальность и безопасность. Локальное использование модели RAG гарантирует, что конфиденциальные данные остаются в безопасности и конфиденциальности, поскольку их не нужно отправлять на внешние серверы.
  • Настройка: вы можете адаптировать процессы поиска и генерации в соответствии с вашими конкретными потребностями, включая интеграцию собственных источников данных.
  • Независимость: локальная установка гарантирует, что ваша система будет работать даже без подключения к Интернету, обеспечивая стабильное и надежное обслуживание.

Настроив локальное приложение RAG с такими инструментами, как Ollama, Python и ChromaDB, вы сможете воспользоваться преимуществами расширенных языковых моделей, сохраняя при этом контроль над своими данными и параметрами настройки.

приложение RAG


графический процессор

Запуск больших языковых моделей (LLM), подобных тем, которые используются в поисково-дополненной генерации (RAG), требует значительных вычислительных мощностей. Одним из ключевых компонентов, обеспечивающих эффективную обработку и внедрение данных в эти модели, является графический процессор (GPU). Вот почему графические процессоры необходимы для этой задачи и как они влияют на производительность вашей локальной установки LLM:

Что такое графический процессор?

Графический процессор — это специализированный процессор, предназначенный для ускорения рендеринга изображений и видео. В отличие от центральных процессоров (ЦП), которые оптимизированы для задач последовательной обработки, графические процессоры превосходно справляются с параллельной обработкой. Это делает их особенно подходящими для сложных математических вычислений, необходимых для моделей машинного обучения и глубокого обучения.

Почему графические процессоры важны для студентов LLM

  • Мощность параллельной обработки: графические процессоры могут обрабатывать тысячи операций одновременно, что значительно ускоряет такие задачи, как обучение и вывод в LLM. Этот параллелизм имеет решающее значение для больших вычислительных нагрузок, связанных с обработкой больших наборов данных и генерацией ответов в режиме реального времени.
  • Эффективность обработки больших моделей. LLM, подобные тем, которые используются в RAG, требуют значительного объема памяти и вычислительных ресурсов. Графические процессоры оснащены памятью с высокой пропускной способностью (HBM) и несколькими ядрами, что позволяет им выполнять крупномасштабные матричные умножения и тензорные операции, необходимые для этих моделей.
  • Более быстрое встраивание и извлечение данных. При локальной настройке RAG встраивание данных в векторное хранилище, такое как ChromaDB, и быстрое извлечение соответствующих документов имеет важное значение для производительности. Высокопроизводительные графические процессоры могут ускорить эти процессы, гарантируя, что ваш чат-бот будет реагировать быстро и точно.
  • Сокращение времени обучения. Обучение LLM предполагает корректировку миллионов (или даже миллиардов) параметров. Графические процессоры могут значительно сократить время, необходимое для этого этапа обучения, по сравнению с процессорами, позволяя более часто обновлять и уточнять вашу модель.

Выбор правильного графического процессора

При настройке локального LLM выбор графического процессора может существенно повлиять на производительность. Вот некоторые факторы, которые следует учитывать:

  • Объем памяти: более крупным моделям требуется больше памяти графического процессора. Ищите графические процессоры с более высоким объемом видеопамяти (видеоОЗУ), чтобы вместить обширные наборы данных и параметры модели.
  • Вычислительные возможности. Чем больше ядер CUDA имеет графический процессор, тем лучше он справляется с задачами параллельной обработки. Графические процессоры с более высокими вычислительными возможностями более эффективны для задач глубокого обучения.
  • Пропускная способность: более высокая пропускная способность памяти обеспечивает более быструю передачу данных между графическим процессором и его памятью, улучшая общую скорость обработки.

Примеры высокопроизводительных графических процессоров для LLM

  • NVIDIA RTX 3090: известная своим большим объемом видеопамяти (24 ГБ) и мощными ядрами CUDA, она является популярным выбором для задач глубокого обучения.
  • NVIDIA A100: Разработанный специально для искусственного интеллекта и машинного обучения, он предлагает исключительную производительность, большой объем памяти и высокую вычислительную мощность.
  • AMD Radeon Pro VII: еще один сильный соперник с высокой пропускной способностью памяти и эффективными вычислительными возможностями.

Инвестиции в высокопроизводительный графический процессор имеют решающее значение для локального запуска моделей LLM. Это обеспечивает более быструю обработку данных, эффективное обучение модели и быстрое генерирование ответов, что делает ваше локальное приложение RAG более устойчивым и надежным. Используя возможности графических процессоров, вы можете в полной мере реализовать преимущества размещения собственного чат-бота, адаптированного к вашим конкретным потребностям и требованиям конфиденциальности данных.


Предварительные условия

Прежде чем приступить к настройке, убедитесь, что у вас есть следующие предварительные условия:

  • Python 3: Python — это универсальный язык программирования, который вы будете использовать для написания кода для вашего приложения RAG.
  • ChromaDB: векторная база данных, в которой будут храниться наши данные и управляться с ними.
  • Оллама: Для загрузки и обслуживания пользовательских LLM на нашем локальном компьютере.

Шаг 1. Установите Python 3 и настройте свою среду.

Чтобы установить и настроить нашу среду Python 3, выполните следующие действия: Загрузите и установите Python 3 на свой компьютер. Затем убедитесь, что ваш Python 3 установлен и успешно работает:

 $ python3 --version # Python 3.11.7

Создайте папку для своего проекта, например, local-rag :

 $ mkdir local-rag $ cd local-rag

Создайте виртуальную среду с именем venv :

 $ python3 -m venv venv

Активируйте виртуальную среду:

 $ source venv/bin/activate # Windows # venv\Scripts\activate

Шаг 2. Установите ChromaDB и другие зависимости.

Установите ChromaDB с помощью pip:

 $ pip install --q chromadb

Установите инструменты Langchain для беспрепятственной работы с вашей моделью:

 $ pip install --q unstructured langchain langchain-text-splitters $ pip install --q "unstructured[all-docs]"

Установите Flask, чтобы использовать ваше приложение в качестве службы HTTP:

 $ pip install --q flask

Шаг 3: Установите Олламу

Чтобы установить Ollama, выполните следующие действия: Перейдите на страницу загрузки Ollama и загрузите установщик для вашей операционной системы. Проверьте установку Ollama, выполнив:

 $ ollama --version # ollama version is 0.1.47

Выберите нужную вам модель LLM. Например, чтобы использовать модель Mistral:

 $ ollama pull mistral

Извлеките модель внедрения текста. Например, чтобы использовать модель Nomic Embed Text:

 $ ollama pull nomic-embed-text

Затем запустите свои модели Олламы:

 $ ollama serve

Создайте приложение RAG

Теперь, когда вы настроили свою среду с использованием Python, Ollama, ChromaDB и других зависимостей, пришло время создать собственное локальное приложение RAG. В этом разделе мы рассмотрим практический код Python и предоставим обзор того, как структурировать ваше приложение.

app.py

Это основной файл приложения Flask. Он определяет маршруты для внедрения файлов в базу данных векторов и получения ответа от модели.

 import os from dotenv import load_dotenv load_dotenv() from flask import Flask, request, jsonify from embed import embed from query import query from get_vector_db import get_vector_db TEMP_FOLDER = os.getenv('TEMP_FOLDER', './_temp') os.makedirs(TEMP_FOLDER, exist_ok=True) app = Flask(__name__) @app.route('/embed', methods=['POST']) def route_embed(): if 'file' not in request.files: return jsonify({"error": "No file part"}), 400 file = request.files['file'] if file.filename == '': return jsonify({"error": "No selected file"}), 400 embedded = embed(file) if embedded: return jsonify({"message": "File embedded successfully"}), 200 return jsonify({"error": "File embedded unsuccessfully"}), 400 @app.route('/query', methods=['POST']) def route_query(): data = request.get_json() response = query(data.get('query')) if response: return jsonify({"message": response}), 200 return jsonify({"error": "Something went wrong"}), 400 if __name__ == '__main__': app.run(host="0.0.0.0", port=8080, debug=True)

embed.py

Этот модуль управляет процессом внедрения, включая сохранение загруженных файлов, загрузку и разделение данных, а также добавление документов в базу данных векторов.

 import os from datetime import datetime from werkzeug.utils import secure_filename from langchain_community.document_loaders import UnstructuredPDFLoader from langchain_text_splitters import RecursiveCharacterTextSplitter from get_vector_db import get_vector_db TEMP_FOLDER = os.getenv('TEMP_FOLDER', './_temp') # Function to check if the uploaded file is allowed (only PDF files) def allowed_file(filename): return '.' in filename and filename.rsplit('.', 1)[1].lower() in {'pdf'} # Function to save the uploaded file to the temporary folder def save_file(file): # Save the uploaded file with a secure filename and return the file path ct = datetime.now() ts = ct.timestamp() filename = str(ts) + "_" + secure_filename(file.filename) file_path = os.path.join(TEMP_FOLDER, filename) file.save(file_path) return file_path # Function to load and split the data from the PDF file def load_and_split_data(file_path): # Load the PDF file and split the data into chunks loader = UnstructuredPDFLoader(file_path=file_path) data = loader.load() text_splitter = RecursiveCharacterTextSplitter(chunk_size=7500, chunk_overlap=100) chunks = text_splitter.split_documents(data) return chunks # Main function to handle the embedding process def embed(file): # Check if the file is valid, save it, load and split the data, add to the database, and remove the temporary file if file.filename != '' and file and allowed_file(file.filename): file_path = save_file(file) chunks = load_and_split_data(file_path) db = get_vector_db() db.add_documents(chunks) db.persist() os.remove(file_path) return True return False

query.py

Этот модуль обрабатывает запросы пользователей, генерируя несколько версий запроса, извлекая соответствующие документы и предоставляя ответы на основе контекста.

 import os from langchain_community.chat_models import ChatOllama from langchain.prompts import ChatPromptTemplate, PromptTemplate from langchain_core.output_parsers import StrOutputParser from langchain_core.runnables import RunnablePassthrough from langchain.retrievers.multi_query import MultiQueryRetriever from get_vector_db import get_vector_db LLM_MODEL = os.getenv('LLM_MODEL', 'mistral') # Function to get the prompt templates for generating alternative questions and answering based on context def get_prompt(): QUERY_PROMPT = PromptTemplate( input_variables=["question"], template="""You are an AI language model assistant. Your task is to generate five different versions of the given user question to retrieve relevant documents from a vector database. By generating multiple perspectives on the user question, your goal is to help the user overcome some of the limitations of the distance-based similarity search. Provide these alternative questions separated by newlines. Original question: {question}""", ) template = """Answer the question based ONLY on the following context: {context} Question: {question} """ prompt = ChatPromptTemplate.from_template(template) return QUERY_PROMPT, prompt # Main function to handle the query process def query(input): if input: # Initialize the language model with the specified model name llm = ChatOllama(model=LLM_MODEL) # Get the vector database instance db = get_vector_db() # Get the prompt templates QUERY_PROMPT, prompt = get_prompt() # Set up the retriever to generate multiple queries using the language model and the query prompt retriever = MultiQueryRetriever.from_llm( db.as_retriever(), llm, prompt=QUERY_PROMPT ) # Define the processing chain to retrieve context, generate the answer, and parse the output chain = ( {"context": retriever, "question": RunnablePassthrough()} | prompt | llm | StrOutputParser() ) response = chain.invoke(input) return response return None

get_vector_db.py

Этот модуль инициализирует и возвращает экземпляр векторной базы данных, используемый для хранения и извлечения внедренных документов.

 import os from langchain_community.embeddings import OllamaEmbeddings from langchain_community.vectorstores.chroma import Chroma CHROMA_PATH = os.getenv('CHROMA_PATH', 'chroma') COLLECTION_NAME = os.getenv('COLLECTION_NAME', 'local-rag') TEXT_EMBEDDING_MODEL = os.getenv('TEXT_EMBEDDING_MODEL', 'nomic-embed-text') def get_vector_db(): embedding = OllamaEmbeddings(model=TEXT_EMBEDDING_MODEL,show_progress=True) db = Chroma( collection_name=COLLECTION_NAME, persist_directory=CHROMA_PATH, embedding_function=embedding ) return db

Запустите свое приложение!

Создайте файл .env для хранения переменных среды:

 TEMP_FOLDER = './_temp' CHROMA_PATH = 'chroma' COLLECTION_NAME = 'local-rag' LLM_MODEL = 'mistral' TEXT_EMBEDDING_MODEL = 'nomic-embed-text'

Запустите файл app.py , чтобы запустить сервер приложений:

 $ python3 app.py

После запуска сервера вы можете начать отправлять запросы к следующим конечным точкам:

  • Пример команды для встраивания PDF-файла (например, резюме.pdf):
 $ curl --request POST \ --url http://localhost:8080/embed \ --header 'Content-Type: multipart/form-data' \ --form file=@/Users/nassermaronie/Documents/Nasser-resume.pdf # Response { "message": "File embedded successfully" }
  • Пример команды, чтобы задать вопрос вашей модели:
 $ curl --request POST \ --url http://localhost:8080/query \ --header 'Content-Type: application/json' \ --data '{ "query": "Who is Nasser?" }' # Response { "message": "Nasser Maronie is a Full Stack Developer with experience in web and mobile app development. He has worked as a Lead Full Stack Engineer at Ulventech, a Senior Full Stack Engineer at Speedoc, a Senior Frontend Engineer at Irvins, and a Software Engineer at Tokopedia. His tech stacks include Typescript, ReactJS, VueJS, React Native, NodeJS, PHP, Golang, Python, MySQL, PostgresQL, MongoDB, Redis, AWS, Firebase, and Supabase. He has a Bachelor's degree in Information System from Universitas Amikom Yogyakarta." }

Заключение

Следуя этим инструкциям, вы сможете эффективно запускать собственное локальное приложение RAG и взаимодействовать с ним, используя Python, Ollama и ChromaDB, адаптированные к вашим потребностям. Настраивайте и расширяйте функциональность по мере необходимости, чтобы расширить возможности вашего приложения.

Используя возможности локального развертывания, вы не только защищаете конфиденциальную информацию, но также оптимизируете производительность и скорость реагирования. Независимо от того, улучшаете ли вы взаимодействие с клиентами или оптимизируете внутренние процессы, локально развернутое приложение RAG предлагает гибкость и надежность, позволяющие адаптироваться и расти вместе с вашими требованиями.

Проверьте исходный код в этом репо:

https://github.com/firstpersoncode/local-rag


Приятного кодирования!