【课程总结】day29:大模型之深入了解Retrievers解析器

news2024/12/28 5:17:46

前言

在上一章【课程总结】day28:大模型之深入探索RAG流程中,我们对RAG流程中 文档读取(LOAD) -> 文档切分(SPLIT) -> 向量化(EMBED) -> 存储(STORE) 进行了深入了解,本章将接着深入了解 解析(Retrieval) 的使用

解析器简介

简介:在 RAG(Retrieval-Augmented Generation)流程中,Retrieval(检索)是关键环节,其主要目标是从大量文档或知识库中提取与用户查询相关的信息。

目的

  • 信息获取:根据用户的查询,从外部知识库中获取相关文档或片段,以增强生成模型的上下文信息。
  • 提高准确性:通过提供具体的、相关的信息,帮助生成模型(如语言模型)产生更准确和上下文相关的回答。

流程

  1. 用户查询:用户输入一个查询或问题。
  2. 检索器:使用检索算法(如 BM25、TF-IDF 或基于嵌入的检索)搜索知识库,找到与查询最相关的文档。
  3. 文档评分:对检索到的文档进行评分,通常依据相关性得分来排序。
  4. 返回结果:将最相关的文档或片段返回给生成模型。

解析器的基础使用

创建知识库

第一步:启动Chroma数据库

chroma run --path chroma_xiyou --port 8000

第二步:使用RAG基础流程:Load->Split->EMBED->STORE创建一个知识库

from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.document_loaders import PyMuPDFLoader
from langchain_chroma import Chroma
from chromadb import Settings
from chromadb import Client
from utils import get_ernie_models
import chromadb

# 连接大模型
llm_ernie, chat_ernie, embed_ernie = get_ernie_models()

# 初始化 HuggingFaceEmbeddings
embedding_function = HuggingFaceEmbeddings(model_name="bert-base-chinese")

# 加载文档
pdf_loader = PyMuPDFLoader("testfiles/西游记.pdf")
documents = pdf_loader.load()

# 切分文档
spliter = RecursiveCharacterTextSplitter(chunk_size=128, chunk_overlap=64)
docs = spliter.split_documents(documents)

# 配置连接信息
client = chromadb.HttpClient(host='localhost', port=8000)

chroma_db = Chroma(
    embedding_function=embedding_function,
    client=client
)

batch_size = 6  # 每次处理的样本数量

# 分批入库
for i in range(0, len(docs), batch_size):
    batch = docs[i:i + batch_size]  # 获取当前批次的样本
    print(f'Processing batch {
     i} to {
     i + batch_size}, total {
     len(batch)} samples')
    chroma_db.add_documents(documents=batch)  # 入库

说明:

  • 向量化说明:由于Qwen和百度千帆的向量接口限制较多,对于向量化西游记这本书来说,经常会遇到超出限制等问题,所以此处我将向量化接口换为HuggingFaceEmbeddings(),该接口可能会存在被Ban的风险,请自行更换向量化接口。
  • 测试文档:西游记下载地址请见夸克网盘:西游记

创建解析器

第三步:创建一个解析器

retriever = chroma_db.as_retriever()

创建chain链

创建chain链有两种方法:一种是管道符连接,一种是使用 create_retrieval_chain 。本章我们两种方法都做尝试,以便对比代码的写法。

方式一:传统的管道符构建chain
# RAG系统经典的 Prompt 
prompt = ChatPromptTemplate.from_messages([
  ("human", """You are an assistant for question-answering tasks. Use the following pieces 
  of retrieved context to answer the question. 
  If you don't know the answer, just say that you don't know. 
  Use three sentences maximum and keep the answer concise.
  Question: {question} 
  Context: {context} 
  Answer:""")
])

 
def format_docs(docs):
    return "\n\n".join(doc.page_content for doc in docs)
 
 
# RAG 链
rag_chain = (
    {
   "context": retriever | format_docs, 
     "question": RunnablePassthrough()}
    | prompt
    | chat_ernie
    | StrOutputParser()
)
 
