LLM - Ollama+Deepseek R1+Nomic-Embed-Text+AnythingLLM搭建本地私有RAG知识库


在这里插入图片描述

Pre

LLM - 本地 Ollama 部署DeepSeek

LLM - 使用 Ollama 和 Chatbox 实现 DeepSeek R1 的本地 AI 助手

LLM - 白话RAG(Retrieval-Augmented Generation)

在这里插入图片描述


安装Ollama和DeepSeek

参考 LLM - 本地 Ollama 部署DeepSeek


获取向量模型

在这里插入图片描述

https://ollama.com/library/nomic-embed-text

在这里插入图片描述
在这里插入图片描述
ollama pull nomic-embed-text 是用于从 Ollama 的模型仓库下载 ​Nomic-Embed-Text 嵌入模型的命令。
该模型的核心作用是将文本(如句子、段落或文档)转换为高维向量(Embeddings)​,这些向量能捕捉文本的语义信息,从而支持后续的语义搜索、聚类或相似度计算。

技术原理

  • 嵌入模型(Embedding Model)
    通过深度学习将文本映射到固定长度的向量(如768维),语义相近的文本在向量空间中距离更近。
    例如:

    • “机器学习” ➔ 向量 A
    • “深度学习” ➔ 向量 B
    • “苹果手机” ➔ 向量 C
    • 向量 A 和 B 的距离会比 A 和 C 更近。
  • Nomic-Embed-Text 特点
    该模型由 Nomic AI 开发,专注于高精度文本表征,适合对语义理解要求高的任务(如RAG知识库检索).


在 RAG 系统中的作用

在 RAG(检索增强生成)流程中,该模型负责以下关键步骤:

  1. 文档分块向量化
    将知识库中的文档分割为短文本块(Chunks),并生成对应的向量。

  2. 构建向量索引
    将所有文本块的向量存入向量数据库(如FAISS、Chroma),建立高效的检索索引。

  3. 语义检索
    当用户提问时,将问题转换为向量,并从向量库中快速找到最相关的文本块,作为生成答案的上下文。

为什么需要单独下载

RAG 系统需要两个核心模型:

  • 生成模型(如 DeepSeek R1):负责生成最终答案。
  • 嵌入模型(如 Nomic-Embed-Text):负责检索相关上下文。

二者分工不同,需分别下载。

性能优化

专用嵌入模型通常比生成模型更轻量,检索效率更高(如 Nomic-Embed-Text 仅需 200MB 内存)

在这里插入图片描述
ollama pull nomic-embed-text 是搭建本地 RAG 系统的必要步骤,它为文本检索提供了高效的语义理解能力。通过该模型,RAG 系统能够精准定位相关知识片段,从而提升生成答案的准确性和专业性。


安装AnythingLLM

访问 https://anythingllm.com/desktop

在这里插入图片描述
AnythingLLM 是一个功能强大且灵活的开源平台,旨在帮助用户轻松构建和部署基于大型语言模型 (LLM) 的私有化应用程序。

它提供了直观的用户界面、丰富的功能以及高度的可定制性,即使是没有任何编程经验的用户也能快速上手。


设置AnythingLLM

在这里插入图片描述

LLM 首选项

本地模型

在这里插入图片描述


API ONLINE

在这里插入图片描述


选择向量模型

本地

在这里插入图片描述

线上模型API

在这里插入图片描述


选择向量数据库

在这里插入图片描述


文本分割

在这里插入图片描述
在RAG(Retrieval-Augmented Generation)中,**文本拆分(Text Splitting)分块(Chunking)**是预处理文档的核心步骤,其作用主要体现在以下方面:


一、核心作用

  1. 适应模型处理限制

    • 大语言模型(LLM)和向量数据库对输入长度有严格限制(如图中设置的8192字符/块)。拆分文本可将长文档分割为符合模型处理能力的片段,避免因超长输入导致的错误或信息丢失。
  2. 提升检索精度

    • 分块后,每个文本块会生成独立的向量嵌入(Embedding)。更小的语义单元能精准匹配用户查询的关键信息(例如检索时直接定位到相关段落而非整篇文档)。
  3. 保留上下文连贯性

    • 文本块重叠(如图中设置的20字符重叠)是关键设计:相邻块之间保留部分重复内容,避免因拆分割裂语义(如一个句子被截断在块末尾,导致下一块丢失前半句的语境)。

二、技术实现原理

