- Вопрос или проблема
- Ответ или решение
- Анализ и решение проблемы с чатом на основе Ollama и PDF-документа
- Введение
- Проблема: Неуместные ссылки на контент PDF
- Возможные причины
- Потенциальные решения
- 1. Пересмотр структуры Prompt
- 2. Контроль за источником информации
- 3. Ограничение контекста
- 4. Обучение с использованием уточняющих вопросов
- Заключение
Вопрос или проблема
В настоящее время я пытаюсь создать чат-бота с помощью 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. Игра в видеоигры может быть веселым способом расслабиться и исследовать разные миры. Если вам когда-либо понадобятся советы по улучшению вашего игрового процесса или вы просто хотите поговорить об игре, не стесняйтесь спрашивать! Также убедитесь, что вы балансируете игры с другими занятиями, чтобы все оставалось приятным и здоровым.
Может, кто-то поможет мне понять, почему это происходит и как это решить?
Ответ или решение
Анализ и решение проблемы с чатом на основе Ollama и PDF-документа
Введение
Создание чата на базе моделей, таких как Ollama с механизмом Retrieval-Augmented Generation (RAG), предоставляет широкие возможности для интеграции разного рода контента, например, из PDF-документов. Однако, как вы заметили, существует проблема, когда бот включает информацию из PDF, даже когда это не требуется. В этой статье мы постараемся проанализировать возможные причины этой проблемы и предложить пути ее решения.
Проблема: Неуместные ссылки на контент PDF
Вы указали, что когда пользователь задает общий вопрос ("User: hello"), бот отвечает с учетом информации, содержащейся в PDF, даже когда вопрос не имеет к нему отношения. Это поведение может быть вызвано несколькими факторами.
Возможные причины
-
Доступность информации: Ваша реализация использует механизм поиска вектора (Vector Store), который включает все документы, загруженные из PDF. Если информация в PDF является более релевантной по сравнению с другими источниками, она может быть автоматически включена в ответ.
-
Структура Prompt: Форматирование промпта, включающее контекст из документа, может приводить к тому, что модель будет более склонна использовать информацию из PDF.
-
Контекстное окно: Модель может не адекватно различать контекст (например, текущий вопрос и ранее загруженные данные), что может вызвать смешение данных.
Потенциальные решения
Для устранения данной проблемы рекомендуется рассмотреть следующие подходы:
1. Пересмотр структуры Prompt
Измените структуру вашего шаблона, добавив более четкое разграничение между вопросами, не касающимися PDF, и ответами, требующими контекста из документа. Например:
template = """
<s> [INST] Вы являетесь помощником для дома, который предназначен для помощи пользователям в различных повседневных задачах.
Ваши ответы должны быть благодарны и дружелюбны. [/INST] </s>
[INST] Вопрос: {input}
Если это касается общих тем, ответьте без использования контекста документа.
Контекст: {context}
Ответ: [/INST]
"""
2. Контроль за источником информации
Можно реализовать фильтрацию: перед ответом проверьте, насколько контент из PDF действительно релевантен к заданному вопросу. Если вопрос не имеет отношения к PDF, не добавляйте его в контекст.
3. Ограничение контекста
Сократите количество загружаемых документов, чтобы не перегружать контекстное окно. Это поможет избежать «засорения» ответов лишней информацией.
4. Обучение с использованием уточняющих вопросов
Для более сложных вопросов разработайте логику, которая будет запрашивать уточняющие детали у пользователя, тем самым избавляя от ненужного использования контента PDF. Логика может быть основана на простых фразах, сигнализирующих о необходимости получения конкретной информации.
Заключение
Проблема с неуместной информацией из PDF-документов в ответах вашего чат-бота на базе Ollama с применением RAG требует изменения подхода как к формированию промптов, так и к управлению контекстом. Методы, представленные в данной статье, дадут вам возможность улучшить взаимодействие с пользователями и повысить точность ответов. Надеемся, что эти рекомендации помогут вам в дальнейшем развитии вашего проекта.