GraphRAG的构建
前言:经典RAG应用的范式与架构已经非常流行,我们可以在很短的时间内借助成熟框架开发一个简单能用的RAG应用。 但是传统RAG需要对文本进行分块,然后进行向量化存储,这种处理模式就会天然导致RAG在全局查询或总结上的表现不会太好。比如面对这样的问题,“《跨越鸿沟》这本书整体上讲了什么?请撰写一份2000字的总结”,传统RAG大概率会表现不及格。并且在对文本分块之后,可能会丢失一些信息之间的关系和因果性 这正是知识图谱和GraphRAG可以发挥作用的场景 一、neo4j的搭建Neo4j安装与配置以及JDK安装与配置教程(超详细)-CSDN博客 二、积累一些专用名词实体(Entity) 知识图谱中的“点”,代表现实世界中的事物,例如“华为”“张三”“北京大学”。 关系(Relation / Edge) 实体之间的联系,图中的“边”,例如“张三–就读于–北京大学”。 属性(Attribute / Property) 实体或关系的特征值,例如“张三–年龄–25岁”。 三元组(Triple) 知识图谱的基本单元,形式为 (头实体, 关系, 尾实体),如 (张三, 就读于...
RAG的评估(RAGAS)和检索优化
前言:评估RAG有效性主要采用两种方法:独立评估和端到端评估。这两种方法从不同角度检验RAG系统的效能,确保其在各个组成部分均表现出色。 一、独立评估独立评估侧重于对RAG系统中检索模块和生成模块的单独评估,以确保每个模块都能有效地完成其任务 1.1 检索模块评估检索模块能够从知识库中检索到与输入查询最相关的内容的能力,这些指标衡量了系统在给定查询或任务下的项目排名效能,包括**命中率(Hit Rate)、平均排名倒数(MRR)、归一化折损累积增益(NDCG)、精度(Precision)**等。 1.1.1 命中率(Hit Rate)很好理解,就是看总的查询里面有几次查到了文档 举例: 检索系统命中率计算示例: 假设我们有一个简单的检索系统和以下的查询记录: 总共有10次查询。 在这10次查询中,有7次查询检索到了至少一个相关的文档。 命中率计算公式: 结果解释:在所有查询中,有 $70%$ 的查询至少检索到了一个相关文档,显示出检索系统对用户查询有较好的响应能力。 1.1.2 平均排名倒数(MRR) 在文档A、文档B、文档C、文档D中,我们人工标注...
vLLM的优势——KV cache与PageAttention
前言参考文章: (19 封私信) 长篇白话解读vLLM:让大模型推理快得飞起的“黑魔法” - 知乎 (19 封私信) 一文详解八款主流大模型推理框架 - 知乎 训练好的大模型本质上就是一堆参数文件(权重)+ 结构定义,它自己不能直接对外服务。要真正让别人(前端、业务系统、APP 用户)用起来,就必须把它部署成一个可调用的系统。 理解为: 训练完的模型 = 一本厚厚的书,放在你电脑里,别人看不到。 部署好的模型服务 = 建了一个图书馆窗口,别人能来借书、问问题。 目前主流的大模型推理框架有Hugging Face(国外),ModelScope(国内),Ollama,以及本篇文章要着重介绍的vLLM。 对于获取句子嵌入向量的大模型,可以使用更加便捷的Sentence Transformers库,我们在后面的文章中会介绍。 一、Hugging Face/ModelScope(魔塔社区)这两个平台本质都差不多,都是通过调用 API 或 SDK 来下载、加载和推理模型,适合用来下载到本地部署和运行推理,只是 Hugging Face 更国际化、生态更全,而...
RAG——检索增强生成
前言:大模型在生成回答的时候,有时总是会词不达意,甚至毫无根据的乱说一通,我们把这种现象称为大模型的幻觉 产生幻觉问题主要是因为其基于大量数据和复杂算法进行概率性预测来生成内容,当遇到训练数据中未充分覆盖或模糊不清的情境时,容易生成看似合理但实际错误或无根据的信息,且难以自我验证内容的真实性,然而大模型的生成机制是计算出下一个最有可能出现的词或短语。这种概率生成的方式本身没有绝对的对错判断机制。** 另外,在实际生产中,还需要面临时效性和可解释性的问题,更具具体业务来生成有针对性的回答,实现这个功能似乎微调能够办到,但是不可能每次有需要更新的内容都微调一次,这样成本太高了 因此我们在大模型中引入RAG技术,通过丰富大模型上下文来大幅提高模型输出质量 一、什么是RAG?通俗点来讲,就是相当于给大模型提供了一个专属图书馆,前期通过数据预处理,把原始文档(PDF、Word、图片等)处理成机器能理解的 “知识片段”,并存储到向量数据库中,在客户向大模型提问(Query)时,大模型通过分析Query,在数据库中检索到与之相关的知识块添加到上下文一起作为prompt传入大模型 R: Ret...
大模型的端到端全栈部署思路
前言该项目是一个依托Django服务器为调度中心,链接客户端、MySQL数据库端、大模型端以及RAG系统端的全栈部署,后续开发可以依据这个部署思路实现一个可控,可追溯,低幻觉的大模型对话平台。 当然这里只是用作学习,整个系统保留躯干部分 一、项目整体架构1.1 技术栈Qwen-7B(基座模型) + LLaMA-Factory + QLoRA + vLLM + GraphRAG + Milvus + Sentence Transformers + Django + MySQL + uniApp + Langchain + HuggingFace Qwen-7B:核心大语言模型 uniApp:前端交互 Django:后端服务 GraphRAG:知识图谱检索 Milvus:向量数据库 vLLM:高效推理部署 MySQL:日志和历史存储 Sentence Transformers:文本向量化 LLaMA-Factory:模型管理 QLoRA:低秩微调 Langchain / HuggingFace:链式调用和接口管理 1.2 架构图 二、系统链路说明1. 用户输入问...
基于AutoDL云服务器的大模型LoRA微调原理及实战
前言大模型微调是指在预训练好的大型语言模型(如GPT、文心一言等)的基础上,针对特定的任务或领域数据,对模型的参数进行进一步的调整和优化,使其更好地适应特定的应用场景,提高模型在特定任务上的性能和准确性。 大模型微调是实现行业落地、提升性能精度、满足个性化需求、节省算力资源并保障数据安全的关键路径,是大模型走向实际应用的“最后一公里”。 NLP的三个分支 ★ NLU(Natural Language Understanding):自然语言理解,是让机器理解人类语言的过程,包括意图识别、实体抽取等。 NLG(Natural Language Generation):自然语言生成,是让机器生成人类语言的过程,用于撰写文本、生成描述等。 NLI(Natural Language Inference):自然语言推理,是判断两个句子之间逻辑关系的过程,用于文本分析和语义理解。 一、LoRA基础知识大模型微调分类包括: 全量微调:对大模型的所有参数进行全面调整,精度高但计算成本大。 高效微调:采用轻量化方法(如LoRA、Adapter)仅调整部分参数,计算效率高且资源消耗少。 强化学习...
基于AutoDL云服务器的VLLM大模型部署以及本地调用
前言vLLM 是一个专注于大语言模型(LLM)的高速推理框架。它的核心目标是通过优化技术,显著提升语言模型在实时场景下的服务吞吐量和内存使用效率。适合大规模大语言模型部署,实现CUDA的加速 部署需求: AutoDL算力云平台租用一台GPU(本文租用3080),良好的网络环境(需要下载超过10G的内容) 一、VLLM安装与验证这一步其实在云服务器上可以省略,因为选择镜像的时候我们可以选择一个带有VLLM的镜像 如果需要自行下载,在终端运行如下命令,下载过程比较漫长,耐心等待 12345# 安装最新版vLLM(耗时较长)pip install vllm -i https://pypi.tuna.tsinghua.edu.cn/simple# 验证安装python -c "import vllm; print(vllm.__version__)" 选择无卡模式开机后进入终端查看VLLM版本号,这里是0.4.0.post1 接下来我们就可以开始模型部署了 二、模型部署2.1 启动模型然后把自己的模型传输到服务器上,这里我使用Xftp传输提前在Hugging...
Tokenizer(切词器)的不同实现算法
前言Tokenizer(分词器) 的作用是将一段文本分割成一个个有意义的单元,每个单元在词向量表中对应一个的索引,根据这个索引我们能得到词向量,例如jieba就是非常流行的中文分词器Transformers的AutoTokenizer可以用于英文的分词,各个模型使用的分词逻辑也有不同,对于输入的一串文本,Tokenizer会如何处理,下面介绍了一系列算法 一、Tokenizer的三种颗粒度实现 Word-based 分词:直接从词汇表中查找文本中的单词进行分词。 示例 1:词汇表 ["hello", "how", "are", "you"],句子 "how are you" → 分词结果:["how", "are", "you"]。 示例 2:句子 "how are you today" → 分词结果:["how", "are", "you"...
Transformer网络结构解析
前言Transformer 广泛应用于自然语言处理(如机器翻译、文本生成)等领域,是BERT、GPT等大模型的基础架构 以自注意力机制为核心:让模型关注输入序列中不同位置的关联 具备强并行化能力:彻底摆脱了RNN等模型的序列依赖,能并行处理输入数据 采用编码器 - 解码器架构:分别负责处理输入序列为上下文表示及据此生成输出序列。 一、位置编码Position Encoding 1.1 因自注意力机制在计算关联时,本质上是对序列中所有元素进行 “全局配对” 计算,没有办法考虑到元素的输入顺序,因此在输入之前我们需要使用位置编码来使自注意力机制区分序列中不同位置的元素 1.2 果在输入到 Transformer 模型之前,每个词的词嵌入向量(包含语义信息的原始维度数据)会与对应的位置编码向量(模型根据这个编码来区分输入特征的前后位置)进行逐元素相加,形成一个新的向量。这个新向量同时包含了词的语义信息和它在序列中的位置信息。 1.2.1 固定函数生成位置编码对于一个长度为N,词向量维度为d的句子,他在长度索引为i,维度索引为j的位置编码计算公式如下 例如步长为5的句子“I...
Transformer自注意力机制
前言:什么是注意力机制?注意力机制是一种模拟人类注意力的神经网络模型机制,它能够让模型在处理信息时集中关注部分重要信息,而忽略其他不重要的信息,从而提高模型的效率和性能。 一、Q,K,V自注意力机制是要回答:“我(某个位置)应该关注谁(其他位置)?以及关注了之后该怎么融合信息?”,因此我们先来了解三个关键名词 查询向量(Query):表示当前词的“查询需求”,用于寻找与之相关的上下文信息。 键向量(Key):作为每个词的“特征标识”,与查询向量匹配,判断相关性。 值向量(Value):包含每个词的“实际内容”,匹配成功后从中提取信息,丰富上下文表示。 二、单层注意力机制以4个步长句子“I am a man”作为一个输入,图中X代表每个单词经过嵌入层得到的低维词嵌入矩阵 1234567891011121314151617181920import torch import torch.nn as nnimport mathfrom torch.nn import functional as Fdocument = ( "[UNK] I Love Nature ...

