学习路程五 向量数据库Milvus操作

前序

前面安装好了docker且成功拉取Milvus镜像,启动。通过python成功连接上了数据。接下来就继续更多Milvus的操作
在开始之前,先来简单了解一下向量数据库内一些东西的基本概念

概念描述
数据库(Database)类似与MySQL的database,首先需要一个库
集合 (Collection)集合类似于MySQL中的表,它是用来存储向量的容器。集合可以有多个字段,每个字段对应一个向量属性。
向量 (Vector)向量是多维空间中的点,通常用于表示数据的特征,是集合中的基本存储单元。
索引 (Index)索引是用来加速向量搜索的数据结构,有多种索引类型,如 FLAT、IVF、HNSW 等,各自都有特定的适用场景。
Filed字段,可以是结构化数据、向量;
Entity一组Filed,类似表的一条记录。

〇、可视化界面工具attu

在开始之前,可以先安装一个可视化工具,这样能方便查看自己每一步操作后的结果。

下载地址:https://github.com/zilliztech/attu/releases

如果有使用Mac的,和我一样,安装后一直提示已损坏,无法使用的。可以按照下面步骤操作,我按网上搜的,亲测可用。

  1. 打开终端,输入
    sudo spctl --master-disable
    然后输入自己的密码就好

  2. 在终端输入
    sudo xattr -r -d com.apple.quarantine
    然后把这个不能打开的attu拖过来
    在这里插入图片描述
    注意中间需要有个空格。

经过上面操作后,再重新运行,就能正常使用了。

一、数据库操作

有点类似MySQL,最先也得创建database,然后在这个database下使用,建表,查询,删除等。这块没什么特殊的内容

列出数据库

from pymilvus import MilvusClient
client = MilvusClient()  # 上面的内容可以简写
# 列出数据库
res = client.list_databases()print(res)
# 断开连接
client.close()"""
['default']
"""

创建数据库

# 创建数据库
res1 = client.create_database("test")

使用数据库

client.using_database('test')

删除数据库

client.drop_database("my_database")

二、集合相关操作

创建集合

# 创建集合,重复运行,不会反复创建集合。
client.create_collection(collection_name="test_collection",  # 集合名称dimension=2048  # 向量的维度,这里的维度,关系到后面添加的向量数据的维度
)

这里的维度跟选用的embedding模型有关,不同模型向量化出来的数据维度不同。像之前用的zhipu的embedding-3,向量化出来就是2048维度。
在这里插入图片描述
默认创建的主键名为id,不自增。向量字段名为vector,计算向量相似度的方法是COSINE
在这里插入图片描述

判断集合存在

client.has_collection('test_collection')  # 判断集合是否存在

查看集合

res = client.describe_collection('test_collection')
print(res)
"""
{'collection_name': 'test_collection', 'auto_id': False, 'num_shards': 1, 'description': '', 'fields': [{'field_id': 100, 'name': 'id', 'description': '', 'type': <DataType.INT64: 5>, 'params': {}, 'is_primary': True}, {'field_id': 101, 'name': 'vector', 'description': '', 'type': <DataType.FLOAT_VECTOR: 101>, 'params': {'dim': 2048}}], 'functions': [], 'aliases': [], 'collection_id': 456228714208843162, 'consistency_level': 2, 'properties': {}, 'num_partitions': 1, 'enable_dynamic_field': True}
"""

删除集合

client.drop_collection('demo_collection')

三、数据操作

插入数据&更新数据

首先准备数据,进行向量化,刚才看到了一个其他向量化的东西,不需要key值,先弄来用用试试

from langchain_community.embeddings import TensorflowHubEmbeddings# 向量化
embeddings = TensorflowHubEmbeddings()
text = "苹果"
query_result = embeddings.embed_query(text)
print(query_result, len(query_result))

运行过程会报错,按照报错,缺什么就安装什么。
结果是可用的,但是很慢,我也不确定是不是🪜的问题。
最好还是用之前的那个zhipu的embedding模型,反正有免费的Token数

