RAG 高效应用指南:Embedding 模型的选择和微调

构建一个检索增强生成 (Retrieval-Augmented Generation, RAG) 应用的概念验证过程相对简单,但要将其推广到生产环境中则会面临多方面的挑战。

『RAG 高效应用指南』系列将就如何提高 RAG 系统性能进行深入探讨,提供一系列具体的方法和建议。同时读者也需要记住,提高 RAG 系统性能是一个持续的过程,需要不断地评估、优化和迭代

本文将对如何选择向量召回模型和如何微调向量模型进行深入探讨。

在本篇文章中,将讨论以下几个问题:

  • • 向量模型在 RAG 系统中的作用

  • • 有哪些性能不错的向量模型(从 RAG 角度)

  • • 不同向量模型的评测基准 MTEB

  • • 业务中选择向量模型有哪些考量

  • • 如何 Finetune 向量模型

Embedding 简介

万物皆可 Embedding。在推荐系统、自然语言处理和计算机视觉等领域,Embedding 是一个非常重要的概念。Embedding 的本质是一种将高维稀疏数据转换为低维稠密向量的技术,通过这种转换,能够捕捉数据中的语义或特征关系。具体来说,Embedding 用一个多维稠密向量来表示事物的多维特征,从而在一个连续的向量空间中刻画事物之间的相似性和差异性。这种表示方式不仅提高了计算效率,还增强了模型对数据内在结构和关系的理解能力。比如,在处理文字时,我们可以把每个单词表示成一个向量(一个有方向和大小的数值列表),这种表示方法就叫做 word embedding。

大多数数据,特别是文本数据,都是高维且稀疏的。高维意味着数据量庞大,稀疏意味着大多数数据的值都是零。这样的数据在计算机中处理起来非常复杂且低效。通过 embedding 技术,我们可以将高维离散数据转换成低维稠密向量,这样可以显著提高计算效率。

此外,Embedding 还能捕捉到数据中的潜在关系。比如,在文本处理中,经过训练的 word embedding 可以让相似的单词(如『猫』和『狗』)在低维空间中靠得更近,而不相似的单词(如『猫』和『汽车』)则会离得更远。这种语义上的相似性对很多 NLP 任务非常重要。

很多文本处理任务可以在文本相似性的基础上进行构建,比如:

  • • 内容审核:衡量社交媒体消息与已知的滥用案例的相似度有多高

  • • 意图分析:识别用户的消息与已知意图的例子中哪个最为接近

  • • 情感分析:衡量文本与已知情感标签的相似度,从而判断情感倾向

  • • 推荐系统:计算用户和物品的相似度,从而为用户推荐可能感兴趣的物品

如图所示,使用 bge-m3 模型计算一个句子与其他句子(含英文句子)的相似度,可以看到,bge-m3 模型比较准确地度量了不同句子间的语义相似度。

拓展阅读

  • • https://www.zhihu.com/question/38002635

  • • https://zhuanlan.zhihu.com/p/49271699

  • • https://huggingface.co/BAAI/bge-m3

向量模型在 RAG 系统中的作用

Embedding 是文本的固定长度数值表示,这使得计算机能够轻松地测量文本之间的语义相关性。它们是一些重要自然语言处理任务的核心,比如文本相似性、语义搜索、信息检索和重新排序、聚类、下游任务的特征提取等。

Embedding 在 RAG 系统中扮演着至关重要的角色:如果 Embedding 模型在对私域知识进行向量化表示的过程中表现不佳,那么即使 RAG 系统在其他方面设计得当,最终效果也难以达到预期水平 。

为了让私域知识能在问答中被检索到,我们可以基于倒排和基于向量的方式构建知识库索引。倒排索引是一种基于关键词的精确性检索,但语义理解能力弱,而向量索引是基于文本向量的语义检索,可以捕捉文本的语义信息。一般情况下,我们会同时使用这两种检索方式。

在 RAG 系统中,向量模型主要有以下几个方面的作用:

1. 对 query 和 私域知识 进行向量化表示