在这里插入图片描述

  • 文本块大小(Chunk Size)
    平衡信息完整性与计算效率:

    • 过大(如超过模型限制):导致信息冗余,检索速度下降。
    • 过小(如仅数百字符):破坏语义完整性(例如拆分表格、代码段或复杂句式)。
  • 文本块重叠(Chunk Overlap)
    通过重叠部分实现“滑动窗口”效果:

    • 确保关键信息(如段落过渡句、专业术语)在多个块中重复出现,降低检索遗漏风险。
    • 缓解块边界处的语义断裂问题(例如对话场景中,重叠可保留发言者的切换逻辑)。

三、在RAG流程中的具体应用

  1. 数据预处理阶段

    • 文档被拆分为多个语义块,分别生成向量后存入数据库,作为后续检索的“知识库”。
  2. 检索阶段

    • 用户查询被映射为向量,与数据库中的文本块向量进行相似度匹配,返回最相关的若干块。
  3. 生成阶段

    • LLM基于检索到的文本块生成回答,拆分和重叠设计确保模型获取的上下文既完整又无冗余。

四、参数设置建议

  • 8192字符块大小:适用于长文档(如论文、报告),需结合模型输入限制(如GPT-4的32k token)。
  • 20字符重叠:适合保留短句衔接(如技术术语、专有名词),但对长段落可能需增大重叠值。

小结

文本拆分与分块是RAG实现高效检索和精准生成的基础,其设计直接影响系统性能。合理的参数配置(块大小、重叠量)需结合具体场景(如文档类型、模型能力)进行调优,以平衡语义完整性与计算效率。


搭建RAG本地知识库

在这里插入图片描述

现在已经安装并配置好了Ollama、Deepseek R1、Nomic-Embed-Text和AnythingLLM,接下来我们将它们结合起来搭建一个本地的私有RAG知识库。

在这里插入图片描述

准备数据

支持的数据格式

  • ​本地文档:PDF/TXT/Markdown/Word/代码文件
  • ​​网页内容:HTML/JSON/XML
  • ​​数据库导出:CSV/Excel

我们准备了两篇小日记

2025313日 星期四 多云转晴

晨光从窗帘缝隙里钻进来时,我摸到床头柜上的智能手环,6:30的荧光数字在昏暗里格外清晰。厨房里咖啡机已经自动启动,烘焙坚果的香气顺着门缝飘进来——昨晚睡前设置的预约程序总是很可靠。站在料理台前切牛油果时,手机弹窗亮起:“今日花粉浓度中等,建议佩戴口罩”,窗外的梧桐树正在抽芽,毛茸茸的嫩绿在晨风里晃成一片虚影。

八点整的地铁比往常拥挤,全息广告在玻璃窗上流动,隔壁穿西装的男人正对着空气比划手势,大概在调整隐形眼镜式投影的报表页面。办公室新来的实习生小夏抱着文件小跑过来,文件夹侧边还沾着楼下咖啡店的焦糖酱,她额角沁着细汗说项目数据终于跑通了的时候,落地窗外恰好有群白鸽掠过三十七层的天空。

午休时视频电话突然弹出来,女儿在幼儿园的樱花树下举着蜡笔画,粉色云团里歪歪扭扭写着“给妈妈”。她背后传来老师组织孩子们唱春游安全歌的童声,混合着食堂微波炉转寿司饭团的叮咚声,让我恍惚闻到便当盒里梅子饭团的酸涩清香。

下班时发现工位抽屉里的备用伞不见了,春雨却来得猝不及防。地铁口卖烤红薯的老伯掀开铁皮桶,甜香的白雾漫过潮湿的台阶。走到小区门口时,路灯恰好在七点零三分亮起,飞虫在光晕里织出金色的网,保安亭顶棚的雨滴正巧落进脖颈,凉得让人想起女儿早上偷偷塞进我包里的薄荷糖。

此刻窝在飘窗垫子上写日记,智能家居系统把室温维持在23℃,加湿器吐出的水雾带着鼠尾草气息。手边热可可表面的奶泡已经塌陷成涟漪,而明日要交的提案还差最后两页PPT——但此时此刻,窗台上水培的绿萝抽出第七片新叶,春天正在玻璃上凝结成蜿蜒的水痕。
2025312日 星期三 晴

晨光刚在窗帘缝里探出头,智能手表就在枕边微微震动。春分前的白昼渐长,六点四十五分的天空竟透出蟹壳青的亮色。推开窗户时,楼下的樱花树突然扑簌簌落下几片花瓣,像是被我惊扰的晨梦。

地铁早高峰依然拥挤,但新开通的16号线让通勤时间缩短了二十分钟。车厢里飘着拿铁和羊角包的香气,前排女孩的帆布包上别着樱花季限定徽章,金属表面折射的光斑在我膝盖上跳跃。突然想起七年前初到这座城市时,挤在罐头般的地铁里连手机都掏不出来的窘迫,如今连纸质书都能从容翻开。

