Type something to search...
释放本地 Rag 的力量:与 Deepseek R1 和 Ollama 深入探讨!

释放本地 Rag 的力量:与 Deepseek R1 和 Ollama 深入探讨!

使用您的数据构建本地 RAG

介绍

在本文中,我们将探讨如何使用您自己的数据构建本地 RAG (Retrieval-Augmented Generation) 模型。这种方法允许您定制模型,以更好地适应您的特定用例。

先决条件

在开始之前,请确保您具备以下条件:

  • Python 3.7 或更高版本
  • 访问您的数据集
  • 对机器学习概念的基本理解

构建本地 RAG 的步骤

  1. 设置您的环境

    首先,您需要设置您的 Python 环境。您可以使用 venvconda 来实现这一目的。

    python -m venv rag-env
    source rag-env/bin/activate  # 在 Windows 上使用 `rag-env\Scripts\activate`
    
  2. 安装所需库

    使用 pip 安装必要的库:

    pip install transformers datasets faiss-cpu
    
  3. 加载您的数据集

    将您的数据集加载到 Python 脚本中。例如,如果您有一个 CSV 文件:

    import pandas as pd
    
    data = pd.read_csv('your_dataset.csv')
    
  4. 预处理数据

    根据需要预处理您的数据。这可能包括清理文本、标记化等。

    from transformers import AutoTokenizer
    
    tokenizer = AutoTokenizer.from_pretrained('bert-base-uncased')
    tokens = tokenizer(data['text_column'].tolist(), padding=True, truncation=True, return_tensors='pt')
    
  5. 构建 RAG 模型

    使用 Hugging Face Transformers 库构建 RAG 模型。

    from transformers import RagTokenizer, RagRetriever, RagSequenceForGeneration
    
    rag_tokenizer = RagTokenizer.from_pretrained('facebook/rag-sequence')
    rag_retriever = RagRetriever.from_pretrained('facebook/rag-sequence', index_name="custom", passages=data['text_column'].tolist())
    rag_model = RagSequenceForGeneration.from_pretrained('facebook/rag-sequence')
    
  6. 训练模型

    使用您的数据集训练 RAG 模型。确保定义您的训练循环和优化策略。

    from transformers import Trainer, TrainingArguments
    
    training_args = TrainingArguments(
        output_dir='./results',
        num_train_epochs=3,
        per_device_train_batch_size=16,
        save_steps=10_000,
        save_total_limit=2,
    )
    
    trainer = Trainer(
        model=rag_model,
        args=training_args,
        train_dataset=your_train_dataset,
    )
    
    trainer.train()
    

结论

使用您自己的数据构建本地 RAG 模型可以显著提高其在特定任务中的性能。通过遵循上述步骤,您可以定制模型以更好地满足您的需求。

参考文献

  • Hugging Face Transformers 文档
  • 关于 RAG 模型的研究论文

这篇关于使用您的数据构建本地 RAG 的文章到此结束。

使用 DeepSeek R1 和 Ollama 构建强大的 RAG 系统

DeepSeek R1Ollama 提供强大的工具用于构建 Retrieval-Augmented Generation (RAG) 系统。本指南涵盖了使用这些技术开发 RAG 应用程序的设置、实施和最佳实践。

为什么RAG系统是游戏规则的改变者

Retrieval-augmented generation (RAG)系统结合了搜索和generative AI的最佳特性,使得响应能够考虑上下文,既精确又准确。借助像DeepSeek R1Ollama这样的工具,创建一个RAG系统不再令人生畏。无论您是在构建聊天机器人、知识助手,还是一个AI驱动的搜索引擎,本指南为您提供了所需了解的一切。

Prerequisites

您将学习的内容

  • 设置 DeepSeek R1Ollama 以实现 RAG
  • 实现文档处理、向量存储和查询管道。
  • 优化性能、相关性和用户体验。

构建 RAG 管道的步骤

1. 设置环境和导入库

确保您已安装所需的 Python 包。您可以使用以下命令安装它们:

pip install langchain-core langchain-community langchain-ollama langchain-huggingface faiss-cpu psutil
  • 导入库
from typing import List
from langchain_core.documents import Document
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough
from langchain_core.prompts import ChatPromptTemplate
from langchain_community.document_loaders import TextLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_huggingface import HuggingFaceEmbeddings
from langchain_ollama.llms import OllamaLLM
from langchain_community.vectorstores import FAISS
import logging
import psutil
import os

2. 初始化 RAGPipeline 类

RAGPipeline 类管理整个过程,包括内存监控、文档加载、嵌入生成和查询模型。

class RAGPipeline:
    def __init__(self, model_name: str = "llama2:7b-chat-q4", max_memory_gb: float = 3.0):
        self.setup_logging()
        self.check_system_memory(max_memory_gb)

        self.llm = OllamaLLM(model="deepseek-r1:8b")

        self.embeddings = HuggingFaceEmbeddings(
            model_name="sentence-transformers/all-mpnet-base-v2",
            model_kwargs={'device': 'cpu'}  
        )

        self.prompt = ChatPromptTemplate.from_template("""
            Answer the question based only on the following context. Be concise.
            If you cannot find the answer in the context, say "I cannot answer this based on the provided context."

            Context: {context}
            Question: {question}
            Answer: """)

3. 内存管理和日志记录

为了防止在低内存环境中崩溃,我们在执行之前记录并检查可用内存。

def setup_logging(self):
    logging.basicConfig(level=logging.INFO)
    self.logger = logging.getLogger(__name__)

def check_system_memory(self, max_memory_gb: float):
    available_memory = psutil.virtual_memory().available / (1024 ** 3)
    self.logger.info(f"Available system memory: {available_memory:.1f} GB")
    if available_memory < max_memory_gb:
        self.logger.warning("Memory is below recommended threshold.")

4. 加载和拆分文档

我们使用 TextLoaderRecursiveCharacterTextSplitter 来高效处理文档。

def load_and_split_documents(self, file_path: str) -> List[Document]:
    loader = TextLoader(file_path)
    documents = loader.load()

    text_splitter = RecursiveCharacterTextSplitter(
        chunk_size=500,
        chunk_overlap=50,
        length_function=len,
        add_start_index=True,
    )
    splits = text_splitter.split_documents(documents)
    self.logger.info(f"Created {len(splits)} document chunks")
    return splits

5. 使用 FAISS 创建向量存储

我们使用 FAISS 进行高效的文档检索,并以较小的批次处理文档。

def create_vectorstore(self, documents: List[Document]) -> FAISS:
    batch_size = 32
    vectorstore = FAISS.from_documents(documents[:batch_size], self.embeddings)

    for i in range(batch_size, len(documents), batch_size):
        batch = documents[i:i + batch_size]
        vectorstore.add_documents(batch)
        self.logger.info(f"Processed batch {i//batch_size + 1}")
    
    return vectorstore

6. 设置 RAG 链

我们定义检索机制以高效获取相关文档。

def setup_rag_chain(self, vectorstore: FAISS):
    retriever = vectorstore.as_retriever(search_type="similarity", search_kwargs={"k": 2, "fetch_k": 3})

def format_docs(docs):
    return "\\n\\n".join(doc.page_content for doc in docs)

rag_chain = (
    {"context": retriever | format_docs, "question": RunnablePassthrough()}
    | self.prompt
    | self.llm
    | StrOutputParser()
)
return rag_chain

7. 查询带有内存监控的模型

我们在执行查询之前记录内存使用情况。

def query(self, chain, question: str) -> str:
    memory_usage = psutil.Process(os.getpid()).memory_info().rss / 1024 / 1024
    self.logger.info(f"Memory usage: {memory_usage:.1f} MB")
    return chain.invoke(question)

8. 整合所有内容

我们初始化 RAG 管道,处理文档,并运行一个示例查询。