在 RAG 系统中,用户的 query 和知识库中的文档需要被表示为向量。向量模型不仅支持文本、也支持图像和视频等多模态数据。通过使用预训练的语言模型(如 BERT、DPR 等),我们可以将 query 和分块文本转换为向量。这些向量捕捉了文本中的语义信息,使得相似的 query 和分块文本在向量空间中彼此接近,从而便于后续的 ANN 检索操作。

2. 动态更新知识库

在 RAG 系统中,随着新数据的不断加入,知识库需要动态更新。向量模型在此过程中也发挥了重要作用。新文档经过处理之后会被实时转换为向量并添加到向量数据库中,这保证了知识库的实时性和扩展性。向量模型的高效性使得这一过程能够迅速完成,不会对系统性能造成显著影响。

3. 数据隐私和安全

向量模型通过将私域知识转换为向量表示,实现了数据的匿名化。原始文本经过向量化处理后,其具体内容难以直接还原,从而保护了敏感信息。即使攻击者获得了向量表示,也难以重建原始信息。比如在金融领域,向量模型将敏感的金融交易记录转化为向量表示,RAG 系统可以在保护客户隐私的同时,进行高效的信息检索和生成,从而支持金融决策和客户服务。

拓展阅读

  • • https://hub.baai.ac.cn/view/34277

  • • https://arxiv.org/abs/2312.10997

有哪些性能不错的向量模型

RAG 系统需要高性能向量模型,现有开源/闭源的向量模型比较多,这里笔者推荐几个性能不错的向量模型。

  • OpenAI Embedding

  • https://platform.openai.com/docs/guides/embeddings

OpenAI 的最新 embedding 模型如text-embedding-ada-002,在长文本搜索、文本相似性和代码搜索等任务上表现出色,它支持 8K(8191)tokens 的输入长度。不过,OpenAI Embedding 并不是免费的,而是根据 token 数量来收费,这可能会增加一定的使用成本。

  • JinaAI Embedding

  • https://huggingface.co/jinaai/jina-embeddings-v2-base-zh

目前大部分开源向量模型仅支持 512 tokens 或者 1024 tokens 的输入长度,支持 8K tokens 的开源向量模型不多,Jina AI 发布的 jina-embeddings-v2 是其中一个。一般而言,如果文本的输入长度大于向量模型支持的最大 tokens 长度,则文本被会截断,从而破坏了文本的完整性,这样会直接影响下游任务的效果

  • BAAI/bge Embedding

  • https://huggingface.co/BAAI/bge-large-zh-v1.5

北京智源人工智能研究院(BAAI)开源了 BGE 系列 Embedding 模型,在多个评测任务排名靠前,还支持免费商用授权,可以满足不少业务场景的需求。其中,bge-m3 模型在多语言性(Multi-Linguality)、多功能性(Multi-Functionality)和多粒度性(Multi-Granularity)方面表现出色。bge-m3 支持超过 100 种语言,支持 8K 长度的输入文本,同时支持密集检索(Dense Retrieval)、多向量检索(Multi-Vector Retrieval)和稀疏检索(Sparse Retrieval)。

除此之外,还有包括 sentense-bert 系列,text2vec,m3e 等向量模型。

面对这么多向量模型,我们如何衡量一种 Embedding 模型相对于其他模型的有效性呢?Hugging Face 推出了 MTEB(Massive Text Embedding Benchmark 大规模文本嵌入基准)测试框架,旨在评估文本 Embedding 模型在多种任务上的性能。它覆盖了 8 类任务和 58 个数据集,涉及 112 种语言,是目前最全面的文本嵌入评估基准之一。MTEB 提供了一个公开的排行榜,用于展示各个模型在不同任务上的表现。

MTEB 排行榜:https://huggingface.co/spaces/mteb/leaderboard

如图所示,是 MTEB 的测试框架。

MTEB 包含以下任务类别,每个类别对应不同的评估指标和数据集:

    1. 文本分类(Classification):如情感分析、意图分类等。
    1. 聚类(Clustering):如将相似文本分为同一类。
    1. 成对分类(Pair Classification):判断两个文本是否重复或具有相似含义。
    1. 重排序(Reranking):根据查询重新排序相关和不相关的参考文本。
    1. 检索(Retrieval):从大量文档中找到与查询相关的文档。
    1. 语义文本相似性(STS):评估句子对之间的相似性。
    1. 摘要(Summarization):评估机器生成摘要的质量。