午休时在茶水间遇见刚休完产假的琳达。她捧着保温杯神秘兮兮地笑,说在哺乳期读完了三本育儿书和两本悬疑小说。"当妈妈后时间都成了碎片,但每个碎片都像钻石。"玻璃幕墙外的玉兰正在怒放,花瓣边缘卷着淡紫色的光晕,让我想起女儿刚出生时皱巴巴的小拳头。

下班后特意绕道老城区买桂花酒酿。巷口修车铺的老张还在用搪瓷缸泡茶,看见我就举起缸子:"姑娘,新腌的雪里蕻要不要带点?"暮色里的炊烟裹着谁家炒腊肉的焦香,梧桐树影在青石板路上碎成流动的星河。

此刻窝在飘窗敲下这些字时,发现智能手环记录的步数比昨天少了八百步。可是有什么关系呢?女儿把乐高积木搭成了歪歪扭扭的"城堡",正踮着脚往我咖啡杯里放棉花糖。春夜的风带着未褪尽的凉意,却把樱花瓣吹落在刚写完的会议纪要上,像谁悄悄盖下的邮戳。

构建索引

使用Nomic-Embed-Text将知识库中的文档转换为向量表示,并构建一个索引

新建工作区

在这里插入图片描述


上传本地文档

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


聊天设置

在这里插入图片描述

在这里插入图片描述


检索相关信息

在这里插入图片描述
在这里插入图片描述

问一个知识库中不存在的内容

在这里插入图片描述


总结

通过以上步骤,选择本地ollama部署的大模型的话,就可以部署一个完全本地的RAG系统。此方案的优势在于:

  • ​数据隐私:所有处理均在本地完成。
  • ​​灵活扩展:支持替换其他Ollama模型(如Llama 3、Mistral)。
  • ​​成本可控:无需支付API费用

在这里插入图片描述

