llm学习-3(向量数据库的使用)

1:数据读取和加载

接着上面的常规操作

加载环境变量---》获取所有路径---》加载文档---》切分文档

代码如下:

import os
from dotenv import load_dotenv, find_dotenvload_dotenv(find_dotenv()) # 获取folder_path下所有文件路径,储存在file_paths里
file_paths = []
folder_path = './llm-universe/data_base/knowledge_db'
for root, dirs, files in os.walk(folder_path):# print('*'*50)# print('root:', root)# print('dirs:', dirs)# print('files:', files)# print('*'*50)for file in files:file_path = os.path.join(root, file)file_paths.append(file_path)
print('*'*50)
print('file_paths:', file_paths)from langchain.document_loaders.pdf import PyMuPDFLoader
from langchain.document_loaders.markdown import UnstructuredMarkdownLoader# 遍历文件路径并把实例化的loader存放在loaders里
loaders = []for file_path in file_paths:# 按照后缀对文件进行读取file_type = file_path.split('.')[-1]if file_type == 'pdf':loaders.append(PyMuPDFLoader(file_path))elif file_type == 'md':loaders.append(UnstructuredMarkdownLoader(file_path))# 加载文件并存储到text
texts = []
for loader in loaders: texts.extend(loader.load())
'''
载入后的变量类型为langchain_core.documents.base.Document, 文档变量类型同样包含两个属性
page_content 包含该文档的内容。
meta_data 为文档相关的描述性数据。
'''
text = texts[1]
# print(f"每一个元素的类型:{type(text)}.", 
#     f"该文档的描述性数据:{text.metadata}", 
#     f"查看该文档的内容:\n{text.page_content[0:]}", 
#     sep="\n------\n")from langchain.text_splitter import RecursiveCharacterTextSplitter# 切分文档
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
print('text_splitter_type:',  type(text_splitter))
split_docs = text_splitter.split_documents(texts)
print('split_docs_type:', type(split_docs))
print('split_docs长度:', len(split_docs))
print('split_docs[0]:', split_docs[0])


2:加载词向量模型和向量数据库

# 定义持久化路径
persist_directory = './vector_db_test/'# 删除旧的数据库文件(如果文件夹中有文件的话),windows电脑请手动删除  !rm -rf '../../data_base/vector_db/chroma'#加载chroma
from langchain.vectorstores.chroma import Chromavectordb = Chroma.from_documents(documents=split_docs[:5], # 为了速度,只选择前 20 个切分的 doc 进行生成;使用千帆时因QPS限制,建议选择前 5 个docembedding=embedding,persist_directory=persist_directory  # 允许我们将persist_directory目录保存到磁盘上
)#存储向量数据库
vectordb.persist()
print(f"向量库中存储的数量:{vectordb._collection.count()}")

在加载chroma的时候如果本身有向量数据库可能会产生错误:

Traceback (most recent call last):File "/workspaces/test_codespace/createVectordb.py", line 94, in <module>vectordb = Chroma.from_documents(File "/opt/conda/envs/zyx_llm/lib/python3.10/site-packages/langchain_community/vectorstores/chroma.py", line 778, in from_documentsreturn cls.from_texts(File "/opt/conda/envs/zyx_llm/lib/python3.10/site-packages/langchain_community/vectorstores/chroma.py", line 736, in from_textschroma_collection.add_texts(File "/opt/conda/envs/zyx_llm/lib/python3.10/site-packages/langchain_community/vectorstores/chroma.py", line 297, in add_textsself._collection.upsert(File "/opt/conda/envs/zyx_llm/lib/python3.10/site-packages/chromadb/api/models/Collection.py", line 299, in upsertself._client._upsert(File "/opt/conda/envs/zyx_llm/lib/python3.10/site-packages/chromadb/api/segment.py", line 352, in _upsertself._validate_embedding_record(coll, r)File "/opt/conda/envs/zyx_llm/lib/python3.10/site-packages/chromadb/api/segment.py", line 633, in _validate_embedding_recordself._validate_dimension(collection, len(record["embedding"]), update=True)File "/opt/conda/envs/zyx_llm/lib/python3.10/site-packages/chromadb/api/segment.py", line 648, in _validate_dimensionraise InvalidDimensionException(
chromadb.errors.InvalidDimensionException: Embedding dimension 384 does not match collection dimensionality 1024

这个就是因为你没有把之前的删除干净,解决方法就是要么删除原来的,要么重新开一个路径


3:向量检索

(1):相似度检索

Chroma的相似度搜索使用的是余弦距离,即:下面博客里面有相似度计算的向量数据库相关知识(搬运学习,建议还是看原文,这个只是我自己的学习记录)-CSDN博客

当你需要数据库返回严谨的按余弦相似度排序的结果时可以使用similarity_search函数。

(2):最大边际相关性 (MMR, Maximum marginal relevance) 检索

如果只考虑检索出内容的相关性会导致内容过于单一,可能丢失重要信息。

最大边际相关性 (MMR, Maximum marginal relevance) 可以帮助我们在保持相关性的同时,增加内容的丰富度。

核心思想是在已经选择了一个相关性高的文档之后,再选择一个与已选文档相关性较低但是信息丰富的文档。这样可以在保持相关性的同时,增加内容的多样性,避免过于单一的结果。

参考:最大边界相关算法MMR(Maximal Marginal Relevance) 实践-CSDN博客

两个检索的代码:

#向量检索
######相似度检索
question="什么是大语言模型"
# 按余弦相似度排序的结果
sim_docs = vectordb.similarity_search(question,k=3)
print(f"检索到的内容数:{len(sim_docs)}")
for i, sim_doc in enumerate(sim_docs):print(f"检索到的第{i}个内容: \n{sim_doc.page_content[:200]}", end="\n--------------\n")#######MMR检索
mmr_docs = vectordb.max_marginal_relevance_search(question,k=3)
for i, sim_doc in enumerate(mmr_docs):print(f"MMR 检索到的第{i}个内容: \n{sim_doc.page_content[:200]}", end="\n--------------\n")

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

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

相关文章

【力扣 - 每日一题】3099. 哈沙德数 | 模拟 (Go/C++)

题目内容 如果一个整数能够被其各个数位上的数字之和整除&#xff0c;则称之为 哈沙德数&#xff08;Harshad number&#xff09;。给你一个整数 x 。如果 x 是 哈沙德数 &#xff0c;则返回 x 各个数位上的数字之和&#xff0c;否则&#xff0c;返回 -1 。 示例 1&#xff1…

C++Primer Plus 第十四章代码重用:编程练习,第3题

CPrimer Plus 第十四章代码重用&#xff1a;编程练习,第3题 编程练习,第3题 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 CPrimer Plus 第十四章代码重用&#xff1a;编程练习,第3题前言定义一个 QueueTp 模板…

中国国产AI芯片的崛起

一、CUDA的垄断 当讨论半导体行业面临的挑战时&#xff0c;你首先想到的是什么&#xff1f;光刻机&#xff1f;3纳米或者5纳米技术&#xff1f;我们无法生产的完美方形芯片&#xff1f;是的&#xff0c;但也不完全是。 人们经常把半导体芯片归类为硬件产业&#xff0c;但实际上…

【大模型LLM面试合集】大语言模型基础_llm概念

1.llm概念 1.目前 主流的开源模型体系 有哪些&#xff1f; 目前主流的开源LLM&#xff08;语言模型&#xff09;模型体系包括以下几个&#xff1a; GPT&#xff08;Generative Pre-trained Transformer&#xff09;系列&#xff1a;由OpenAI发布的一系列基于Transformer架构…

Linux常用查看日志方法-如使用less查看日志文件

在Linux系统中&#xff0c;查看日志文件是常见的运维任务之一。less命令是一个非常强大的工具&#xff0c;用于查看长文本文件&#xff0c;例如日志文件。它允许你按页浏览文件&#xff0c;并提供了一些便捷的导航和搜索功能。 使用less查看日志文件 假设你有一个日志文件/va…

linux环境安装elasticsearch缓存数据库和Kibana客户端

linux环境安装elasticsearch缓存数据库&#xff0c;今天我们安装7.17.18版本&#xff0c;并分析遇到的问题。 一、elasticsearch安装运行 1、直接下载 wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.18-linux-x86_64.tar.gz2、解压 tar -…

惊艳眼球的视觉盛宴【二】

当晨光初破黎明的静谧&#xff0c;一片绚烂便悄然铺展在蔚蓝的天际。那一刻&#xff0c;大地苏醒&#xff0c;万物复苏&#xff0c;我们仿佛踏入了一幅活生生的画卷。雾气缭绕之中&#xff0c;群山似乎在低语&#xff0c;古树在轻摇&#xff0c;一切都沐浴在柔和而金黄的光芒之…

如何理解vuex中的每个概念(通俗易懂)

文章目录 1. 什么是 Vuex&#xff1f;2. Vuex 的四个核心概念 1. 什么是 Vuex&#xff1f; 想象一下&#xff0c;你家里有一个大冰箱&#xff0c;所有家庭成员都可以访问这个冰箱。每个人都可以往里面放东西&#xff0c;也可以从里面拿东西。这个冰箱就像是 Vuex 中的“状态”…

战略流程-麦肯锡企业数字化业务变革成熟度评估模型及案例深度解析

一、企业变革成熟度评估模型 企业变革成熟度诊断模型是一种评估工具&#xff0c;用于全面扫描和评估企业在变革转型过程中的能力水平。该模型通过一系列量化指标和定性分析&#xff0c;对企业在不同变革领域的成熟度进行评分&#xff0c;从而帮助企业识别在变革过程中的优势和…

第12天:上下文管理器

今日学习目标 了解上下文管理器的基本概念和作用学习如何使用 with 语句学习如何创建自定义上下文管理器理解上下文管理器的实际应用场景 1. 上下文管理器简介 上下文管理器是一种用于管理资源的机制&#xff0c;它可以在一段代码执行前后自动执行一些操作。最常见的上下文管…

QAM MMA

MMA是改进的CMA&#xff0c;有RCA和CMA的优点&#xff0c;还能对相位误差进行修正。 N 5e5; % 仿真符号数 M 16; % QAM16msg randi([0 M-1],N,1); % 产生随机符号 tx qammod(msg,M); % QAM调制test_snr 20:5:30; …

无畏契约/valorant匹配无反应、无法联机、联机报错的解决办法

无畏契约/valorant是一款热度超高的战术射击游戏&#xff0c;通过其独特的美漫英雄设计和丰富的战术性&#xff0c;以及武器技能设计系统&#xff0c;在全球吸引了不少玩家的加入和喜爱。不过近期伴随第九赛季更新&#xff0c;很多玩家重回服务器&#xff0c;却遇到了匹配无反应…

进程和内存管理 如何检查内存和CPU 内存的使用和剩余情况,当前CPU的负载情况,找进程id,结束某个进程

一、检查内存 方法一&#xff1a;查看/proc/meminfo文件&#xff0c;又被称为伪文件&#xff0c;记录了内存的相关信息&#xff0c;不可用vi/vim打开编辑&#xff0c;可用cat等命令查看。 方法二&#xff1a;free -m 命令 以MB为单位来显示内存情况。 二、检查CPU 方法一…

基于用户的协同过滤算法

目录 原理&#xff1a; 计算相似度&#xff1a; 步骤&#xff1a; 计算方法&#xff1a;Jaccard相似系数、余弦相似度。 推荐 原理&#xff1a; 先“找到相似用户”&#xff0c;再“找到他们喜欢的物品”--->人以群分。即&#xff0c;给用户推荐“和他兴趣相似的其他用…

C语言 输出*的图案(1,3,5,7,5,3,1顺序)

输出以下图案&#xff08;不是直接输出&#xff0c;且要求输出时符号居中对齐&#xff09;。 * *** ***** ******* ***** *** * 这个程序输出一个特定的图案&#xff0c;符号居中对齐。 #include <stdio.h>int main() {int n 4; // 图案的中间行数// 输出上半部分for …

绝地求生PUBG服务器延迟太高 购买领取响应时间长怎么解决

绝地求生PUBG是一款特别热门的射击类吃鸡游戏&#xff0c;游戏还有多张地图可供玩家选择&#xff0c;玩家们需要乘坐飞机空投跳伞至不同的各个角落&#xff0c;赤手空拳寻找武器&#xff0c;车辆以及物资&#xff0c;并在多种多样的地形中展开战斗。想要取得胜利&#xff0c;我…

分享一款可编辑本地电脑文件的在线编辑器

背景 之前见过在线版的VSCode&#xff0c;被惊讶到了。网页上竟然可以编辑电脑本地的文件&#xff0c;打破了网页无法编辑本地电脑文件的限制。一直好奇怎么做的。抽空研究了一下&#xff0c;然后发现其实也不难。 分析 先给大家介绍一下这款在线编辑器的效果。 左侧栏为文件…

彻底解决网络哈希冲突,百度百舸的高性能网络 HPN 落地实践

GPU 的通信性能对于大模型的训练有着至关重要的影响。在 HPN 网络工程实践中&#xff0c;我们的核心关注点是如何充分利用网络硬件资源的能力&#xff0c;将通信性能最大化&#xff0c;从而提升大模型端到端的训练性能。 1 HPN 网络 — AIPod 下图是百度百舸的高性能网络 …

Vue如何使用封装接口

在Vue项目中封装接口&#xff08;API&#xff09;是一个常见的需求&#xff0c;特别是在与后端服务进行交互时。封装接口的目的是为了将请求逻辑与组件逻辑分离&#xff0c;提高代码的可维护性和复用性。以下是一个简单的步骤和示例&#xff0c;说明如何在Vue项目中封装接口。 …

洛谷 P1020 [NOIP1999 提高组] 导弹拦截

题目描述 某国为了防御敌国的导弹袭击&#xff0c;发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷&#xff1a;虽然它的第一发炮弹能够到达任意的高度&#xff0c;但是以后每一发炮弹都不能高于前一发的高度。某天&#xff0c;雷达捕捉到敌国的导弹来袭。由于该系统…