虽然我们可以通过 MTEB 排行榜对比不同向量模型的差异,但也只能作为一个参考,这些模型在公开数据集上的 benchmark 在垂直领域、企业自身的业务领域不一定成立,具体选择哪个向量模型还需结合业务特点进行综合比较、权衡

拓展阅读

  • • https://arxiv.org/pdf/2210.07316

  • • https://zhuanlan.zhihu.com/p/665044136

  • • https://huggingface.co/spaces/mteb/leaderboard

业务中选择向量模型有哪些考量

我们可以将 MTEB 作为选择向量模型的一个参考,但位于 MTEB 榜单 topK 的模型却并非一定适合企业自身的业务系统。在业务系统中,选择合适的 Embedding 模型是一个微妙的过程,受到多种因素的影响,比如知识库语言是中文、英文还是中英混合抑或是其他语言混合、切分文本块的长度、通用向量模型在垂类细分领域性能不佳、模型的精度、硬件的限制、检索时间限制等等

在下面的表格中,笔者对比了几个向量模型在支持序列长度、向量维度和支持语言等方面的差异。

下面,我们来分析,如何在业务中选择合适的向量模型。

针对所有自学遇到困难的同学们,我帮大家系统梳理大模型学习脉络,将这份 LLM大模型资料 分享出来:包括LLM大模型书籍、640套大模型行业报告、LLM大模型学习视频、LLM大模型学习路线、开源大模型学习教程等, 😝有需要的小伙伴,可以 扫描下方二维码领取🆓↓↓↓

👉[CSDN大礼包🎁:全网最全《LLM大模型入门+进阶学习资源包》免费分享(安全链接,放心点击)]()👈


语言支持和性能

大部分开源向量模型只支持单一或者有限的文本语言,所以需要确保 Embedding 模型支持的语言种类。多语言模型如 OpenAI Embedding 和 bge-m3 等模型能够处理多种语言。bge-m3 支持 100 多种语言,适合多语言需求的场景。

另外,某些模型在主要语言(如中文)中的表现较好,但在处理较少使用的语言时可能会表现不佳。因此,需要评估模型在所有必需语言中的准确性,以确保一致的性能。

处理长文本的能力

切分的文本片段后续需要通过 Embedding 模型进行向量化,所以必须考虑向量模型对输入文本块的 tokens 长度限制,超出这个限制则会导致模型对文本进行截断,从而丢失信息,影响下游任务的性能。

不同的 Embedding 模型对文本块长度的支持能力不同。比如,BERT 及其变体通常支持最多 512 个tokens,处理长文本时则需要将文本分成更小的块,意味着需要更加精细化的分块策略。而 Jina AI 的 Embedding 模型和 bge-m3 模型则支持 8K 的 tokens 输入,适合处理长文本块。

模型在特定领域的表现

通用 Embedding 模型在特定垂直领域(如医学、法律和金融等)可能不如专用模型有效。这些领域通常需要专门训练 Embedding 模型来捕捉特定的专业术语和语境。为特定业务需求优化的 Embedding 模型能够显著提升检索和生成的质量。例如,通过结合向量检索和重排序(reranking)技术,可以进一步优化结果。

存储和内存等资源需求

高维向量需要更多的存储空间,这可能会带来长期成本。例如,较高维度的模型如 text-embedding-ada-002 需要更多的存储资源。另外,较大的模型可能会占用更多内存,因此不适合内存有限的设备。

模型响应时间

Embedding 模型的处理速度在实时应用中尤为关键。例如,intfloat/e5-base-v2 模型在处理速度上表现优异,但需要在 GPU上 运行以达到最佳性能。

在选择模型时,需要评估其在嵌入和检索过程中的延迟。例如,OpenAI 的 Embedding 模型在许多基准测试中显示出较高的性能和较低的延迟。

因此,在真实生产环境中选择合适的向量模型需要综合考量多个维度,而不仅仅依赖于某一单一因素。通过综合考量以上多个维度,可以帮助我们在生产环境中选择适合的向量模型,确保 RAG 系统的整体性能和用户体验达到最佳水平。

