Я пытаюсь наладить использование олламы, используя RAG для общения с PDF на моем локальном компьютере. Я подписался на этот репозиторий GitHub: https://github.com/tonykipkemboi/ollama_pdf_rag/tree/main Проблема в том, что когда я запускаю код, ошибок нет, но код останавливается при внедрении и останавливается после этого. Я приложил все возможные журналы вместе со списком олламы.
import logging
from langchain_community.document_loaders import UnstructuredPDFLoader
from langchain_community.embeddings import OllamaEmbeddings
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_community.vectorstores import Chroma
from langchain.prompts import ChatPromptTemplate, PromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_community.chat_models import ChatOllama
from langchain_core.runnables import RunnablePassthrough
from langchain.retrievers.multi_query import MultiQueryRetriever
# Configure logging
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
local_path = "D:/KnowledgeSplice/ollama_pdf_rag-main/WEF_The_Global_Cooperation_Barometer_2024.pdf"
try:
# Local PDF file uploads
if local_path:
loader = UnstructuredPDFLoader(file_path=local_path)
data = loader.load()
logging.info("Loading of PDF is done")
else:
logging.error("Upload a PDF file")
raise ValueError("No PDF file uploaded")
# Preview first page
logging.info(f"First page content preview: {data[0].page_content[:500]}...")
# Split and chunk
text_splitter = RecursiveCharacterTextSplitter(chunk_size=7500, chunk_overlap=100)
logging.info("Text splitter created")
chunks = text_splitter.split_documents(data)
logging.info(f"Created {len(chunks)} chunks")
# Add to vector database
logging.info("Creating Vector db")
try:
embedding_model = OllamaEmbeddings(model = "nomic-embed-text", show_progress=True)
print("Embedding", embedding_model)
vector_db = Chroma.from_documents(
documents=chunks,
embedding=embedding_model,
collection_name = "local-rag"
)
logging.info("Local db created successfully")
except Exception as e:
logging.error(f"Error creating vector db: {e}")
raise # Re-raise the exception to stop further execution
# Verify vector database creation
if vector_db:
logging.info("Vector db verification successful")
else:
logging.error("Vector db creation failed")
raise ValueError("Vector db creation failed")
# LLM from Ollama
local_model = "llama3"
llm = ChatOllama(model=local_model)
logging.info("LLM model loaded")
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}""",
)
logging.info("Query prompt created")
retriever = MultiQueryRetriever.from_llm(
vector_db.as_retriever(),
llm,
prompt=QUERY_PROMPT
)
logging.info("Retriever created")
# RAG prompt
template = """Answer the question based ONLY on the following context:
{context}
Question: {question}
"""
prompt = ChatPromptTemplate.from_template(template)
logging.info("RAG prompt created")
chain = (
{"context": retriever, "question": RunnablePassthrough()}
| prompt
| llm
| StrOutputParser()
)
logging.info("Chain created")
response = chain.invoke("What are the 5 pillars of global cooperation?")
logging.info("Chain invoked")
logging.info(f"Response: {response}")
except Exception as e:
logging.error(f"An error occurred: {e}")
В коде нет ошибок, но он не работает после встраивания.
Выход:
2024-08-06 14:59:59,858 - INFO - Text splitter created
2024-08-06 14:59:59,861 - INFO - Created 11 chunks
2024-08-06 14:59:59,861 - INFO - Creating Vector db
Embedding base_url='http://localhost:11434' model='nomic-embed-text' embed_instruction='passage: ' query_instruction='query: ' mirostat=None mirostat_eta=None mirostat_tau=None num_ctx=None num_gpu=None num_thread=None repeat_last_n=None repeat_penalty=None temperature=None stop=None tfs_z=None top_k=None top_p=None show_progress=True headers=None model_kwargs=None
2024-08-06 15:00:00,662 - INFO - Anonymized telemetry enabled. See https://docs.trychroma.com/telemetry for more information.
OllamaEmbeddings: 100%|██████████████████████████████████████████████████████████████████████████████████████████████████████| 11/11 [00:27<00:00, 2.46s/it]
Ниже мой список олламы:
NAME ID SIZE MODIFIED
nomic-embed-text:latest 0a109f422b47 274 MB 3 hours ago
mistral:latest f974a74358d6 4.1 GB 17 hours ago
phi3:latest d184c916657e 2.2 GB 2 weeks ago
llama3:latest 365c0bd3c000 4.7 GB 2 weeks ago
Помогите в решении этого вопроса.
Привет @DerekRoberts. После добавления vector_db.persist() разницы нет. Тот же конвейер останавливается при внедрении.
Я обновил код. Некоторые проблемы, которые я увидел в вашем коде, заключаются в том, что вы неправильно передаете модель и не встраиваете свои документы перед передачей их в ChromaDB.
2024-08-07 17:04:01,619 - INFO - Text splitter created 2024-08-07 17:04:01,635 - INFO - Created 11 chunks 2024-08-07 17:04:01,635 - INFO - Creating Vector db 2024-08-07 17:04:32,731 - INFO - Anonymized telemetry enabled. See https://docs.trychroma.com/telemetry for more information. 2024-08-07 17:04:33,004 - ERROR - An error occurred: 'list' object has no attribute 'embed_documents' @DerekRoberts, можете ли вы предоставить полный код? Я получаю вышеуказанную ошибку.
Хорошо, я изменю код, где вы получаете ошибку? ваши куски представляют собой список строк? посмотрите на это документы
logging.info("Creating Vector db") ollama_emb = OllamaEmbeddings(model = "nomic-embed-text:latest", show_progress=True) #embedding_model = OllamaEmbeddings(model = "nomic-embed-text:latest", show_progress=True) embedding_model = ollama_emb.embed_documents(chunks) vector_db = Chroma.from_documents( documents=chunks, embedding=embedding_model, collection_name = "local-rag" ) vector_db.persist() logging.info("Local db created successfully") Вот код, который выдает ошибку.
Хорошо, я обновлю код, посмотрим, что произойдет после.
Новая ошибка Embedding base_url='http://localhost:11434' model='nomic-embed-text:latest' embed_instruction='passage: ' query_instruction='query: ' mirostat=None mirostat_eta=None mirostat_tau=None num_ctx=None num_gpu=None num_thread=None repeat_last_n=None repeat_penalty=None temperature=None stop=None tfs_z=None top_k=None top_p=None show_progress=True headers=None model_kwargs=None 2024-08-07 17:23:13,709 - ERROR - Error creating vector db: 'list' object has no attribute 'page_content' 2024-08-07 17:23:13,709 - ERROR - An error occurred: 'list' object has no attribute 'page_content'
Я думаю, теперь вы можете использовать Chroma для поиска своих документов. Я предполагаю, что что-то не так с используемой вами моделью, но не совсем уверен.
Эта проблема решена. Теперь ``` 07.08.2024 18:07:47,291 - ИНФОРМАЦИЯ - Создание векторной базы данных OllamaEmbeddings: 100%|█████████████████████████ ███████████████████████████████████████| 11.11 [11:39<00:00, 63.62с/ит] 2024-08-07 18:19:27,977 - ИНФОРМАЦИЯ - Анонимная телеметрия включена. Дополнительную информацию см. на странице docs.trychroma.com/telemetry. ОлламаВложения: 100%|███████████████████████████████████████████████ ████████████████████| 11.11 [11:37<00:00, 63.45s/it] ``` Встраивание выполняется 2 раза и останавливается.
так как проблема решена, пожалуйста, не могли бы вы отметить ответ, спасибо
Нет, я имею в виду, что проблема все та же, конвейер не работает. Код останавливается после встраивания блока.
Я думаю, что проблема может быть в данных, тогда, если документы не соответствуют определенному формату, это произойдет из-за ошибки. Можете ли вы предоставить образец ваших данных в формате кода?
Данные представлены в формате pdf. Вы можете попробовать вышеупомянутый код с любым PDF-файлом.
ок, пожалуйста, не могли бы вы распечатать это new_embedding, что оно вам дает? Он не должен распечатывать то, что вы на самом деле отправили, вы использовали мой код или изменили его?
Вот результат «new_embedding». New Embedding [[0.672055184841156, 0.7975102066993713, -3.145245313644409, -0.7677727341651917, 0.6473227739334106, 1.204037070274353, 1.2511628866195679, -0.4177994430065155, 0.17309130728244781, -0.038180798292160034, 0.22703787684440613, -0.26961109042167664, 0.6859530210494995, -0.21090272068977356, 1.5757282972335815, -0.8310379385948181, -0.2765379846096039, 0.1471942663192749 Здесь слишком много значений, чтобы их можно было добавить. Я использую предоставленный вами код.
похоже, что Chroma устарела может быть, именно поэтому она не работает, в городе появился новый парень, который ее заменяет chromadb Я обновил код, так что это должно работать. Вам придется установить chromadb.
Новая ошибка с chromadb 2024-08-08 12:44:25,855 - INFO - PDF text extraction failed, skip text extraction... 2024-08-08 12:44:25,856 - ERROR - An error occurred: Unable to get page count. Is poppler installed and in PATH?
ты используешь гуглколаб?
Нет, это на моей локальной машине.
ок, пожалуйста, можешь pip install poppler-utils дать посмотреть, что произойдет? Насколько велик ваш PDF-файл?
та же ошибка. После установки pip install poppler-utils.
Я попробовал эту ссылку для попплера, но та же ошибка. stackoverflow.com/questions/53481088/…
блин, это серьезно, пробовали ли вы другие модели встраивания, кроме nomic-embed-text таких, как openAIembeddings, которые вы используете?
нет, я планировал использовать nomic-embed-text согласно их сравнительному анализу. Я не уверен в openAIembeddigs. Можете ли вы предоставить код для этого. Посмотрим, сработает ли это. Спасибо
Давайте продолжим обсуждение в чате.






Я предлагаю изменить векторную базу на FAISS, потому что у цветности есть проблемы с размерностью, которые не сравнимы с моделью внедрения, точнее, база данных chromadb допускает 768, а модель внедрения предлагает 1028. Вот рассмотренный код
import logging
import ollama
from langchain.prompts import ChatPromptTemplate, PromptTemplate
from langchain.retrievers.multi_query import MultiQueryRetriever
from langchain_community.chat_models import ChatOllama
from langchain_community.document_loaders import UnstructuredPDFLoader
from langchain_community.embeddings import OllamaEmbeddings
from langchain_community.vectorstores import FAISS
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough
from langchain_text_splitters import RecursiveCharacterTextSplitter
# Configure logging
logging.basicConfig(
level=logging.INFO, format = "%(asctime)s - %(levelname)s - %(message)s"
)
local_path = "WEF_The_Global_Cooperation_Barometer_2024.pdf"
try:
# Local PDF file uploads
if local_path:
loader = UnstructuredPDFLoader(file_path=local_path)
data = loader.load()
logging.info("Loading of PDF is done")
else:
logging.error("Upload a PDF file")
raise ValueError("No PDF file uploaded")
# Preview first page
# logging.info(f"First page content preview: {data[0].page_content[:500]}...")
# Split and chunk
text_splitter = RecursiveCharacterTextSplitter(chunk_size=7500, chunk_overlap=100)
logging.info("Text splitter created")
chunks = text_splitter.split_documents(data)
logging.info(f"Created {len(chunks)} chunks")
# Add to vector database
logging.info("Creating Vector db")
try:
ollama.embeddings(
model = "mxbai-embed-large",
# prompt='Llamas are members of the camelid family',
)
embedding_model = (OllamaEmbeddings(model = "mxbai-embed-large"),)
vectorstore_db = FAISS.from_documents(
documents=chunks, embedding=embedding_model
)
vectorstore_db.save_local("faiss_index")
vector_retriever = vectorstore_db.as_retriever()
except Exception as e:
logging.error(f"Error creating vector db: {e}")
raise # Re-raise the exception to stop further execution
# LLM from Ollama
local_model = "mistral"
llm = ChatOllama(model=local_model)
print("local llm modal", local_model)
logging.info("LLM model loaded")
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}""",
)
logging.info("Query prompt created")
retriever = MultiQueryRetriever.from_llm(
vector_retriever, llm, prompt=QUERY_PROMPT # Use the correct retriever
)
logging.info("Retriever created")
# RAG prompt
template = """Answer the question based ONLY on the following context:
{context}
Question: {question}
"""
prompt = ChatPromptTemplate.from_template(template)
logging.info("RAG prompt created")
chain = (
{"context": retriever, "question": RunnablePassthrough()}
| prompt
| llm
| StrOutputParser()
)
logging.info("Chain created")
response = chain.invoke("What are the 5 pillars of global cooperation?")
logging.info("Chain invoked")
logging.info(f"Response: {response}")
except Exception as e:
logging.error(f"An error occurred: {e}")
Error creating vector db: name 'retrieve_data' is not defined 2024-08-08 17:06:37,519 - ERROR - An error occurred: name 'retrieve_data' is not defined@NIrbhayMathur Я изменил это, посмотрим, что произойдет.
Это запрос ключа: 2024-08-08 17:09:22,501 - ERROR - Error creating vector db: 1 validation error for OpenAIEmbeddings __root__ Did not find openai_api_key, please add an environment variable `OPENAI_API_KEY` which contains it, or pass `openai_api_key` as a named parameter. (type=value_error) 2024-08-08 17:09:22,501 - ERROR - An error occurred: 1 validation error for OpenAIEmbeddings __root__ Did not find openai_api_key, please add an environment variable `OPENAI_API_KEY` which contains it, or pass `openai_api_key` as a named parameter. (type=value_error)
Я хочу использовать бесплатное использование. Пожалуйста, предложите бесплатное использование на данный момент. Спасибо
можете ли вы выбрать из этих моделей?
''' ОШИБКА. Произошла ошибка: необходимо предоставить функцию внедрения для вычисления внедрений.docs.trychroma.com/guides/embeddings'''
я могу выйти из системы, пока цепочка не будет создана chain = ( {"context": retriever, "question": RunnablePassthrough()} | prompt | llm | StrOutputParser() ) logging.info("Chain created") response = chain.invoke("What are the 5 pillars of global cooperation?") logging.info("Chain invoked") logging.info(f"Response: {response}")
это значит, что это работает? @NIrbhayMathur?
используете приведенный выше код, нет необходимости использовать платную версию Chroma?
Проблема с векторной базой данных выглядит решенной, но, судя по подсказке, я не получаю вывод. An error occurred: You must provide an embedding function to compute embeddings
@NIrbhayMathur, ты добавил это embedding=OllamaEmbedding('mxbai-embed-large')?
@NIrbhayMathur Я обновил код, убедитесь, что это последний код. вы используете, пожалуйста, когда мы решим эту проблему, можете ли вы не забыть отметить ответ?
НЕТ, это не работает. Нам нужно рассмотреть полный код. Давайте перейдем в чат, где я смогу поделиться с вами полным кодом.
Давайте продолжим обсуждение в чате.
это решает вашу проблему?