创建collection时需要注意的是,zhipu那个embedding结果是2048维的。

# 创建milvus对象
from pymilvus import MilvusClientclient = MilvusClient()
client.using_database('test')# 创建一个集合,维度使用向量化后的数据维度
client.create_collection(collection_name="collection1",dimension=len(query_result)
)# 组装数据
data = {"id": 0,"vector": query_result,"text":"苹果"
}
# 插入数据
res = client.insert("collection1", data)
print(res)

在这里插入图片描述
在这里插入图片描述

可以看到数据已经成功添加
如果要插入多条数据,把data做成一个列表就行了。

data = [{"id": 1,"vector": [...]"text":"苹果手机"
}, {"id": 2,"vector": [...],"text":"菠萝手机"
}]
# 插入数据
res = client.insert("collection1", data)
print(res)

更新数据id不变,后面数据变一下,重新插入就好了

Milvus异步操作

在Milvus中,为了高性能运作,所以添加或更新数据的操作都是异步非阻塞的,对于刚添加入库的数据,有可能无法立即查询出来或者无法查询到最新的更新的数据。

data = [{"id": 3,"vector": [...]"text":"苹果"
}, {"id": 4,"vector": [...],"text":"菠萝手机"
},{"id": 5,"vector": [...],"text":"菠萝手机"
},]
# 插入数据
res = client.insert("collection1", data)
print(res)# 刚插入或者刚修改的数据,是无法被查询到的。
res = client.get('collection1', ids=[3, 4, 5],output_fields=["id","text"])
print(res)client.close()"""
{'insert_count': 3, 'ids': [3, 4, 5]}
data: []
"""

查询数据

查询相关操作可以访问Milvus官网查阅更多:https://milvus.io/docs/get-and-scalar-query.md
下面只尝试了一下一些基本用法

查询单条数据

res = client.get('collection1', 0)

查询多条数据

res = client.get('collection1', [0,2])

基于pyhton运算过滤条件查询

res = client.query(collection_name="collection1",  # 集合名称# filter="id in [0,1,2]",  # python的运算符写查询过滤条件,但必须是字符串,而且内容必须符合python语法filter="id > 0",offset=1,  # 偏移量,开始下标+1limit=2,  # 结果限制条数2,限制返回指定数量的结果output_fields=["id", "vector"],  # 输出字段,*表示所有字段,可以指定想要的字段字段
)
print(res)

筛选搜索

也可以像SQL查询一样,模糊匹配查询

res = client.query(collection_name="collection1",  # 集合名称# filter="id in [0,1,2]",  # python的运算符写查询过滤条件,但必须是字符串,而且内容必须符合python语法filter="text like \"%手机\"",# offset=1,  # 偏移量,开始下标+1# limit=2,  # 结果限制条数2,限制返回指定数量的结果output_fields=["id", "text"],  # 输出字段,*表示所有字段,可以指定想要的字段字段
)
print(res)
"""
data: data: ["{'id': 1, 'text': '苹果手机'}", 
"{'id': 2, 'text': '菠萝手机'}", 
"{'id': 4, 'text': '苹果手机'}", 
"{'id': 5, 'text': '菠萝手机'}"]
"""

基本 近似最近邻 (ANN)搜索

query_vector = ...
res = client.search(collection_name="collection1",anns_field="vector",data=[query_vector],limit=2,search_params={"metric_type": "COSINE"}
)for hits in res:for hit in hits:print(hit)"""
{'id': 0, 'distance': 1.0, 'entity': {}}
{'id': 1, 'distance': 0.9998013377189636, 'entity': {}}
"""

这里我直接把第一个向量数据当做查询数据,进行查询。所以id=0的数据,和查询条件一模一样,余弦0,值就是1。

删除数据

查询条件的写法,与query的条件写法一致。

client.delete(collection_name="collection1",filter="id in [1, 8, 9] and text like \"%手机\""
)