拓展阅读

  • • https://crescitaai.com/multilingual-embedding-models/

如何 Finetune 向量模型

通用的 Embedding 模型通常是在大规模、多样化的数据集上训练的,可能不完全适合特定领域的任务,比如医学、法律等专业领域,它们无法很好的理解一些专有词汇。通过微调,模型可以学习到特定领域的词汇和概念,使其在特定应用场景中表现更佳。

因此,在特定领域,对向量模型进行 Finetune 的主要目标是提高 Recall@N (前 N 个检索结果中包含相关文档的比例)的准确率和优化正例与负例的 similarity 值域分布。通过微调,模型可以更好地适应特定领域,提高 Embedding 表示的质量,减少检索结果中的噪声,提高相关文档的检索准确性。同时,微调可以更好地分辨正例和负例,使它们在向量空间中的分布更加明显,形成清晰的边界。这样,当检索结果的相似度值低于某个阈值时,可以舍弃对它们的召回,减少误判风险,从而减少生成模型的负担和幻觉风险,提升整体系统性能和用户体验。

下面,我以 BAAI/bge-large-zh-v1.5 为例,看看如何基于私有领域数据进行 Finetune。

  1. 1. 安装 FlagEmbedding

首先,安装 FlagEmbedding 库:

pip install -U FlagEmbedding
  1. 2. 数据准备

训练数据是一个 json 文件,其中每一行都是一个独立的 json 对象,如下所示:

{"query": "如何提高机器学习模型的准确性?", "pos": ["通过交叉验证和调参可以提高模型准确性。"], "neg": ["机器学习是人工智能的一个分支。"]}  
{"query": "什么是深度学习?", "pos": ["深度学习是机器学习的一个子领域,涉及多层神经网络。"], "neg": ["数据科学是一门交叉学科。"]}

其中,query 是问题,pos 是正样本列表,neg 是负样本列表,如果没有现成的负样本,可以考虑从整个语料库中随机抽取一些文本作为 neg。

将数据保存为 jsonl 文件,例如 finetune_data.jsonl

  1. 3. Hard Negatives 挖掘(可选)

Hard Negatives 是指那些在向量空间中与查询较为接近但实际上并不相关的样本。挖掘这些样本可以提高模型的辨别能力,提供 Embedding 质量。具体方法可以参考以下代码:

python -m FlagEmbedding.baai_general_embedding.finetune.hn_mine \  
--model_name_or_path BAAI/bge-large-zh-v1.5 \  
--input_file finetune_data.jsonl \  
--output_file finetune_data_minedHN.jsonl \  
--range_for_sampling 2-200 \  
--negative_number 15

其中,range_for_sampling 表示从哪些文档采样,例如 2-200 表示从 top2-top200 文档中采样 negative_number 个负样本 。

  1. 4. 训练

微调 Embedding 模型的命令如下:

torchrun --nproc_per_node {number of gpus} \  
-m FlagEmbedding.baai_general_embedding.finetune.run \  
--output_dir {path to save model} \  
--model_name_or_path BAAI/bge-large-zh-v1.5 \  
--train_data ./finetune_data.jsonl \  
--learning_rate 1e-5 \  
--fp16 \  
--num_train_epochs 5 \  
--per_device_train_batch_size {large batch size; set 1 for toy data} \  
--dataloader_drop_last True \  
--normlized True \  
--temperature 0.02 \  
--query_max_len 64 \  
--passage_max_len 256 \  
--train_group_size 2 \  
--negatives_cross_device \  
--logging_steps 10 \  
--save_steps 1000 \  
--query_instruction_for_retrieval "" 

以上命令指定了训练参数,包括学习率、批次大小、训练轮次等,需要根据实际情况进行调整。

  1. 5. 模型合并(可选)

对通用模型进行微调可以提高其在目标任务上的性能,但可能会导致模型在目标域之外的一般能力退化。通过合并微调模型和通用模型,不仅可以提高下游任务的性能,同时保持其他不相关任务的性能。

为了将微调后的模型和原来的 bge 模型进行合并,我们需要先安装 LM_Cocktail,如下所示:

pip install -U LM_Cocktail

合并代码参考如下:

from LM_Cocktail import mix_models, mix_models_with_data  
  