rag_chain.invoke(input="孙悟空三打白骨精时,白骨精分别变成了哪些形态?")

运行结果:

方式二:使用create_retrieval_chain构建

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2179783.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

墙绘产品交易平台:SpringBoot技术实现

4 系统设计 墙绘产品展示交易平台的设计方案比如功能框架的设计,比如数据库的设计的好坏也就决定了该系统在开发层面是否高效,以及在系统维护层面是否容易维护和升级,因为在系统实现阶段是需要考虑用户的所有需求,要是在设计阶段没…

矩阵奇异值

一、ATA 任给一个矩阵A,都有: ATA 为一个对称矩阵 例子:A为一个mn的矩阵,A的转置为一个nm的矩阵 对称矩阵的重要性质如下: ① 对称矩阵的特征值全为实数(实数特征根) ② 任意一个n阶对称矩阵…

思科dhcp的配置

以路由器为例 让pc3 自动获取ip地址并获取的网段为172.16.4.100-172.16.4.200 配置如下: R1(config)#interface GigabitEthernet0/2 R1(config)#ip address 172.16.4.254 255.255.255.0 R1(config)# no shutdown R1(config)#ip dhcp pool 4_pool //创建dhcp地址池…

实际有库存却提示可用量不足保存不了杂发单

财务要统计研发费用,成本的金额。研发人员没有足够的意识配合。开立请购单时兴之所致,任性自由。想弄一个项目号就弄一个。不开心就没有项目号啦。哪管他人死活。 U9的逻辑,请购单如果带入项目号(客制化的功能)&#x…

c语言200例 067

大家好,欢迎来到无限大的频道 今天给大家带来的是c语言200例 题目要求: 设计一个共用体类型,使其成员包含多种数据类型,根据不同的数据类型,输出不同的结果 要设计一个共用体(union)类型&…

如何判断主机字节序

测试代码: #include <stdio.h> void byteorder() {union{short value;char union_bytes[sizeof(short)];//union_bytes数组}test;test.value 0x0102;if((test.union_bytes[0] 1) && (test.union_bytes[1]2)){printf("big endian\n");}else if((test…

初识Java反序列化漏洞

目录 为什么需要序列化&#xff1f; 序列化与反序列化基础案例 Serializable 接口 序列化对象 反序列化对象 Java 反序列化漏洞 readObject() 序列化&#xff1a;将对象的状态信息转换为可以存储或传输的形式的过程&#xff0c;即将对象转换为字节序列。反序列化&#x…

如何突破科技服务领域的客户管理困境?

在知识产权与科技服务领域&#xff0c;企业面临着独特的客户管理需求和挑战&#xff0c;这些挑战不仅要求高度的专业性和精细化操作&#xff0c;还涉及复杂的法律流程、数据保密性以及不断变化的客户需求。传统的客户管理方式&#xff0c;如纸质档案、简单的电子表格或人工处理…

[教程]Crystal源码下载及编译

描述&#xff1a; 随着 Crystal Source 代码的更新&#xff0c;用于构建源代码和编译它们的指南已经过时&#xff0c;这导致了很多混淆和寻求帮助。 本指南将是一个完整的分步指南&#xff0c;从下载 Visual Studio 到启动到您的服务器。 此外&#xff0c;请确保下载此存储库中…

如何使用 Python 读取数据量庞大的 excel 文件

使用 pandas.read_excel 读取大文件时&#xff0c;的确会遇到性能瓶颈&#xff0c;特别是对于10万行20列这种规模的 .xlsx 文件&#xff0c;常规的 pandas 方法可能会比较慢。 要提高读取速度&#xff0c;关键是找到更高效的方式处理 Excel 文件&#xff0c;特别是在 Python 的…

Docker版MKVtoolnix的安装及中文显示

