Rag技术----项目博客(六)

article/2025/6/7 23:10:43

RAG

定义:检索增强生成(Retrieval Augmented Generation),简称 RAG,已经成为当前最火热的LLM应用方案。

目的:通过提供相关领域数据库通过问题检索信息,将相关信息合并到Prompt中,增强模型的专业性。

深入浅出RAG技术:

RAG=检索技术+LLM提示

//LLM提示就是之前文章中提到过的promt工程,这里不再赘述,主要理解检索技术

检索技术

2019年,Faiss就实现了基于嵌入的向量搜索技术,但是 RAG 推动了向量搜索领域的发展。比如 chroma、weaviate.io和 pinecone这些基于开源搜索索引引擎(主要是 faiss 和 nmslib)向量数据库初创公司,最近增加了输入文本的额外存储和其他工具。
向量化是将文本数据转化为向量矩阵的核心过程,通常使用embedding模型来实现,常用的模型:

模型名称描述
ChatGPT-EmbeddingChatGPT-Embedding由OpenAI公司提供,以接口形式调用。
ERNIE-Embedding V1ERNIE-Embedding V1由百度公司提供,依赖于文心大模型能力,以接口形式调用。
M3EM3E是一款功能强大的开源Embedding模型,包含m3e-small、m3e-base、m3e-large等多个版本,支持微调和本地部署。
BGEBGE由北京智源人工智能研究院发布,同样是一款功能强大的开源Embedding模型,包含了支持中文和英文的多个版本,同样支持微调和本地部署。

本项目使用的模型为BAAI/bge-large-zh-v1.5BAAI/bge-small-zh,特点是体积小且适合中文。
向量数据库:数据向量化后构建索引,并写入数据库的过程可以概述为数据入库过程,适用于RAG场景的数据库包括:FAISS、Chromadb、ES、milvus等,本项目选择的数据库为FAISS。

当我们要在数据库中寻找与问题相关的数据时常用的方法:
常见计算方法:k-临近
数据距离计算方法:欧式距离、曼哈顿距离、明科夫斯基距离。

RAG工作原理:

数据库构建并应用

前期准备

环境
有两个最著名的基于 LLM 的管道和应用程序的开源库——LangChain 和 LlamaIndex,受 ChatGPT 发布的启发,它们在 2022 年 10 月和 11 月创立,并在 2023 年获得大量采用。
本项目使用的开源库为LangChain

数据积累
数据来源:https://github.com/LawRefBook/Laws
该项目目的是收集各类法律法规、部门规章、案例等,并将其按照章节等信息进行了处理。
项目提供了request.py 脚本,支持从 BAAI/bge-large-zh-v1.5 爬取最新的法律法规。

数据库构建

目录结构

读取数据

# 遍历 Markdown 文件
docs = []
root_dir = Path("data/Laws-master/LAWS")
md_files = {} 
for dir_name in os.listdir(root_dir):dir_path = os.path.join(root_dir, dir_name)if os.path.isdir(dir_path):  # 确保是文件夹md_files[dir_name] = {}for file_name in os.listdir(dir_path):if file_name.endswith(".md"):

选择分词器并加载嵌入模型

embedding_model = HuggingFaceEmbeddings(model_name="../models/BAAI/bge-small-zh")
splitter = MarkdownTextSplitter(chunk_size=500, chunk_overlap=50)

构建数据库

 file_path = os.path.join(dir_path, file_name)loader = TextLoader(str(file_path), encoding='utf-8')raw_docs = loader.load()split_docs = splitter.split_documents(raw_docs)docs.extend(split_docs)
vectorstore = FAISS.from_documents(docs, embedding_model)
vectorstore.save_local("faiss_index")

数据库应用
 