# Mix fine-tuned model and base model; then save it to output_path: ./mixed_model_1  
model = mix_models(  
    model_names_or_paths=["BAAI/bge-large-zh-v1.5", "your_fine-tuned_model"],   
    model_type='encoder',   
    weights=[0.5, 0.5],  # you can change the weights to get a better trade-off.  
    output_path='./mixed_embedding_model')

拓展阅读

  • • https://github.com/FlagOpen/FlagEmbedding/tree/master/examples/finetune

  • • https://github.com/FlagOpen/FlagEmbedding/tree/master/LM_Cocktail

总结

本文讨论了 RAG 系统中 Embedding 模型的选择和微调。Embedding 模型在 RAG 系统中扮演中语义召回的角色,通过生成高质量的向量表示来捕捉文本的语义信息,以便在检索阶段更准确地匹配用户查询和知识库中的相关文档。

在真实生产环境中选择合适的向量模型需要综合考量多个维度(如向量模型支持的语言、文本长度和向量维度等),以确保模型能够满足业务需求和系统性能。在效果没有明显差异的情况下,推荐选择向量维度短的模型,减少存储和内存等资源需求。

另外,通用的 Embedding 模型可能不完全适合特定领域(如医学、法律等)的任务,所以可能需要对其进行微调以更好地适应这些领域的需求。例如,在法律领域,通过使用法律文献和案例数据进行微调,模型可以更准确地解析法律文本,提高法律信息检索和分析的精度和效率。

读者福利:如果大家对大模型感兴趣,这套大模型学习资料一定对你有用

对于0基础小白入门:

如果你是零基础小白,想快速入门大模型是可以考虑的。

一方面是学习时间相对较短,学习内容更全面更集中。
二方面是可以根据这些资料规划好学习计划和方向。

包括:大模型学习线路汇总、学习阶段,大模型实战案例,大模型学习视频,人工智能、机器学习、大模型书籍PDF。带你从零基础系统性的学好大模型!

😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓
在这里插入图片描述

👉AI大模型学习路线汇总👈

大模型学习路线图,整体分为7个大的阶段:(全套教程文末领取哈)

第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;

第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;

第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;

第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;

第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;

第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;

第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。

👉大模型实战案例👈

光学理论是没用的,要学会跟着一起做,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

在这里插入图片描述

👉大模型视频和PDF合集👈

观看零基础学习书籍和视频,看书籍和视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
在这里插入图片描述
在这里插入图片描述

👉学会后的收获:👈

• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;

• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;

• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;

• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。

👉获取方式:

😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓
在这里插入图片描述

<think>好的,用户之前已经询问过如何使用LangChain搭建RAG系统,现在他想知道如何结合本地的Ollama部署的embedding模型nomic-embed-text推理模型deepseek-r1:8b来构建RAG。我需要先回顾之前的回答,看看有没有需要调整的地方,确保这次回答在结构上一致,但针对本地模型进行调整。 首先,用户明确提到了使用Ollama本地部署的两个模型:nomic-embed-text作为embedding模型,deepseek-r1:8b作为推理模型。这意味着我需要指导用户如何将这些本地模型集成到LangChain的流程中,替换之前提到的HuggingFaceEmbeddingsOpenAI等云端服务。 接下来,我需要考虑Ollama在LangChain中的支持情况。记得LangChain有Ollama的集成,可以通过Ollama的本地服务来加载模型。所以可能需要使用langchain.llms.Ollamalangchain.embeddings.OllamaEmbeddings相关的模块。 然后,文档加载处理的步骤应该之前类似,比如使用PyPDFLoader或WebBaseLoader,这部分不需要改变。文本分割也是一样的,使用RecursiveCharacterTextSplitter,所以这部分可以保持原样。 在向量化与存储部分,之前用的是HuggingFaceEmbeddings,现在需要替换为Ollama提供的nomic-embed-text模型。需要确认Ollama是否支持这个模型,以及如何正确调用。可能需要使用OllamaEmbeddings并指定模型名称。 对于推理模型,之前用的是OpenAI,现在要替换为本地Ollama的deepseek-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. 使用Ollama的deepseek-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-text) embeddings = 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
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值