四、字段操作

数据类型

Milvus中提供了Schema类用于定义集合的属性(CollectionSchema)和字段(FieldSchema)的属性。字段存储的数据按不同结构分不同数据类型,这些都是提前通过Schema来进行定义。首先了解关于数据类型部分的内容。

常量常数字段类型描述
BOOL1标量布尔类型
INT82标量8位整型
INT163标量16位整型
INT324标量32位整型
INT645主键,标量64位整型
FLOAT10标量单精度浮点型
DOUBLE11标量双精度浮点型
VARCHAR21主键,标量字符串类型,max_length=65,535
BINARY_VECTOR100向量二进制向量类型
FLOAT_VECTOR101向量32位单精度浮点数向量
FLOAT16_VECTOR102向量16位半精度浮点数向量
BFLOAT16_VECTOR103向量16位半精度浮点数向量,比FLOAT16_VECTOR显存占用量更小,精度更低。
SPARSE_FLOAT_VECTOR104向量稀疏向量,存储非零元素及其相应索引的列表
ARRAY22复合数组,就是python中的列表
JSON23复合json文档,就是python中的字典
NONE0空类型,无法设置为字段类型,milvus返回的格式,
UNKNOWN999未知类型,无法设置为字段类型,milvus返回的格式。

Milvus允许在创建schema时为每个标量字段指定默认值,从而减低插入数据的复杂性,但不包括主键字段。如果在插入数据时将字段留空,则将应用为此字段指定的默认值。

通过schema创建集合

from pymilvus import DataType
from pymilvus import MilvusClientclient = MilvusClient()client.using_database('test')
# enable_dynamic_field=True 表示开启动态字段,开启后,除 id 和 vector 之外的所有字段都被视为动态字段。
# 这些额外的字段被保存为在名为 $meta 的特殊字段内的键值对。在后面的操作当前集合的数据时允许在插入数据时包含未定义的额外字段。
schema = client.create_schema(enable_dynamic_field=True)# schema.add_field(field_name="字段名", datatype=DataType.字段类型, is_primary=True, auto_id=True, description="字段描述"), # 设置主键字段
# schema.add_field(field_name="字段名", datatype=DataType.字段类型, default_value=默认值, dim=维度, description="字段描述"),
schema.add_field(field_name="id", datatype=DataType.INT64, is_primary=True, auto_id=True)
schema.add_field(field_name="vector", datatype=DataType.FLOAT_VECTOR, dim=5)index_params = client.prepare_index_params()
# 当把索引设置为AUTOINDEX,则表示将来这里的索引类型是根据存储内容来自动识别。
index_params.add_index(field_name="vector",index_type="AUTOINDEX",metric_type="COSINE")
collection = client.create_collection(collection_name="test_01", # 集合名称schema=schema, # 字段参数index_params=index_params,  # 索引参数
)

在这里插入图片描述

五、索引

索引是提高数据检索效率的关键技术。在 Milvus 中,索引用于加速向量数据的搜索过程。通过索引,可以快速定位到与查询向量最相似的数据向量。

索引类型

Milvus 提供了多种索引类型对字段值进行排序,以实现高效的相似性搜索。

索引适用场景
FLAT原始文件索引,适合在小型、百万级数据集上寻求完全准确和精确搜索结果的,且需要100%召回率的场景。
IVF_FLAT基于量化的索引倒排文件索引,适合寻求在准确性和查询速度之间取得理想平衡的场景。GPU_IVF_FLAT是IVF_FLAT的GPU版本实现。
IVF_SQ8基于量化的索引适合寻求显著减少磁盘、CPU和GPU内存消耗的场景
IVF_PQ基于量化的索引适合寻求高查询速度,即使以牺牲准确性为代价的场景。GPU_IVF_PQ是IVF_PQ的GPU版本实现。
HNSW基于图的索引适合对搜索效率有高要求的场景

注意:

Milvus 目前仅支持对向量和标量字段创建索引。其中给向量字段建立的索引叫向量索引,同理,给标量字段创建的索引叫标量索引。

建议对经常使用的向量字段和标量字段创建索引。
Milvus 目前只支持为集合的每个字段创建一个索引文件。注意:是一个字段只能设置一个索引,不是一个集合只有一个索引!!

Milvus 还提供三种度量类型:余弦相似度 (COSINE)、欧几里得距离 (L2) 和内积 (IP,Inner Product)来测量向量嵌入之间的距离。

常用度量方法参考:https://blog.csdn.net/qq_42222846/article/details/145829907

删除索引

在这里插入图片描述
因为之前创建集合时默认是有索引的,先删除

client.release_collection('test_01')  # 先从内存中释放数据
client.drop_index(collection_name="test_01",index_name="vector"
)

删除完成后就变成没有索引了
在这里插入图片描述

创建索引


index_params = client.prepare_index_params()index_params.add_index(collection_name="test_01",field_name="vector",index_params=index_params,metric_type="L2",index_type="IVF_FLAT",params={"nlist": 100},  # list,分区设置
)client.create_index(collection_name='test_01', index_params=index_params)
# 创建完索引以后,需要手动加载下集合
client.load_collection(collection_name='test_01')

创建完成后就是我们设置的索引了
在这里插入图片描述

查看索引

res = client.describe_index(collection_name="test_01",index_name="vector")print(res)"""
{'nlist': '100', 
'index_type': 'IVF_FLAT', 
'collection_name': 'test_01',
'index_params': "[{'field_name': 'vector', 'index_type': 'IVF_FLAT', 'index_name': '', 'collection_name': 'test_01', 'index_params': <pymilvus.milvus_client.index.IndexParams object at 0x1278cffd0>, 'metric_type': 'L2', 'params': {'nlist': 100, 'index_type': 'IVF_FLAT', 'collection_name': 'test_01', 'index_params': <pymilvus.milvus_client.index.IndexParams object at 0x1278cffd0>, 'metric_type': 'L2'}}]", 
'metric_type': 'L2', 
'field_name': 'vector',
'index_name': 'vector', 
'total_rows': 0, 
'indexed_rows': 0, 
'pending_index_rows': 0, 
'state': 'Finished'}
"""

六、结合智谱AI向量化存储Milvus,再查询

1. 向量化,存储

import osos.environ["ZHIPUAI_API_KEY"] = "a22568xxx"from langchain_community.embeddings import ZhipuAIEmbeddings
embeddings = ZhipuAIEmbeddings(model="embedding-3",dimensions=1024
)data = ["欢迎来到成都。","欢迎来到重庆。","欢迎来到北京。","我喜欢成都。","你是重庆人吗?"
]
embeddings = embeddings.embed_documents(data)
data = [{"vector": item} for item in embeddings]# 创建milvus对象,操作数据集
from pymilvus import MilvusClientclient = MilvusClient()
client.using_database('test')from pymilvus import DataTypeschema = client.create_schema(enable_dynamic_field=True)
schema.add_field(field_name="id", datatype=DataType.INT64, is_primary=True, auto_id=True),
schema.add_field(field_name="vector", datatype=DataType.FLOAT_VECTOR, dim=1024)  # 与上面embedding模型得到的dim值保持一致index_params = client.prepare_index_params()
index_params.add_index(field_name="vector", index_type="IVF_FLAT", metric_type="L2", nlist=128)
collection = client.create_collection(collection_name="my_collection",  # 集合名称schema=schema,  # 字段参数index_params=index_params,  # 索引参数
)client.load_collection('my_collection')# 把zhipu ai向量化的数据存储起来
client.insert(collection_name='my_collection', data=data)client.close()

在这里插入图片描述
可以看到数据被存起来了。度量方式是L2
在这里插入图片描述

2.模拟用户查询(L2)