<think>好的,用户之前已经询问过如何使用LangChain搭建RAG系统,现在他想知道如何结合本地Ollama部署的embedding模型nomic-embed-text和推理模型deepseek-r1:8b来构建RAG。我需要先回顾之前的回答,看看有没有需要调整的地方,确保这次回答在结构上一致,但针对本地模型进行调整。 首先,用户明确提到了使用Ollama本地部署的两个模型:nomic-embed-text作为embedding模型,deepseek-r1:8b作为推理模型。这意味着我需要指导用户如何将这些本地模型集成到LangChain的流程中,替换之前提到的HuggingFaceEmbeddings和OpenAI等云端服务。 接下来,我需要考虑Ollama在LangChain中的支持情况。记得LangChain有Ollama的集成,可以通过Ollama本地服务来加载模型。所以可能需要使用langchain.llms.Ollama和langchain.embeddings.OllamaEmbeddings相关的模块。 然后,文档加载和处理的步骤应该和之前类似,比如使用PyPDFLoader或WebBaseLoader,这部分不需要改变。文本分割也是一样的,使用RecursiveCharacterTextSplitter,所以这部分可以保持原样。 在向量化与存储部分,之前用的是HuggingFaceEmbeddings,现在需要替换为Ollama提供的nomic-embed-text模型。需要确认Ollama是否支持这个模型,以及如何正确调用。可能需要使用OllamaEmbeddings并指定模型名称。 对于推理模型,之前用的是OpenAI,现在要替换为本地Ollamadeepseek-r1:8b。这里需要使用Ollama类来初始化模型,并确保模型名称正确,同时可能需要调整参数,比如temperature等。 另外,用户可能是在本地环境运行,需要确保Ollama服务已经正确安装并运行,并且所需的模型已经下载到本地。可能需要提醒用户先通过ollama pull来获取模型。 还要注意代码示例的正确性,比如导入语句是否正确,参数是否匹配。例如,使用OllamaEmbeddings时,可能需要传递base_url参数,如果Ollama服务不在默认的端口上。 另外,用户可能需要了解如何启动Ollama服务,或者是否需要额外的配置步骤。但根据之前的问题,用户可能已经部署好了,所以重点放在如何在LangChain中使用这些模型。 最后,优化策略和应用场景部分可能需要调整,以反映使用本地模型的优势,比如数据隐私、离线使用等,以及可能的性能考虑,比如响应时间和硬件需求。 需要检查是否有潜在的误区,例如模型名称是否正确,Ollama的模型库中是否真的有nomic-embed-textdeepseek-r1:8b,或者是否有拼写错误。例如,deepseek-r1是否正确的模型名称,或者是否应为deepseek-r1-8b?需要确认。 总结步骤应该是: 1. 确认Ollama服务运行,模型已下载。 2. 文档加载和分割(同之前)。 3. 使用OllamaEmbeddings加载nomic-embed-text生成向量,存储到FAISS。 4. 配置检索器。 5. 使用Ollamadeepseek-r1:8b作为LLM,构建RAG链。 需要确保代码示例中正确引用了这些模型,并给出必要的参数,比如base_url如果Ollama服务在非默认位置的话。例如,如果Ollama本地localhost:11434,可能不需要特别指定,但如果有自定义配置则需要。 可能还需要提醒用户安装必要的依赖,如langchain-community,ollama等,如果之前的回答中没有提到的话。 最后,需要测试代码是否可行,是否存在常见的错误,比如模型名称错误、服务未启动等,并在回答中给出相应的提示或解决方案。</think>以下是基于本地Ollama部署的 **nomic-embed-text**(Embedding模型)与 **deepseek-r1:8b**(推理模型)搭建RAG系统的分步指南,重点说明本地模型集成方法: --- ### 前置条件 1. **Ollama已安装**:确保本地已部署Ollama服务([安装文档](https://ollama.ai/)) 2. **模型下载**: ```bash ollama pull nomic-embed-text # 下载Embedding模型 ollama pull deepseek-r1:8b # 下载推理模型 ``` --- ### 分步实现代码 #### 1. 初始化本地模型 ```python from langchain_community.embeddings import OllamaEmbeddings from langchain_community.llms import Ollama # 初始化Embedding模型(nomic-embed-textembeddings = OllamaEmbeddings( model="nomic-embed-text", # Ollama中注册的模型名称 base_url="http://localhost:11434" # Ollama服务地址 ) # 初始化推理模型(deepseek-r1:8b) llm = Ollama( model="deepseek-r1:8b", temperature=0.3, # 控制生成随机性(0-1,值越小越确定) num_ctx=4096 # 上下文窗口大小 ) ``` #### 2. 文档处理与向量化(与云端流程相同) ```python from langchain_community.document_loaders import PyPDFLoader from langchain_text_splitters import RecursiveCharacterTextSplitter # 加载PDF文档 loader = PyPDFLoader("论文.pdf") documents = loader.load() # 文本分块 text_splitter = RecursiveCharacterTextSplitter( chunk_size=500, chunk_overlap=50 ) splits = text_splitter.split_documents(documents) # 向量存储(使用FAISS) from langchain_community.vectorstores import FAISS vectorstore = FAISS.from_documents(splits, embeddings) ``` #### 3. 构建RAG链 ```python from langchain.chains import RetrievalQA # 创建检索器 retriever = vectorstore.as_retriever(search_kwargs={"k": 3}) # 组装RAGrag_chain = RetrievalQA.from_chain_type( llm=llm, chain_type="stuff", retriever=retriever, return_source_documents=True # 返回参考文档 ) ``` --- ### 关键优化技巧 1. **Embedding模型适配**: - Nomic-embed-text支持**8192 tokens长上下文**,可适当增大`chunk_size` - 若需更高精度,尝试调整`model_kwargs={"device": "cuda"}`(需GPU支持) 2. **推理模型调优**: ```python llm = Ollama( model="deepseek-r1:8b", temperature=0.3, # 降低生成随机性 top_p=0.9, # 控制生成多样性 stop=["<|endoftext|>"] # 添加停止符 ) ``` 3. **性能监控**: ```python # 测试响应速度 import time start = time.time() response = rag_chain.invoke("量子计算的核心优势是什么?") print(f"响应时间: {time.time()-start:.2f}s") ``` --- ### 常见问题解决 | 问题现象 | 解决方案 | |-------------------------|----------------------------------| | `ConnectionError` | 检查Ollama服务是否启动:`ollama serve` | | `Model not found` | 确认模型名称拼写,重新执行`ollama pull` | | 响应速度慢 | 减少`chunk_size`或升级硬件配置 | | 生成内容不相关 | 调整`search_kwargs={"k": 5}`增加检索量 | --- ### 本地部署优势 1. **数据隐私**:所有计算在本地完成,避免敏感数据外传 2. **定制化**:支持自定义微调模型(需使用Ollama Modelfile) 3. **离线运行**:无需互联网连接即可提供服务 通过这种方案,您可以完全基于本地环境构建安全可控的RAG系统,适合企业内网、科研机构等对数据隐私要求高的场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小小工匠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值