本文是应网友 kkkhi 要求折腾的&#xff0c;只研究了 MKVtoolnix 的安装及中文显示&#xff0c;未涉及到软件的使用&#xff1b; 什么是 MKVtoolnix &#xff1f; MKVToolnix 是一款功能强大的多媒体处理工具&#xff0c;用于在 Linux、其他 Unix 系统和 Windows 上创建、修改和…

uniapp/vue项目 import 导入文件时提示Module is not installed,‘@/views/xxx‘路径无法追踪

文章目录 背景解决方案1.IDE配置2.alias&#xff08;别名&#xff09;配置webpackvue-clivite 3.检查 jsconfig.json 或 tsconfig.json 写在最后 前往闪闪の小窝以获得更好的阅读和评论体验 背景 Vue3在我自学Vue的时候看过一点&#xff0c;实操过一点&#xff0c;但是太久没用…

css 下拉框展示:当hover的时候展示下拉框 z-index的用法解释

代码如下&#xff1a; <template><div class"outer"><div class"left"></div><div class"aTest2"><div class"box">显示方框</div><div class"aTest3"></div></…

2024年度全球前2%顶尖科学家榜单发布!大陆10687人上榜,占比仅4.92%,附大陆Top 1000榜单!

9月16日&#xff0c;美国斯坦福大学的John Ioannidis教授团队新近在爱思唯尔(Elsevier)出版集团官网上发布了2024年全球各学科前2%科学家榜单(第七版)&#xff0c;通过统计每个科学家发表的论文数及其引用次数&#xff0c;采用6种指标建模进行综合评分(模型和指标附后)&#xf…

MIC麦克风工作原理:【图片+公式计算讲解】

Mic一个声电传换装置&#xff0c;广泛应用于电子产品中&#xff0c;最常见的就是手机。我们通常也叫它送话器&#xff0c;今天我们就来好好学习一下Mic的电路和它的工作原理。 1&#xff1a;电路结构图 1&#xff1a;C&#xff1a;Mic的核心部件&#xff0c;是一个可以膜片震动…

Linux之Docker虚拟化部署

上传docker安装包 解压安装包 将解压后的docker文件夹移动到/usr/local/文件夹下 docker 启动命令/usr/local/docker/dockerd 但是启动报错&#xff0c;意思是没有docker用户组 创建docker用户组&#xff0c;执行完会生成套接字文件 将套接字文件加入该用户组管理 第二个错误原…

【Lcode 随笔】C语言版看了不后悔系列持续更新中。。。

文章目录 题目一&#xff1a;最长回文子串题目描述&#xff1a;示例输入与输出&#xff1a;题目分析&#xff1a;解题思路&#xff1a;示例代码&#xff1a;深入剖析&#xff1a; 题目二&#xff1a;合并K个有序链表题目描述&#xff1a;示例输入与输出&#xff1a;题目分析&am…

k8s中,ingress的实现原理,及其架构。

图片来源&#xff1a;自己画的 图片来源&#xff1a;k8s官网 首先&#xff0c;什么是ingress? 是服务还是控制器&#xff1f; 都不精确 ingress是一个api资源 service和deployment也是api资源。 这几个相互协作&#xff0c;组建成一个对外提供服务的架构。 ingress提供的…

java学习-idea编辑器基础使用设置

首先打开电脑中的idea编辑器&#xff0c;点击头部&#xff1a;File按钮 → Settings… 打开设置界面&#xff1b; 设置idea的主题 设置idea代码注释的字体颜色 设置idea编辑器的字体和字体大小 设置idea通过提示回车自动导入包 设置idea输入忽略大小写进行提示

计算机网络面试题——第二篇

1. TCP拆包和粘包 现象 粘包&#xff1a;指在TCP传输中&#xff0c;发送方的多个数据包在接收方被合并在一个包接收&#xff0c;导致多条消息数据粘在一起&#xff0c;接收方无法正确区分这些消息的边界。拆包&#xff1a;指的是发送方的一个数据包在接收方被分成了多个包接收…