Оллама с RAG чат с PDF

Вопрос или проблема

В настоящее время я пытаюсь создать чат-бота с помощью Ollama с RAG для чтения PDF в качестве ссылки. Однако я сталкиваюсь с проблемой, когда ответы чат-бота содержат информацию из PDF, даже когда я не задаю вопросы, связанные с PDF.

Ниже приведен код

from langchain.callbacks.manager import CallbackManager
from langchain.callbacks.streaming_stdout import StreamingStdOutCallbackHandler
from langchain.prompts import PromptTemplate
from langchain.chains.combine_documents import create_stuff_documents_chain
from langchain_community.llms import Ollama
from langchain_community.document_loaders import PyPDFLoader
from langchain.text_splitter import CharacterTextSplitter
from langchain_community.embeddings import OllamaEmbeddings
from langchain_community.vectorstores import Chroma
from langchain.chains import create_retrieval_chain

ollama_llm = Ollama(model="qwen2.5:7b", callbacks=CallbackManager([StreamingStdOutCallbackHandler()]))

loader = PyPDFLoader("test.pdf")
docx = loader.load_and_split()
text_splitter = CharacterTextSplitter(chunk_size=5, chunk_overlap=2)
documents = text_splitter.split_documents(docx)

embeddings = OllamaEmbeddings(model="qwen2.5:7b")
vectordb = Chroma.from_documents(docx, embeddings,persist_directory="./knowledge-base")
retriever = vectordb.as_retriever()

template = """
<s> [INST] Вы домашний помощник, предназначенный для помощи пользователям в различных повседневных задачах. 
Ваша роль включает предоставление практических советов, предложение решений распространенных домашних проблем и помощь в ежедневном планировании. 
Отвечайте в полезной, дружелюбной и лаконичной манере, проявляя эмпатию и понимание. [/INST] </s> 
[INST] Вопрос: {input} 
Контекст: {context} 
Ответ: [/INST]
"""

combine_docs_chain = create_stuff_documents_chain(
    ollama_llm, PromptTemplate(template=template)
)
retrieval_chain = create_retrieval_chain(retriever, combine_docs_chain)



while True:
    user_input = input("Пользователь:")
    if user_input == 'до свидания':
        break
    response = retrieval_chain.invoke({'input':user_input})
    print()
    print(response)

И вот что я получаю

Пользователь:привет
Привет, Алекс! Похоже, у вас есть большая страсть к GTA 10. Игра в видеоигры может быть веселым способом расслабиться и исследовать разные миры. Если вам когда-либо понадобятся советы по улучшению вашего игрового процесса или вы просто хотите поговорить об игре, не стесняйтесь спрашивать! Также убедитесь, что вы балансируете игры с другими занятиями, чтобы все оставалось приятным и здоровым.

Содержимое PDF

Может, кто-то поможет мне понять, почему это происходит и как это решить?

Ответ или решение

Анализ и решение проблемы с чатом на основе Ollama и PDF-документа

Введение

Создание чата на базе моделей, таких как Ollama с механизмом Retrieval-Augmented Generation (RAG), предоставляет широкие возможности для интеграции разного рода контента, например, из PDF-документов. Однако, как вы заметили, существует проблема, когда бот включает информацию из PDF, даже когда это не требуется. В этой статье мы постараемся проанализировать возможные причины этой проблемы и предложить пути ее решения.

Проблема: Неуместные ссылки на контент PDF

Вы указали, что когда пользователь задает общий вопрос ("User: hello"), бот отвечает с учетом информации, содержащейся в PDF, даже когда вопрос не имеет к нему отношения. Это поведение может быть вызвано несколькими факторами.

Возможные причины

  1. Доступность информации: Ваша реализация использует механизм поиска вектора (Vector Store), который включает все документы, загруженные из PDF. Если информация в PDF является более релевантной по сравнению с другими источниками, она может быть автоматически включена в ответ.

  2. Структура Prompt: Форматирование промпта, включающее контекст из документа, может приводить к тому, что модель будет более склонна использовать информацию из PDF.

  3. Контекстное окно: Модель может не адекватно различать контекст (например, текущий вопрос и ранее загруженные данные), что может вызвать смешение данных.

Потенциальные решения

Для устранения данной проблемы рекомендуется рассмотреть следующие подходы:

1. Пересмотр структуры Prompt

Измените структуру вашего шаблона, добавив более четкое разграничение между вопросами, не касающимися PDF, и ответами, требующими контекста из документа. Например:

template = """
&lt;s&gt; [INST] Вы являетесь помощником для дома, который предназначен для помощи пользователям в различных повседневных задачах. 
Ваши ответы должны быть благодарны и дружелюбны. [/INST] &lt;/s&gt; 
[INST] Вопрос: {input} 
Если это касается общих тем, ответьте без использования контекста документа. 
Контекст: {context} 
Ответ: [/INST]
"""

2. Контроль за источником информации

Можно реализовать фильтрацию: перед ответом проверьте, насколько контент из PDF действительно релевантен к заданному вопросу. Если вопрос не имеет отношения к PDF, не добавляйте его в контекст.

3. Ограничение контекста

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

4. Обучение с использованием уточняющих вопросов

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

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...