def main():
    rag = RAGPipeline(model_name="deepseek-r1:8b", max_memory_gb=3.0)

    documents = rag.load_and_split_documents("data/knowledge.txt")
    vectorstore = rag.create_vectorstore(documents)
    chain = rag.setup_rag_chain(vectorstore)

    question = "What is AI?"
    response = rag.query(chain, question)
    print(f"Question: {question}\\nAnswer: {response}")

if __name__ == "__main__":
    main()

结论

本博客详细介绍了如何使用 LangChainOllamaFAISSHugging Face embeddings 构建一个内存高效的 RAG pipeline。通过优化文档分块、向量存储和内存监控,这种方法确保即使在资源有限的环境中也能实现高效的 AI 驱动文档检索。

参考文献

Related Posts

结合chatgpt-o3-mini与perplexity Deep Research的3步提示:提升论文写作质量的终极指南

结合chatgpt-o3-mini与perplexity Deep Research的3步提示:提升论文写作质量的终极指南

AI 研究报告和论文写作 合并两个系统指令以获得两个模型的最佳效果 Perplexity AI 的 Deep Research 工具提供专家级的研究报告,而 OpenAI 的 ChatGPT-o3-mini-high 擅长推理。我发现你可以将它们结合起来生成令人难以置信的论文,这些论文比任何一个模型单独撰写的都要好。你只需要将这个一次性提示复制到 **

阅读更多
让 Excel 过时的 10 种 Ai 工具:实现数据分析自动化,节省手工作业时间

让 Excel 过时的 10 种 Ai 工具:实现数据分析自动化,节省手工作业时间

Non members click here作为一名软件开发人员,多年来的一个发现总是让我感到惊讶,那就是人们还在 Excel

阅读更多
使用 ChatGPT 搜索网络功能的 10 种创意方法

使用 ChatGPT 搜索网络功能的 10 种创意方法

例如,提示和输出 你知道可以使用 ChatGPT 的“搜索网络”功能来完成许多任务,而不仅仅是基本的网络搜索吗? 对于那些不知道的人,ChatGPT 新的“搜索网络”功能提供实时信息。 截至撰写此帖时,该功能仅对使用 ChatGPT 4o 和 4o-mini 的付费会员开放。 ![](https://images.weserv.nl/?url=https://cdn-im

阅读更多
掌握Ai代理:解密Google革命性白皮书的10个关键问题解答

掌握Ai代理:解密Google革命性白皮书的10个关键问题解答

10 个常见问题解答 本文是我推出的一个名为“10 个常见问题解答”的新系列的一部分。在本系列中,我旨在通过回答关于该主题的十个最常见问题来分解复杂的概念。我的目标是使用简单的语言和相关的类比,使这些想法易于理解。 图片来自 [Solen Feyissa](https://unsplash.com/@solenfeyissa?utm_source=medium&utm_medi

阅读更多
在人工智能和技术领域保持领先地位的 10 项必学技能 📚

在人工智能和技术领域保持领先地位的 10 项必学技能 📚

在人工智能和科技这样一个动态的行业中,保持领先意味着不断提升你的技能。无论你是希望深入了解人工智能模型性能、掌握数据分析,还是希望通过人工智能转变传统领域如法律,这些课程都是你成功的捷径。以下是一个精心策划的高价值课程列表,可以助力你的职业发展,并让你始终处于创新的前沿。 1. 生成性人工智能简介课程: [生成性人工智能简介](https://genai.works

阅读更多
揭开真相!深度探悉DeepSeek AI的十大误区,您被误导了吗?

揭开真相!深度探悉DeepSeek AI的十大误区,您被误导了吗?

在AI军备竞赛中分辨事实与虚构 DeepSeek AI真的是它所宣传的游戏规则改变者,还是仅仅聪明的营销和战略炒作?👀 虽然一些人将其视为AI效率的革命性飞跃,但另一些人则认为它的成功建立在借用(甚至窃取的)创新和可疑的做法之上。传言称,DeepSeek的首席执行官在疫情期间像囤积卫生纸一样囤积Nvidia芯片——这只是冰山一角。 从其声称的550万美元培训预算到使用Open

阅读更多
Type something to search...