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

news/2024/10/17 11:25:33/

前言

在上一章【课程总结】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.ppmy.cn/news/1532687.html

相关文章

手游和应用出海资讯:三七新游首月收入突破700万元;领英尝试推出游戏功能以增加用户使用时长

NetMarvel帮助游戏和应用广告主洞察全球市场、获取行业信息,以下为9月第四周资讯: ● 《AFK Journey》收入突破 1.5 亿美元 ● 《黑神话:悟空》IGN年度游戏投票第一掉至第三 ● 三七发布新游首月收入突破700万元 ● 开罗游戏《哆啦A梦的铜锣烧…

解析.NET框架与平台:构建高效应用程序的基石

.NET框架与平台是紧密相关但又有所区别的两个概念,它们共同构成了.NET技术体系的基础。以下是对.NET框架与平台的详细解释: .NET平台 .NET平台是微软提供的一个用于构建、部署和运行应用程序及服务的综合环境。它是一个开放源代码(托管于Gi…

git基础 -- 在 Git 中查找文件

在 Git 中查找文件 在 Git 仓库中,如果你不知道某个文件在哪个分支上存在,可以使用以下方法来查找文件。 1. 使用 git rev-list 和 git ls-tree 组合 你可以通过遍历所有分支来查找文件。以下命令会显示在某个文件路径中包含该文件的所有分支&#xf…

毕业设计选题:基于springboot+vue+uniapp的在线办公小程序

开发语言:Java框架:springbootuniappJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包&#…

C#参数数组params的使用方法

在 C# 中&#xff0c;params关键字用于指定一个方法参数可以接受可变数量的参数。调用时可以传入个数不同的实参&#xff0c;具备很好的灵活性。 首先看一个案例 class Program{public static void useParams(params int[] list){for (int i 0; i < list.Length; i){Conso…

javaScript中的浅拷贝和深拷贝详解

在 JavaScript 中&#xff0c;浅拷贝 和 深拷贝 的主要区别在于它们如何处理对象中的嵌套对象&#xff08;即对象的属性也是对象的情况&#xff09;。 1. 浅拷贝&#xff1a; 浅拷贝只复制对象的第一层属性。如果对象的属性是一个引用类型&#xff08;如对象或数组&#xff0…

【图像处理】多幅不同焦距的同一个物体的平面图象,合成一幅具有立体效果的单幅图像原理(一)

合成一幅具有立体效果的单幅图像&#xff0c;通常是利用多个不同焦距的同一物体的平面图像&#xff0c;通过图像处理技术实现的。以下是该过程的基本原理&#xff1a; 1. 立体视觉原理 人眼的立体视觉是通过双眼观察物体的不同视角而获得的。两只眼睛的位置不同&#xff0c;使…

Go基础学习05-数组和切片关系深度解析

切片和数组的联系 数组&#xff08;array&#xff09;和切片&#xff08;slice&#xff09;都属于集合类的类型&#xff0c;它们的值也都可以用来存储某一种类型的值&#xff08;或者说元素&#xff09;。数组和切片最重要的不同在于&#xff1a; 数组类型的值的长度是固定的…