def rag_ask(question, top_k=2):# 检索相关法条docs = db.similarity_search(question, k=top_k)# print(docs)#生成前k个相关的问题context = "\n\n".join([doc.page_content for doc in docs])print(context)prompt = f"""你是中国法律助手,请根据以下法条内容回答问题:
【法条内容】:
{context}【用户问题】:{question}
【回答】:
"""print(prompt)response = pipe(prompt, max_new_tokens=512)[0]['generated_text']print(response[len(prompt):].strip())

效果展示
prompt


回答结果


http://www.hkcw.cn/article/IJRadrLUxq.shtml

相关文章

BioID技术:揭示铁死亡机制中Caspase-2蛋白相互作用网络

铁死亡(Ferroptosis)是一种铁依赖的非凋亡形式的细胞死亡,其发生与细胞内氧化应激失衡以及抗氧化防御途径受损密切相关。随着研究的深入,学界逐渐认识到蛋白质相互作用在铁死亡调控中扮演着关键角色。铁死亡作为一种新型的细胞死亡…

机器学习——随机森林算法

随机森林算法是一种强大的树集成算法,比使用单个决策树效果要好得多。 以下是生成树集成的方法:假设有一个大小为m的训练集,然后对于b1到B,所以执行B次,可以使用有放回抽样来创建一个大小为m的训练集。所以如果有10个…

快速排序(Quick Sort)算法详解(递归与非递归)

引言 在计算机科学中,排序算法是最基础且重要的算法之一。快速排序(Quick Sort)作为一种高效的排序算法,在实际应用中被广泛使用。平均时间复杂度为 (O(n log n)),最坏情况下为 (O(n^2))。本文将详细介绍快速排序算法…

8.RV1126-OPENCV 视频中添加LOGO

一.视频中添加 LOGO 图像大体流程 首先初始化VI,VENC模块并使能,然后创建两个线程:1.把LOGO灰度化,然后获取VI原始数据,其次把VI数据Mat化并创建一个感兴趣区域,最后把LOGO放感兴趣区域里并把数据发送给VENC。2.专门获…

Linux 下 ChromeDriver 安装

个人博客地址:Linux 下 ChromeDriver 安装 | 一张假钞的真实世界 Selenium 是一个用于 Web 应用程序测试的工具。可以通过它驱动浏览器执行特定的操作,如点击、下滑、资源加载与渲染等。该工具在爬虫开发中也非常有帮助。Selenium 需要通过浏览器驱动操…

C++学者给您讲数学之——数列

C学者为您解析数列基础 数列的概念 **数列(sequence of number)**是以正整数集(或其有限子集)为定义域的有序数集。数列中的每个数称为该数列的项,其中: 第一位称为第1项(首项) 第…

【Harmony OS】数据存储

目录 数据存储概述 首选项数据存储 关系型数据库 数据存储概述 • 数据存储 是为了解决应用数据持久化问题,使得数据能够存储在外存中,达到保存或共享目的。 • 鸿蒙应用数据存储包括 本地数据存储 和 分布式数据存储 。 • 本地数据存储 为应用…

程序员健康防护指南

深度学习欢迎访问:通义灵码2.5qwen3——节假日抢票不用愁,基于12306-MCP实现个人火车票智能查询小助手!-CSDN博客 一、视觉系统防护工程 1. 数字眼疲劳综合征防控 蓝光管理:使用经认证的防蓝光眼镜可过滤45%有害蓝光,…

CSS 平铺+自动换行效果

先上效果图 样式 <template><div class"activity-questions"><h1>活动题库</h1><div v-if"loading" class"loading">加载中...</div><div v-else><div v-if"questions.length 0" clas…

苏超火了 “苏大强”的作业怎么抄 全网热潮背后的足球盛宴

“比赛第一,友谊第十四”是这里的原则。近日,江苏省首届城市足球联赛“苏超”火出圈。“苏超”由江苏省体育局与江苏省各设区市政府联合主办,13个设区市各派一队参加。联赛打破了准入的边界,队伍中既有职业球员也有个体工商户、大学生和高中生等业余球员。尽管球员水平与中…

ck-editor5的研究 (7):自定义配置 CKeditor5 的 toolbar 工具栏

文章目录 一、前言二、实现步骤1. 第一步: 搭建目录结构2. 第二步:配置toolbar工具栏的步骤(2-1). 配置粗体和斜体(2-2). 配置链接和标题+正文(2-3). 配置列表和引用(2-4). 配置自动格式化3. 第三步:更多工具三、测试效果和细节四、总结一、前言 在前面的文章中,我们已经对…

Skydel25.4发布:解锁自定义星座,增强C波段与干扰模拟能力

在GNSS模拟技术持续迭代的浪潮中&#xff0c;Skydel迈出创新一步&#xff0c;正式发布25.4.0版本及后续修复版本25.4.1。本次更新的核心突破在于引入了强大的自定义星座功能&#xff0c;赋予用户前所未有的自由度&#xff0c;可创建包含多达400颗卫星的专属星座&#xff0c;突破…

迅为RK3588开发板RKLLM-Toolkit 环境搭建安装 Miniconda

Conda 是一个开源的软件包管理系统和环境管理系统&#xff0c;它可以用于安装、管理和升级软件 包和依赖项&#xff0c;我们这里使用conda 的目的只是构建一个虚拟环境&#xff0c;所以选择轻量话的miniconda。 miniconda 的官方链接如下所示&#xff1a; 进入 miniconda 的…

Oracle双平面适用场景讨论会议

4月28日&#xff0c;我在杭州组织召开了Oracle双平面会议讨论沙龙。在国产化数据库浪潮的今天&#xff0c;Oracle数据库作为国产数据库的应急库&#xff0c;在国产数据库发生故障或者性能下降时&#xff0c;如何更好的使用Oracle。会议主题如下&#xff1a; 1、背景与痛点速览&…

tauri项目绕开plugin-shell直接调用可执行文件并携带任意参数

tauri项目的plugin-shell插件的要求太多了&#xff0c;用起来实在是不顺手&#xff0c;要求参数要求位置等&#xff0c;不行不行&#xff0c;客户要求可以在前端输入任意命令行参数并执行&#xff0c;哪怕是rm -rf都要无条件执行&#xff0c;好好好&#xff0c;满足你。 我们直…

AJ-Report

目录 AJ-Report是什么 CNVD-2024-15077(AJ-Report认证绕过和远程代码执行漏洞) AJ-Report是什么 AJ-Report是完全开源的BI(Business intelligence)平台&#xff0c;旨在帮助用户生成和管理各种类型的报表。它通常用于web应用中&#xff0c;用于分析和展示数据&#xff0c;常用于…

Rust 函数

文章目录 Rust 函数函数参数语句与表达式带返回值的函数代码示例 Rust 函数 函数 函数在 Rust 代码中非常常见。你已经见过了语言中最重要的函数之一&#xff1a;main 函数&#xff0c;它是许多程序的入口点。你还见过 fn 关键字&#xff0c;它允许你声明新的函数。 Rust 代码…

【Typst】3.Typst脚本语法

概述 Typst的核心就是它在标记语法的基础上提供了一个灵活强大的脚本语言&#xff0c;来支持复杂的排版操作。 本节就以一个脚本语言的角度&#xff0c;介绍一下Typst脚本的核心语法。 系列目录 1.Typst概述2.Typst标记语法和基础样式3.Typst脚本语法4.导入、包含和读取5.文…

Java 文件操作 和 IO(5)-- 综合案例练习 -- 示例三

文章目录 题目描述&#xff1a;扫描指定目录&#xff0c;并找到文件名称或文件内容中包含指定字符的所有普通文件&#xff08;不包含目录&#xff09;结果案例演示&#xff1a;设计思路&#xff1a;总体的思路&#xff1a;使用代码&#xff0c;分步实现1. 准备工作&#xff08;…