首页 > 编程问答 >Ollama 与 RAG 一起用于本地使用以与 pdf 聊天

Ollama 与 RAG 一起用于本地使用以与 pdf 聊天

时间:2024-08-08 16:20:46浏览次数:16  
标签:python large-language-model python-embedding ollama rag

我正在尝试通过使用 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

相关文章

  • python代码混淆与编译
    python代码混淆、编译与打包考虑到生产环境部署,而python作为解释性语言,对源码没有任何保护。此文记录探索如何保护源码的过程。代码混淆代码混淆基本上就是把代码编译为字节码。工具有两种:py_compilepyarmorpy_compile示例:py_compile.compile(src_pyfile,dst_pyfile......
  • 在python中将二维数组转换为彩色图像
    我有像这样的2d整数列表:list1=[[1,30,50],[21,45,9],[97,321,100]]下一步我要将其转换为numpy数组:myarr=np.asarray(list1)下一步我将使用PIL将其转换为图像,如下所示:img=Image.fromarray(myarr,"I")img.save("my.png")问题是我不想要灰......
  • Python 汉字区位码、字符串 相互转换
    Python汉字区位码、字符串相互转换区位码简介GB2312所有字符放在一张94x94的矩阵中,矩阵中的每个位置对应一个字符(有的位置是空的,没有字符)。区位码为十进制四位数,前后两位分别代表该字符在矩阵中的行、列坐标(均从1算起),如4528“图”字,为45行、28列上的字符。能通过对区位码进......
  • python3如何使用‘pexpect’自动与串口交互?
    如何在Windows中使用python'pexpect'自动与串口(例如:COM3)交互并在开机时通过串口登录嵌入式开发板时输入用户密码?ser=serial.Serial(port=serial_port,baudrate=baudrate,bytesize=bytesize,parity=parity,stopbits=stopbits,timeout=timeout)channel=pexpect.fdpexp......
  • Python 熊猫迭代
    代码:#Importcarsdataimportpandasaspdcars=pd.read_csv('cars.csv',index_col=0)#Adaptforloopforlab,rowincars.iterrows():print(f"{[lab]}:{row['cars_per_cap']}")输出:['US']:809['A......
  • 【第九节】python中xml解析和json编解码
    目录一、PythonXML解析1.1什么是XML1.2Python对XML的解析方法1.3SAX解析xml1.4xml.dom解析xml1.6ElementTree解析XML二、Python编解码json2.1什么是json2.2使用json库2.3使用第三方库Demjson一、PythonXML解析1.1什么是XML        XML,......
  • 从 python 设置运算符符号到方法名称的映射是什么?它们与文档不匹配
    我创建了自己的Customset类,它实现了python集合的几乎所有方法。当我使用此自定义集的实例时,许多集合运算符都会失败。它们会失败,并显示类似以下内容的内容:TypeError:unsupportedoperandtype(s)for-:'Customset'andCustomset'orTypeError:'<='......
  • 21.python函数(return)
    return一、return语句1、return是指定一个返回值2、在python中创建一个函数,可以用return语句指定返回的的值,这个返回值可以是任意的类型3、return语句在同一个函数中可以出现多次,但是只有有一个得到执行,就会直接结束函数的执行。return后面的语句不执行了4、return的格式re......
  • 【Python代码】如何根据出生日期计算出年龄?
    哈喽,大家好,木易巷来啦!假设我们有一个包含出生日期的Excel文件,需要计算每个人的年龄,你会怎么做呢?具体情况如下图:今天木易巷分享通过Python及其强大的pandas库,来实现从Excel文件中读取日期数据,计算年龄,并将结果存储回Excel文件中的过程。话不多说,开干!▍1、环境准备在开......
  • python 无法解密重音字符(如 è),我该怎么办?
    我正在解决这个ctf,您必须使用PyCryptodome模块通过DES加密消息。消息是“Launghezzadiquestafrasenonèdivisibileper8”(意大利语)。我无法将此消息转换为字节,因为重音字符不包含在utf-8中(我认为这就是解释)。有人可以帮我加密消息吗?fromCrypto.Util.Paddingimp......