本地大模型编程实战(02)语义检索(2)

文章目录

    • 准备
    • 按批次嵌入
    • 加载csv文件,分割文档并嵌入
    • 测试嵌入效果
    • 总结
    • 代码


上一篇文章: 本地大模型编程实战(02)语义检索(1) 详细介绍了如何使用 langchain 实现语义检索,为了演示方便,使用的是 langchain 提供的内存数据库。
在实际工作中,更多的使用场景是将矢量化的数据物理存储下来,在查询的时候在从存储介质中读取矢量数据进行查询,不会每次使用矢量数据时都必须想做嵌入。

本文描述了如何使用 Chroma 对csv数据进行矢量化,并且将矢量存储在硬盘中,未来查询矢量数据时,直接从硬盘中读取矢量数据进行查询。
另外,如果数据量大一些,矢量化数据是很花时间的,我们将使用进度条显示嵌入csv的进度。

准备

在正式开始撸代码之前,需要准备一下编程环境。

  1. 计算机
    本文涉及的所有代码可以在没有显存的环境中执行。 我使用的机器配置为:

    • CPU: Intel i5-8400 2.80GHz
    • 内存: 16GB
  2. Visual Studio Code 和 venv
    这是很受欢迎的开发工具,相关文章的代码可以在 Visual Studio Code 中开发和调试。 我们用 pythonvenv 创建虚拟环境, 详见:
    在Visual Studio Code中配置venv。

  3. Ollama
    Ollama 平台上部署本地大模型非常方便,基于此平台,我们可以让 langchain 使用 llama3.1qwen2.5 等各种本地大模型。详见:
    在langchian中使用本地部署的llama3.1大模型 。

  4. C++编译器
    安装 Chroma 时需要C++编译器的支持。我是通过安装 Visual Studio .Net Community 2022 来安装C++编译器的。
    点击这里下载Visual Studio .Net Community

按批次嵌入

一般来说,将文本矢量化很消耗资源,所以耗时较长,我们定义一个按照批次嵌入文档的方法,使用 tqdm 显示进度:

def embed_documents_in_batches(documents, batch_size=10):
    """
    按批次嵌入,可以显示进度。
    vectordb会自动持久化存储在磁盘。
    """
    vectordb = Chroma(persist_directory=persist_directory,embedding_function=embedding)
    for i in tqdm(range(0, len(documents), batch_size), desc="嵌入进度"):
        batch = documents[i:i + batch_size]
        # 从文本块生成嵌入,并将嵌入存储在本地磁盘。
        vectordb.add_documents(batch)

加载csv文件,分割文档并嵌入

这里调用之前的按批次嵌入方法,完成嵌入:

def create():
    """对文本矢量化并存储在本地磁盘"""

    data_file = os.path.join(current_dir,'assert/law.csv')

    loader = CSVLoader(file_path=data_file,
                       csv_args={"delimiter": "#"},
                       autodetect_encoding=True)
    docs = loader.load()
    #print(f'加载文件成功,第一个文件内容:{docs[0]}')

    # 用于将长文本拆分成较小的段,便于嵌入和大模型处理。
    # 每个文本块的最大长度是1000个字符,拆分的文本块之间重叠部分为200。
    text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
    texts = text_splitter.split_documents(docs)   

    # 耗时较长,需要耐心等候...
    embed_documents_in_batches(texts,batch_size=3)

在执行的过程中,我们会在 VS Code 的 Terminal 中直观的看到进入:
矢量化嵌入过程

测试嵌入效果

此时在assert文件夹中已经生成了一个 db_law 文件夹,这里面存储的就是矢量化的数据。

def search(query):
    """查询矢量数据库"""
    vector_store = Chroma(persist_directory=persist_directory,embedding_function=embedding)
    results = vector_store.similarity_search_with_score(query,k=2)
    return results

我们调用此方法做一下测试:

results = search("恶意商标申请")
print(f'search results:\n{results}')
search results:
[(Document(id='3ef03cff-e0b1-416c-93f6-1ff281af323c', metadata={'row': 1, 'source': 'E:\\project\\my_opensource\\programming-with-local-large-language-model-gitee\\server\\services\\practice\\assert/law.csv'}, page_content='第六章  法律责任    第三十三条  管理专利工作的部门认定专利侵权行为成立,作出处理决定的,应当责令侵权人立即停止侵权行为,采取下列制止侵权行为的措施:    (一)侵权人制造专利产品
的,责令其立即停止制造行为,销毁制造侵权产品的专用设备、模具,并且不得销售、使用尚未售出的侵权产品或者以任何其他形式将其投放市场;侵权产品难以保存的,责令侵权人销毁该产品。    (二)侵权人使用专利方法
的,责令其立即停止使用行为,销毁实施专利方法的专用设备、模具,并且不得销售、使用尚未售出的依照专利方法所直接获得的产品或者以任何其他形式将其投放市场;侵权产品难以保存的,责令侵权人销毁该产品。    (三
)侵权人销售专利产品或者依照专利方法直接获得产品的,责令其立即停止销售行为,并且不得使用尚未售出的侵权产品或者以任何其他形式将其投放市场;尚未售出的侵权产品难以保存的,责令侵权人销毁该产品。    (四)
侵权人许诺销售专利产品或者依照专利方法直接获得产品的,责令其立即停止许诺销售行为,消除影响,并且不得进行任何实际销售行为。    (五)侵权人进口专利产品或者依照专利方法直接获得产品的,责令侵权人立即停止
进口行为;侵权产品已经入境的,不得销售、使用该侵权产品或者以任何其他形式将其投放市场;侵权产品难以保存的,责令侵权人销毁该产品;侵权产品尚未入境的,可以将处理决定通知有关海关。    (六)停止侵权行为的
其他必要措施。    第三十四条  管理专利工作的部门作出认定专利侵权行为成立的处理决定后,被请求人向人民法院提起行政诉讼的,在诉讼期间不停止决定的执行。    侵权人对管理专利工作的部门作出的认定侵权行为成立
的处理决定期满不起诉又不停止侵权行为的,管理专利工作的部门可以申请人民法院强制执行。    第三十五条  假冒他人专利,涉嫌触犯刑法第二百一十六条的,由管理专利工作的部门移送司法机关依法追究刑事责任。    伪
造或者变造专利证书,涉嫌触犯刑法第二百八十条规定的,由管理专利工作的部门移送司法机关追究刑事责任。    第三十六条  管理专利工作的部门认定假冒他人专利、冒充专利行为成立的,应当责令行为人采取下列改正措施
:'), 0.9691819652571181)]

总结

通过以上步骤,我们实现了将csv数据矢量化并存储在本地,后面我们可以基于此继续开发 RAG 系统和 Agent

代码

本文涉及的所有代码以及相关资源都已经共享,参见:

  • github
  • gitee

🪐祝好运🪐

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

猿人学第一题 js混淆源码乱码

首先检查刷新网络可知,m参数被加密,这是一个ajax请求 那么我们直接去定位该路径 定位成功 观察堆栈之后可以分析出来这应该是一个混淆,我们放到解码平台去还原一下 window["url"] "/api/match/1";request function…

Dev-C++分辨率低-解决办法

目录 【工具】Dev-C分辨率低-解决办法问题背景完整操作指南第一步:打开属性设置 【工具】Dev-C分辨率低-解决办法 问题背景 Dev-C因版本老旧(长期未更新),在高分辨率显示器上存在界面模糊问题。通过修改Windows兼容性设置可优化…

Linux 小火车

1.添加epel软件源 2.安装sl 3. 安装完成后输入: sl

iic、spi以及uart

何为总线? 连接多个部件的信息传输线,是部件共享的传输介质 总线的作用? 实现数据传输,即模块之间的通信 总线如何分类? 根据总线连接的外设属于内部外设还是外部外设将总线可以分为片内总线和片外总线 可分为数…

Linux_线程控制

线程控制的相关接口 进程创建相关 之前我们已经认识到了pthread_create函数用来创建线程&#xff0c;这里不再赘述。 pthread_self函数 void* routine(void* args) {std::cout << "我是新线程..." << pthread_self() << std::endl;return null…

利用双指针一次遍历实现”找到“并”删除“单链表倒数第K个节点(力扣题目为例)

Problem: 19. 删除链表的倒数第 N 个结点 文章目录 题目描述思路复杂度Code 题目描述 思路 1.欲找到倒数第k个节点&#xff0c;即是找到正数的第n-k1、其中n为单链表中节点的个数个节点。 2.为实现只遍历一次单链表&#xff0c;我们先可以使一个指针p1指向链表头部再让其先走k步…

Ubuntu-手动安装 SBT

文章目录 前言Ubuntu-手动安装 SBT1. SBT是什么?1.1. SBT 的特点1.2. SBT 的基本功能1.3. SBT 的常用命令 2. 安装2.1. 下载2.2. 解压 sbt 二进制包2.3. 确认 sbt 可执行文件的位置2.4. 设置执行权限2.5. 创建符号链接2.6. 更新 PATH 环境变量2.7. 验证 sbt 安装 前言 如果您觉…

【ProtoBuf 安装】ProtoBuf在window/Linux下的安装 创建/删除swap分区

文章目录 1.ProtoBuf在window下的安装2.ProtoBuf在Linux下的安装创建swap分区命令解析关闭swap分区删除swap分区的影响 1.ProtoBuf在window下的安装 1、下载ProtoBuf编译器 下载地址&#xff1a;https://github.com/protocolbuffers/protobuf/releases 如果要在 C 下使用 Pro…

BAHD酰基转移酶对紫草素的手性催化-文献精读105

Two BAHD Acyltransferases Catalyze the Last Step in the Shikonin/Alkannin Biosynthetic Pathway 两个BAHD酰基转移酶催化了紫草素/左旋紫草素生物合成途径中的最后一步 一个BAHD酰基转移酶专门催化紫草素的酰基化&#xff0c;而另一个BAHD酰基转移酶则仅催化紫草素的对映…

C语言初阶力扣刷题——349. 两个数组的交集【难度:简单】

1. 题目描述 力扣在线OJ题目 给定两个数组&#xff0c;编写一个函数来计算它们的交集。 示例&#xff1a; 输入&#xff1a;nums1 [1,2,2,1], nums2 [2,2] 输出&#xff1a;[2] 输入&#xff1a;nums1 [4,9,5], nums2 [9,4,9,8,4] 输出&#xff1a;[9,4] 2. 思路 直接暴力…

在Docker 容器中安装 Oracle 19c

在 Docker 容器中安装 Oracle 19c 是可行的&#xff0c;但它相较于其他数据库&#xff08;如 MySQL、PostgreSQL 等&#xff09;会复杂一些&#xff0c;因为 Oracle 数据库有一些特定的要求&#xff0c;如操作系统和库的依赖&#xff0c;以及许可证问题。 不过&#xff0c;Ora…

WGCLOUD使用介绍 - 如何监控ActiveMQ和RabbitMQ

根据WGCLOUD官网的信息&#xff0c;目前没有针对ActiveMQ和RabbitMQ这两个组件专门做适配 不过可以使用WGCLOUD已经具备的通用监测模块&#xff1a;进程监测、端口监测或者日志监测、接口监测 来对这两个组件进行监控

初学stm32 --- FreeRTOS移植

目录 移植前准备 1. 基础工程 2. FreeRTOS 源码 添加 FreeRTOS 文件 1. 添加 FreeRTOS 源码 2. 将文件添加到工程 3. 添加头文件路径 4. 添加 FreeRTOSConfig.h 文件 (1) FreeRTOSConfig.h 获取途径一 (2) FreeRTOSConfig.h 获取途径二 (3) FreeRTOSConfig.h 获取途径…

ThreadLocal概述、解决SimpleDateFormat出现的异常、内存泄漏、弱引用、remove方法

①. ThreadLocal简介 ①. ThreadLocal是什么 ①. ThreadLocal本地线程变量,线程自带的变量副本(实现了每一个线程副本都有一个专属的本地变量,主要解决的就是让每一个线程绑定自己的值,自己用自己的,不跟别人争抢。通过使用get()和set()方法,获取默认值或将其值更改为当前线程…

【2024年 CSDN博客之星】我的2024年创作之旅:从C语言到人工智能,个人成长与突破的全景回顾

我的2024年创作之旅&#xff1a;从C语言到人工智能&#xff0c;个人成长与突破的全景回顾 引言 回望2024年&#xff0c;我不仅收获了技术上的成长&#xff0c;更收获了来自CSDN平台上无数粉丝、朋友以及网友们的支持与鼓励。在这条创作之路上&#xff0c;CSDN不仅是我展示技术成…

Windows11恢复传统右键菜单

Windows11恢复传统右键菜单 执行下面的命令(管理员下) reg add "HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32" /f /vetaskkill /f /im explorer.exestart explorer.exe或者 reg add "HKCU\Software\Classes\CLSID\{8…

PCIE模式配置

对于VU系列FPGA&#xff0c;当DMA/Bridge Subsystem for PCI Express IP配置为Bridge模式时&#xff0c;等同于K7系列中的AXI Memory Mapped To PCI Express IP。

WPS数据分析000008

目录 一、替换 通配符 求出橙色底纹单元格的和 二、定位 拆分并填充内容 删除空行 一、替换 快捷键ctrlh 注意&#xff1a;限制数据区域。 若为单元格&#xff0c;表示选择整个工作表。 通配符 求出橙色底纹单元格的和 第一步&#xff1a;查找出橙色单元格&#xff0c;c…

Excel制作合同到期自动提醒!

大家好&#xff0c;我是小鱼。 今天分享一下如何利用Excel制作合同到期提醒表&#xff0c;实现Excel表格自动计算合同到期日和天数&#xff0c;根据合同状态和到期天数自动填充颜色提醒&#xff0c;超实用。先看一下效果&#xff0c;已经到期的合同会自动被填充为红色&#xf…

GestureDetector组件的功能与用法

文章目录 1 概念介绍2 使用方法3 示例代码 我们在上一章回中介绍了ListView响应事件的内容,本章回中将介绍GestureDetector Widget.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1 概念介绍 我们在这里介绍的GestureDetector是一个事件响应Widget,它可以响应双击事件&…