# -*- coding: utf-8 -*-
# @Author : John
# @Time : 2025/02/25
# @File : query.pyimport os
from pymilvus import MilvusClientos.environ["ZHIPUAI_API_KEY"] = "a225xxx"client = MilvusClient()# 切换数据库
client.using_database('test')# 把要查询的内容转换嵌入变量from langchain_community.embeddings import ZhipuAIEmbeddingsembeddings = ZhipuAIEmbeddings(model="embedding-3",dimensions=1024
)
# 把用户查询的数据向量化
query_sentence_embedding = embeddings.embed_query("欢迎来到深圳")# 到milvus中查询
search_params = {"metric_type": "L2",  # 因为集合中的索引使用的就是L2(欧氏距离),所以我们这里必须写成欧式距离"params": {}
}
result = client.search(collection_name="my_collection",data=[query_sentence_embedding],search_params=search_params
)print(result)
client.close()

得到结果如下

{'id': 456235719503916998, 'distance': 0.23892742395401, 'entity': {}}, 
{'id': 456235719503916999, 'distance': 0.24597115814685822, 'entity': {}}, 
{'id': 456235719503917000, 'distance': 0.2479812204837799, 'entity': {}}, 
{'id': 456235719503917001, 'distance': 0.43177342414855957, 'entity': {}}, 
{'id': 456235719503917002, 'distance': 0.47823566198349, 'entity': {}}]
存储的数据:"欢迎来到成都。","欢迎来到重庆。","欢迎来到北京。","我喜欢成都。","你是重庆人吗?"
查询的数据:"欢迎来到深圳"

可以看出,查询的这句话,与前三句很相近,只有2个字不同,而和下面2句差距就比较大。输出的结果也是如此。
L2距离查询,也就是两点之间的距离,越小就越相近。

七、通过LangChain调用milvus

# 1.初始化嵌入模型
import os
os.environ["ZHIPUAI_API_KEY"] = "a2256xxx"from langchain_community.embeddings import ZhipuAIEmbeddings
embeddings_model = ZhipuAIEmbeddings(model="embedding-3",dimensions=1024
)# 2. Milvus数据库配置
milvus_host = "127.0.0.1"  # Milvus服务器的主机名或IP地址
milvus_port = "19530"  # Milvus服务器的端口
collection_name = "my_collection"  # 数据集合的名称# 3. 初始化Milvus向量存储【
from langchain_milvus import Milvus
vector_store = Milvus(embedding_function=embeddings_model,  # 指定嵌入模型collection_name=collection_name,connection_args={"host": milvus_host, "port": milvus_port},auto_id=True,  # 设置集合中的数据为自动增长ID,默认是False# primary_field="id",  # 设置主键名称,默认是id,可以不改
)# 4.嵌入文本数据并存储到Milvus
texts = ["小红是公司财务。","小张是开发人员。","小刘是前台。"
]
from langchain.schema import Document
documents = [Document(page_content=text, metadata={'tid': key}) for key,text in enumerate(texts)]
vector_store.add_documents(documents)# 5. 查询并搜索相似文本
query = "公司的前台是谁?"
embedded_query = embeddings_model.embed_query(query)
# 打印搜索结果【1个结果】
# print(embedded_query)# 使用Milvus进行相似度搜索
search_results = vector_store.similarity_search(query)
# 6. 打印搜索结果【多个结果】,第一个是相似度最高的结果
for result in search_results:print("相关文本:", result.page_content, result.metadata)"""
相关文本: 小刘是前台。 {'tid': 2, 'pk': 456235719503917023}
相关文本: 小红是公司财务。 {'tid': 0, 'pk': 456235719503917021}
相关文本: 小张是开发人员。 {'tid': 1, 'pk': 456235719503917022}
"""

更换问题后,相似度计算靠前的答案也更改了。

....
query = "谁是公司的财务?"
...
"""
相关文本: 小红是公司财务。 {'pk': 456235719503917021, 'tid': 0}
相关文本: 小刘是前台。 {'pk': 456235719503917023, 'tid': 2}
相关文本: 小张是开发人员。 {'pk': 456235719503917022, 'tid': 1}
"""

