本地大模型编程实战(03)语义检索(2)
文章目录
- 准备
- 按批次嵌入
- 加载csv文件,分割文档并嵌入
- 测试嵌入效果
- 总结
- 代码
上一篇文章: 本地大模型编程实战(02)语义检索(1) 详细介绍了如何使用
langchain实现语义检索,为了演示方便,使用的是langchain提供的内存数据库。
在实际工作中,更多的使用场景是将矢量化的数据物理存储下来,在查询的时候在从存储介质中读取矢量数据进行查询,不会每次使用矢量数据时都必须想做嵌入。
本文描述了如何使用 Chroma 对csv数据进行矢量化,并且将矢量存储在硬盘中,未来查询矢量数据时,直接从硬盘中读取矢量数据进行查询。
另外,如果数据量大一些,矢量化数据是很花时间的,我们将使用进度条显示嵌入csv的进度。
准备
在正式开始撸代码之前,需要准备一下编程环境。
-
计算机
本文涉及的所有代码可以在没有显存的环境中执行。 我使用的机器配置为:- CPU: Intel i5-8400 2.80GHz
- 内存: 16GB
-
Visual Studio Code 和 venv
这是很受欢迎的开发工具,相关文章的代码可以在Visual Studio Code中开发和调试。 我们用python的venv创建虚拟环境, 详见:
在Visual Studio Code中配置venv。 -
Ollama
在Ollama平台上部署本地大模型非常方便,基于此平台,我们可以让langchain使用llama3.1、qwen2.5等各种本地大模型。详见:
在langchian中使用本地部署的llama3.1大模型 。 -
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
🪐祝好运🪐
相关文章:
本地大模型编程实战(03)语义检索(2)
文章目录 准备按批次嵌入加载csv文件,分割文档并嵌入测试嵌入效果总结代码 上一篇文章: 本地大模型编程实战(02)语义检索(1) 详细介绍了如何使用 langchain 实现语义检索,为了演示方便,使用的是 langchain 提供的内存数据库。 在实…...
LabVIEW橡胶动态特性测试系统
本文介绍了一个利用LabVIEW软件和NI高速数据采集设备构建的橡胶动态特性测试系统。该系统实现了橡胶材料动态性能的精确测量,并通过虚拟仪器技术,提高了测试数据的处理效率和准确性。系统支持实时数据处理和多种信号的动态分析,适用于工业和科…...
SpringBoot开发(二)Spring Boot项目构建、Bootstrap基础知识
1. Spring Boot项目构建 1.1. 简介 基于官方网站https://start.spring.io进行项目的创建. 1.1.1. 简介 Spring Boot是基于Spring4框架开发的全新框架,设计目的是简化搭建及开发过程,并不是对Spring功能上的增强,而是提供了一种快速使用Spr…...
使用 Vue 3 的 watchEffect 和 watch 进行响应式监视
Vue 3 的 Composition API 引入了 <script setup> 语法,这是一种更简洁、更直观的方式来编写组件逻辑。结合 watchEffect 和 watch,我们可以轻松地监视响应式数据的变化。本文将介绍如何使用 <script setup> 语法结合 watchEffect 和 watch&…...
Vue.js 高级组件开发
Vue.js 高级组件开发:构建一个智能动态表单生成器 ——从可复用架构到性能优化的全链路实践 引言:为什么需要高级组件? 在现代前端开发中,组件不仅是UI的封装,更是业务逻辑的载体。一个“高级”Vue组件应当具备&…...
React应用深度优化与调试实战指南
一、渲染性能优化进阶 1.1 精细化渲染控制 typescript 复制 // components/HeavyComponent.tsx import React, { memo, useMemo } from react;interface Item {id: string;complexData: {// 复杂嵌套结构}; }const HeavyComponent memo(({ items }: { items: Item[] }) &g…...
Linux 内核学习(4) --- devfreq 动态调频框架
目录 Linux devfreq 简介核心数据结构devfreq_dev_profile 结构体devfreq_governor 结构体devfreq 结构体 工作流程devFreq framework 初始化governor 初始化devfreq Device 注册动态变频的实现device_unregister 流程 用户空间节点参考文章 Linux devfreq 简介 现在的 Soc 由…...
Spring Boot 无缝集成SpringAI的函数调用模块
这是一个 完整的 Spring AI 函数调用实例,涵盖从函数定义、注册到实际调用的全流程,以「天气查询」功能为例,结合代码详细说明: 1. 环境准备 1.1 添加依赖 <!-- Spring AI OpenAI --> <dependency><groupId>o…...
Ansible自动化运维实战--yaml的使用和配置(7/8)
文章目录 一、YAML 基本语法1.1. 缩进1.2. 注释1.3. 列表1.4. 字典 二、Ansible 中 YAML 的应用2.1. Ansible 剧本(Playbooks)2.2. 变量定义2.3. 角色(Roles)2.4. Inventory 文件2.5. 数据类型2.6. 引用变量 在 Ansible 里&#x…...
kamailio-5.8.4-centos9编译
安装必要的依赖包 在开始编译之前,你需要安装编译 Kamailio 所需的一些基础依赖包: dnf install -y make gcc gcc-c flex bison libxml2-devel openssl-devel sqlite-devel mysql-devel pcre-devel libcurl-devel下载并解压 Kamailio 源码包 假设你已经…...
单例模式 - 单例模式的实现与应用
引言 单例模式(Singleton Pattern)是设计模式中最简单且最常用的模式之一。它确保一个类只有一个实例,并提供一个全局访问点来访问该实例。单例模式常用于需要全局唯一对象的场景,如配置管理、日志记录、线程池等。 本文将详细介…...
hadoop==docker desktop搭建hadoop
hdfs map readuce yarn https://medium.com/guillermovc/setting-up-hadoop-with-docker-and-using-mapreduce-framework-c1cd125d4f7b 清理资源 docker-compose down docker system prune -f...
zookeeper的介绍和简单使用
1 zookerper介绍 zookeeper是一个开源的分布式协调服务,由Apache软件基金会提供,主要用于解决分布式应用中的数据管理、状态同步和集群协调等问题。通过提供一个高性能、高可用的协调服务,帮助构建可靠的分布式系统。 Zookeeper的特点和功能…...
DiffuEraser: 一种基于扩散模型的视频修复技术
视频修复算法结合了基于流的像素传播与基于Transformer的生成方法,利用光流信息和相邻帧的信息来恢复纹理和对象,同时通过视觉Transformer完成被遮挡区域的修复。然而,这些方法在处理大范围遮挡时常常会遇到模糊和时序不一致的问题࿰…...
CentOS/Linux Python 2.7 离线安装 Requests 库解决离线安装问题。
root@mwcollector1 externalscripts]# cat /etc/os-release NAME=“Kylin Linux Advanced Server” VERSION=“V10 (Sword)” ID=“kylin” VERSION_ID=“V10” PRETTY_NAME=“Kylin Linux Advanced Server V10 (Sword)” ANSI_COLOR=“0;31” 这是我系统的版本,由于是公司内网…...
World of Warcraft [CLASSIC] Jewelcrafting Gemstone 2
World of Warcraft [CLASSIC] Jewelcrafting & Gemstone 2 珠宝加工与常用宝石列表(紫色史诗级): World of Warcraft [CLASSIC] Jewelcrafting & Gemstone_wlk宝石属性一览表-CSDN博客...
AI刷题-最小化团建熟悉程度和
目录 问题描述 输入格式 输出格式 解题思路: 状态表示 状态转移 动态规划数组 预处理 实现: 1.初始化: 2.动态规划部分: (1)对于已分组状态的,跳过: (2&…...
一文详解Filter类源码和应用
背景 在日常开发中,经常会有需要统一对请求做一些处理,常见的比如记录日志、权限安全控制、响应处理等。此时,ServletApi中的Filter类,就可以很方便的实现上述效果。 Filter类 是一个接口,属于 Java Servlet API 的一部…...
应用层协议 HTTP 讲解实战:从0实现HTTP 服务器
🌈 个人主页:Zfox_ 🔥 系列专栏:Linux 目录 一:🔥 HTTP 协议 🦋 认识 URL🦋 urlencode 和 urldecode 二:🔥 HTTP 协议请求与响应格式 🦋 HTTP 请求…...
DDD-全面理解领域驱动设计中的各种“域”
一、DDD-领域 在领域驱动设计(Domain-Driven Design,DDD)中,**领域(Domain)**指的是软件系统所要解决的特定业务问题的范围。它涵盖了业务知识、规则和逻辑,是开发团队与领域专家共同关注的核心…...
stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...
鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南
1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...
七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
Unity UGUI Button事件流程
场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...
论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing
Muffin 论文 现有方法 CRADLE 和 LEMON,依赖模型推理阶段输出进行差分测试,但在训练阶段是不可行的,因为训练阶段直到最后才有固定输出,中间过程是不断变化的。API 库覆盖低,因为各个 API 都是在各种具体场景下使用。…...
十九、【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建
【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建 前言准备工作第一部分:回顾 Django 内置的 `User` 模型第二部分:设计并创建 `Role` 和 `UserProfile` 模型第三部分:创建 Serializers第四部分:创建 ViewSets第五部分:注册 API 路由第六部分:后端初步测…...
Django RBAC项目后端实战 - 03 DRF权限控制实现
项目背景 在上一篇文章中,我们完成了JWT认证系统的集成。本篇文章将实现基于Redis的RBAC权限控制系统,为系统提供细粒度的权限控制。 开发目标 实现基于Redis的权限缓存机制开发DRF权限控制类实现权限管理API配置权限白名单 前置配置 在开始开发权限…...
python打卡第47天
昨天代码中注意力热图的部分顺移至今天 知识点回顾: 热力图 作业:对比不同卷积层热图可视化的结果 def visualize_attention_map(model, test_loader, device, class_names, num_samples3):"""可视化模型的注意力热力图,展示模…...
「Java基本语法」变量的使用
变量定义 变量是程序中存储数据的容器,用于保存可变的数据值。在Java中,变量必须先声明后使用,声明时需指定变量的数据类型和变量名。 语法 数据类型 变量名 [ 初始值]; 示例:声明与初始化 public class VariableDemo {publi…...
