我正在尝试通过使用 RAG 在本地计算机上与 pdf 聊天来构建 ollama 用法。 我遵循了这个 GitHub 存储库: https://github.com/tonykipkemboi/ollama_pdf_rag/tree/main 问题是当我运行代码时,没有错误,但代码将在嵌入时停止并会之后停止。我已附上所有可能的日志以及 ollama 列表。
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]
下面是我的 ollama 列表:
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
帮助解决此问题。
代码在嵌入阶段停止,没有错误信息,这表明问题可能出在 Ollama 嵌入或与 Ollama 服务器的通信上。以下是可能的解决方法:
1. 检查 Ollama 服务器:
-
可用性:
确保 Ollama 服务器在的本地机器上运行,并且可以通过
http://localhost:11434
访问。 - 资源: 嵌入是一个需要大量资源的操作。如果的机器资源有限,Ollama 服务器可能会超时或崩溃。尝试为 Ollama 分配更多资源或在资源充足的机器上运行它。
- 日志: 检查 Ollama 服务器日志以获取有关潜在问题(如内存不足错误)的更多信息。
2. 疑难解答 Ollama 嵌入:
-
测试嵌入模型:
在继续之前,使用
ollama embed
命令测试的nomic-embed-text
模型是否按预期工作。 -
GPU 加速:
如果可用,请使用 GPU 加速来提高嵌入速度并减少 Ollama 服务器的负载。可以通过在启动 Ollama 服务器时传递
--gpu
标志来启用它。 -
批处理大小:
通过减少
OllamaEmbeddings
类中的batch_size
参数来尝试减少发送到 Ollama 服务器的数据量。这将减轻服务器的压力,但可能会增加整体嵌入时间。
3. 代码改进:
-
进度条:
虽然的代码中包含一个进度条,但它仅显示嵌入进度,而不显示向量数据库创建进度。考虑添加一个单独的进度条来监控
Chroma.from_documents
函数,以便更好地了解流程。 -
错误处理:
在
try...except
块中包含更多特定的错误处理,以捕获 Ollama 嵌入期间可能发生的任何潜在错误。这将提供更多关于问题根本原因的信息。
4. 其他建议:
- 升级 Ollama: 确保使用的是最新版本的 Ollama,因为较旧的版本可能包含错误或性能问题。
- 替代嵌入: 如果在使用 Ollama 嵌入时遇到持续问题,请考虑使用 LangChain 支持的其他嵌入模型,如 Hugging Face 嵌入或 OpenAI 嵌入。
通过遵循这些步骤,可以解决问题并使的 Ollama PDF RAG 管道在本地运行。记住要耐心等待,因为嵌入和向量数据库创建可能需要一些时间,尤其是在处理大型 PDF 文件时。
标签:python,large-language-model,python-embedding,ollama,rag From: 78838421