常用的距离度量方法

如文中出现的 L2, COSIN等这些

可以参考:https://blog.csdn.net/qq_42222846/article/details/145829907

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

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

相关文章

SpringBoot 热部署

1、添加 DevTools 依赖 <!-- 热部署依赖 --> <dependency> <groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId> </dependency>2、在IDEA的菜单栏中依次选择“File”→“Settings”&#x…

SOC-ATF 安全启动BL1流程分析(1)

一、ATF 源码下载链接 1. ARM Trusted Firmware (ATF) 官方 GitHub 仓库 GitHub 地址: https://github.com/ARM-software/arm-trusted-firmware 这是 ATF 的官方源码仓库&#xff0c;包含最新的代码、文档和示例。 下载方式&#xff1a; 使用 Git 克隆仓库&#xff1a; git…

汽车无钥匙进入一键启动操作正确步骤

汽车智能无钥匙进入和一键启动的技术在近年来比较成熟&#xff0c;不同车型的操作步骤可能略有不同&#xff0c;但基本的流程应该是通用的&#xff0c;不会因为时间变化而有大的改变。 移动管家汽车一键启动无钥匙进入系统通常是通过携带钥匙靠近车辆&#xff0c;然后触摸门把…

excel单、双字节字符转换函数(中英文输入法符号转换)

在Excel中通常使用函数WIDECHAR和ASC来实现单、双字节字符之间的转换。其中 WIDECHAR函数将所有的字符转换为双字节&#xff0c;ASC函数将所有的字符转换为单字节 首先来解释一下单双字节的含义。单字节一般对应英文输入法的输入&#xff0c;如英文字母&#xff0c;英文输入法…

IP----访问服务器流程

这只是IP的其中一块内容-访问服务器流程&#xff0c;IP还有更多内容可以查看IP专栏&#xff0c;前一段学习内容为IA内容&#xff0c;还有更多内容可以查看IA专栏&#xff0c;可通过以下路径查看IA-----配置NAT-CSDN博客CSDN,欢迎指正 1.访问服务器流程 1.分层 1.更利于标准化…

Ubutu部署WordPress

前言 什么是word press WordPress是一种使用PHP语言开发的建站系统&#xff0c;用户可以在支持PHP和MySQL数据库的服务器上架设WordPress。它是一个开源的内容管理系统&#xff08;CMS&#xff09;&#xff0c;允许用户构建动态网站和博客。现在的WordPress已经强大到几乎可以…

LangChain构建行业知识库实践:从架构设计到生产部署全指南

文章目录 引言:行业知识库的进化挑战一、系统架构设计1.1 核心组件拓扑1.2 模块化设计原则二、关键技术实现2.1 文档预处理流水线2.2 混合检索增强三、领域适配优化3.1 医学知识图谱融合3.2 检索结果重排序算法四、生产环境部署4.1 性能优化方案4.2 安全防护体系五、评估与调优…

Lua的table(表)

Lua表的基本概念 Lua中的表&#xff08;table&#xff09;是一种多功能数据结构&#xff0c;可以用作数组、字典、集合等。表是Lua中唯一的数据结构机制&#xff0c;其他数据结构如数组、列表、队列等都可以通过表来实现。 表的实现 Lua的表由两部分组成&#xff1a; 数组部分…

应对现代生活的健康养生指南

在科技飞速发展的现代社会&#xff0c;人们的生活方式发生了巨大改变&#xff0c;随之而来的是一系列健康问题。快节奏的生活、高强度的工作以及电子产品的过度使用&#xff0c;让我们的身体承受着前所未有的压力。因此&#xff0c;掌握正确的健康养生方法迫在眉睫。 针对久坐不…

使用DeepSeek/chatgpt等AI工具辅助网络协议流量数据包分析

