Оллама с RAG для локального использования для общения в формате PDF

Я пытаюсь наладить использование олламы, используя 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

Помогите в решении этого вопроса.

это решает вашу проблему?

Derek Roberts 07.08.2024 08:14

Привет @DerekRoberts. После добавления vector_db.persist() разницы нет. Тот же конвейер останавливается при внедрении.

NIrbhay Mathur 07.08.2024 12:17

Я обновил код. Некоторые проблемы, которые я увидел в вашем коде, заключаются в том, что вы неправильно передаете модель и не встраиваете свои документы перед передачей их в ChromaDB.

Derek Roberts 07.08.2024 12:33
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, можете ли вы предоставить полный код? Я получаю вышеуказанную ошибку.
NIrbhay Mathur 07.08.2024 13:35

Хорошо, я изменю код, где вы получаете ошибку? ваши куски представляют собой список строк? посмотрите на это документы

Derek Roberts 07.08.2024 13:42
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") Вот код, который выдает ошибку.
NIrbhay Mathur 07.08.2024 13:46

Хорошо, я обновлю код, посмотрим, что произойдет после.

Derek Roberts 07.08.2024 13:50

Новая ошибка 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'

NIrbhay Mathur 07.08.2024 13:53

Я думаю, теперь вы можете использовать Chroma для поиска своих документов. Я предполагаю, что что-то не так с используемой вами моделью, но не совсем уверен.

Derek Roberts 07.08.2024 14:20

Эта проблема решена. Теперь ``` 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 раза и останавливается.

NIrbhay Mathur 07.08.2024 15:01

так как проблема решена, пожалуйста, не могли бы вы отметить ответ, спасибо

Derek Roberts 07.08.2024 15:03

Нет, я имею в виду, что проблема все та же, конвейер не работает. Код останавливается после встраивания блока.

NIrbhay Mathur 07.08.2024 15:06

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

Derek Roberts 07.08.2024 15:11

Данные представлены в формате pdf. Вы можете попробовать вышеупомянутый код с любым PDF-файлом.

NIrbhay Mathur 07.08.2024 15:12

ок, пожалуйста, не могли бы вы распечатать это new_embedding, что оно вам дает? Он не должен распечатывать то, что вы на самом деле отправили, вы использовали мой код или изменили его?

Derek Roberts 07.08.2024 15:16

Вот результат «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 Здесь слишком много значений, чтобы их можно было добавить. Я использую предоставленный вами код.

NIrbhay Mathur 08.08.2024 07:28

похоже, что Chroma устарела может быть, именно поэтому она не работает, в городе появился новый парень, который ее заменяет chromadb Я обновил код, так что это должно работать. Вам придется установить chromadb.

Derek Roberts 08.08.2024 08:11

Новая ошибка с 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?

NIrbhay Mathur 08.08.2024 09:17

ты используешь гуглколаб?

Derek Roberts 08.08.2024 09:21

Нет, это на моей локальной машине.

NIrbhay Mathur 08.08.2024 09:22

ок, пожалуйста, можешь pip install poppler-utils дать посмотреть, что произойдет? Насколько велик ваш PDF-файл?

Derek Roberts 08.08.2024 09:27

та же ошибка. После установки pip install poppler-utils.

NIrbhay Mathur 08.08.2024 09:28

Я попробовал эту ссылку для попплера, но та же ошибка. stackoverflow.com/questions/53481088/…

NIrbhay Mathur 08.08.2024 09:36

блин, это серьезно, пробовали ли вы другие модели встраивания, кроме nomic-embed-text таких, как openAIembeddings, которые вы используете?

Derek Roberts 08.08.2024 09:42

нет, я планировал использовать nomic-embed-text согласно их сравнительному анализу. Я не уверен в openAIembeddigs. Можете ли вы предоставить код для этого. Посмотрим, сработает ли это. Спасибо

NIrbhay Mathur 08.08.2024 09:44

Давайте продолжим обсуждение в чате.

Derek Roberts 08.08.2024 09:59
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
26
141
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я предлагаю изменить векторную базу на 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
NIrbhay Mathur 08.08.2024 13:37

@NIrbhayMathur Я изменил это, посмотрим, что произойдет.

Derek Roberts 08.08.2024 13:39

Это запрос ключа: 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)

NIrbhay Mathur 08.08.2024 13:42

Я хочу использовать бесплатное использование. Пожалуйста, предложите бесплатное использование на данный момент. Спасибо

NIrbhay Mathur 08.08.2024 13:43

можете ли вы выбрать из этих моделей?

Derek Roberts 08.08.2024 13:57

''' ОШИБКА. Произошла ошибка: необходимо предоставить функцию внедрения для вычисления внедрений.docs.trychroma.com/guides/embeddings'''

NIrbhay Mathur 08.08.2024 16:38

я могу выйти из системы, пока цепочка не будет создана 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}")

NIrbhay Mathur 08.08.2024 16:39

это значит, что это работает? @NIrbhayMathur?

Derek Roberts 08.08.2024 16:44

используете приведенный выше код, нет необходимости использовать платную версию Chroma?

Derek Roberts 08.08.2024 16:47

Проблема с векторной базой данных выглядит решенной, но, судя по подсказке, я не получаю вывод. An error occurred: You must provide an embedding function to compute embeddings

NIrbhay Mathur 08.08.2024 16:52

@NIrbhayMathur, ты добавил это embedding=OllamaEmbedding('mxbai-embed-large')?

Derek Roberts 08.08.2024 16:55

@NIrbhayMathur Я обновил код, убедитесь, что это последний код. вы используете, пожалуйста, когда мы решим эту проблему, можете ли вы не забыть отметить ответ?

Derek Roberts 08.08.2024 16:57

НЕТ, это не работает. Нам нужно рассмотреть полный код. Давайте перейдем в чат, где я смогу поделиться с вами полным кодом.

NIrbhay Mathur 08.08.2024 17:06

Давайте продолжим обсуждение в чате.

NIrbhay Mathur 08.08.2024 17:06

Другие вопросы по теме