随着deepseek,chatgpt等大模型的能力越来越强大&#xff0c;本文将介绍一下deepseek等LLM在分数流量数据包这方面的能力。为需要借助LLM等大模型辅助分析流量数据包的同学提供参考&#xff0c;也了解一下目前是否有必要继续学习wireshark工具以及复杂的协议知识。 pcap格式 目…

【Linux】CentOS7停服之后配置yum镜像源

&#x1f64b;大家好&#xff01;我是毛毛张! &#x1f308;个人首页&#xff1a; 神马都会亿点点的毛毛张 毛毛张今天分享一个CentOS7系统停服之后&#xff0c;配置yum镜像源的步骤&#xff0c;有坑&#xff01; 文章目录 1.概述2.查看系统架构2.1 查看内核版本2.2 查看lin…

2025-02-26 学习记录--C/C++-C语言 整数格式说明符

合抱之木&#xff0c;生于毫末&#xff1b;九层之台&#xff0c;起于累土&#xff1b;千里之行&#xff0c;始于足下。&#x1f4aa;&#x1f3fb; C语言 整数格式说明符 【例如 】&#x1f380; &#xff1a;在 C 语言中&#xff0c;%ld 是 printf 或 scanf 等格式化输入输出函…

OpenAI开放Deep Research权限,AI智能体大战升级,DeepSeek与Claude迎来新对决

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

个人电脑小参数GPT预训练、SFT、RLHF、蒸馏、CoT、Lora过程实践——MiniMind图文版教程

最近看到Github上开源了一个小模型的repo&#xff0c;是真正拉低LLM的学习门槛&#xff0c;让每个人都能从理解每一行代码&#xff0c; 从零开始亲手训练一个极小的语言模型。开源地址&#xff1a; GitHub - jingyaogong/minimind: &#x1f680;&#x1f680; 「大模型」2小时…

【数据结构】顺序表和链表

线性表 线性表 (linear list)是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串 ….. 线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时…

一文讲解Redis的内存淘汰和过期策略

Redis 报内存不足怎么处理&#xff1f; Redis 内存不足有这么几种处理方式&#xff1a; 修改配置文件 redis.conf 的 maxmemory 参数&#xff0c;增加 Redis 可用内存 也可以通过命令 set maxmemory 动态设置内存上限 修改内存淘汰策略&#xff0c;及时释放内存空间 使用 R…

游戏引擎学习第125天

仓库:https://gitee.com/mrxiao_com/2d_game_3 回顾并为今天的内容做准备。 昨天&#xff0c;当我们离开时&#xff0c;工作队列已经完成了基本的功能。这个队列虽然简单&#xff0c;但它能够执行任务&#xff0c;并且我们已经为各种操作编写了测试。字符串也能够正常推送到队…

【UCB CS 61B SP24】Lecture 16 - Data Structures 2: ADTs, BSTs学习笔记

本文首先介绍了抽象数据类型与树的概念&#xff0c;接着重点讲解二叉搜索树的定义与操作方式&#xff0c;并用 Java 实现一个标准的二叉搜索树结构。 1. 抽象数据类型 首先引入一个概念叫做抽象数据类型&#xff08;Abstract Data Type&#xff0c;ADT&#xff09;&#xff0…

包子凑数——蓝桥杯真题Python

包子凑数 输入输出样例 示例 1 输入 2 4 5输出 6样例说明 凑不出的数目包括&#xff1a;1, 2, 3, 6, 7, 11。 示例 2 输入 2 4 6输出 INF样例说明 所有奇数都凑不出来&#xff0c;所以有无限多个 运行限制 最大运行时间&#xff1a;1s最大运行内存: 256M 最大公约数 最大公…

一周学会Flask3 Python Web开发-Jinja2模版中加载静态文件

锋哥原创的Flask3 Python Web开发 Flask3视频教程&#xff1a; 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 一个Web项目不仅需要HTML模板&#xff0c;还需要许多静态文件&#xff0c;比如 CSS、JavaScript文件、图片以及音频等。在Fla…