Database
sqlite
Python Client
查看所有的表结构信息
import sqlite3
conn = sqlite3.connect('your_database_name.db')
cursor = conn.cursor()
# 获取数据库中所有的表格名
cursor.execute("SELECT name FROM sqlite_master WHERE type='table';")
tables = cursor.fetchall()
# 遍历每个表格,打印其schema, 并打印数据表里的数据
for table in tables:
print("="*50)
table_name = table[0]
print(f"Schema for table: {table_name}")
cursor.execute("PRAGMA table_info({})".format(table_name))
schema = cursor.fetchall()
for column in schema:
print(column[1], column[2], end=", ")
print("\n")
print(f"Data for table: {table_name}")
cursor.execute(f"select * from {table_name}")
result = cursor.fetchall()
for row in result:
print(row)
print("\n")
# 关闭连接
conn.close()DB Browser for SQLite
下载地址: https://sqlitebrowser.org/
可以交互式地查看修改 sqlite 的 xx.db 文件
坑: 在 windows 上安装 x64 版本的 DB Browser for SQLite, 但希望 xx.db 位于 WSL2 内的目录, 无法达到目的.
MySQL
部署: Docker (TODO)
Python Client (TODO)
sqlalchemy
sqlalchemy 有两套 API, 一套被称为 Core, 另一套被称为 ORM, 分别使用如下方式进行导入:
其中 ORM 是对 Core 的上层封装, 也更 pythonic
建立连接
连接到数据库需要先建立 engine (连接池)
Core: connect
从连接池里获取一个连接, 以进行数据库操作
ORM: session
使用 ORM API 时, 与 connect 对应的概念是 Session
构建表
Core 构建表
使用 Core 的方式定义 Table 的方式被称为 Table constructor. 一般都是用多个 Table 共享一个 MetaData 实例.
ORM 构建表
使用 ORM 的方式定义 Table 的方式被称为: ORM Mapped classes / Declarative Forms, 具体如下:
Step 1: Base,可以用任意一种方式进行
Step 2: 继承 Base
relationship 是可选的, 实际的数据库存储里并不包含 user 及 addresses 这两列, 它与 ForeignKey 的关系以及给 ORM API 带来的便利性具体见后续, 大体如下(TODO: 待确认)
操作表: 增删改查
TODO: 下例其实有些杂糅, 操作语句用的 Core API, 而执行用的 ORM API, 本质上此例算作 Core API
Core
ORM
杂记
faiss
faiss 只支持稠密向量的 IP(内积) 和 L2 距离
neo4j
Server
要启用 apoc (langchain, llama_index 等一般都需要这个功能) 需要对官方镜像打上补丁:
build 镜像
启动镜像 (可以多个版本独立部署):
注意:
部署多个容器时, 使用 Neo4j browser 登录时要注意选择好正确的 bolt 地址
neo4j 社区版一个实例只能有一个图 (database)
Python Client (TODO)
Milvus 2.3.x
使用 Docker 启动服务, 并安装相应的 Python Client
database: 默认是
default, 对应于关系型数据库管理系统 (RDBMS) 中的 databasecollection: 对应于 RDBMS 中的 table
partition:
Milvus 2.4.x 新特性
新特性说明可参考 release 信息: https://github.com/milvus-io/milvus/releases/tag/v2.4.0-rc.1
Embedding
以下用法来自上述官方文档
备注: 实质上这里是对 FlagEmbedding 的简单封装, 因此算不上是 Milvus 的特性
sparse vector
关于 sparse vector search: https://milvus.io/docs/sparse_vector.md
备注: 关于 sparse vector 所使用的距离函数目前只支持内积 (IP), 不支持 L2 及 COSINE.
hybrid_search
备注: 所谓的 hybrid_search, 实质上只是根据多个 vector 类型的字段进行独立召回, 然后再对多个召回结果 rerank, 而目前 milvus 支持加权与 RRF 的 rerank 方法. 因此实质上 hybrid_search 也算不上是新特性.
fuzzy match: prefixes, infixes, suffixes search
似乎之前版本的 Milvus 只支持前缀索引 (text like 'the%'), 2.4 之后支持前缀, 中缀, 后缀索引. 以下代码参考自 https://github.com/milvus-io/pymilvus/blob/2.4/examples/fuzzy_match.py
Grouping Search
也就是对 multi-vector retriever 的支持 (特别地: 可用于 ParentDocumentRetriever), 代码参考 https://github.com/milvus-io/pymilvus/blob/2.4/examples/example_group_by.py
备注: 这个特性仍然无法用作支持 BGE-M3 的 colbert 向量搜索
MilvusClient
在 python client 方面, 将 MilvusClient 这种用法做了进一步完善, 估计后续版本的主流用法应该会是用 MilvusClient.
Weaviate
Weaviate 是一个向量数据库, 支持混合检索. 根据下面的文章可以看出, 其实际上只是分别检索, 然后 rerank 实现的. 注意字面检索使用的是 BM25/BM25F, 而 rerank 可以选择加权重或者是 RRF. 官方比较推荐用加权重的方式 rerank.
这里简述下运作逻辑: 假设最终需要检索 k 个文本, 那么分别用字面检索和向量检索得到 k 个文本 (目前似乎不能设置为多于 k 个, 或者其内部有可能设置更高, 但似乎不对用户暴露), 当使用加权 rerank 时, 首先分别将字面检索/向量检索的分数按线性变换到 0-1 之间, 即最相似的文本的相似度为 1, 第 k 个文本的相似度为 0. 然后再加权重 (权重可以设置), 最后排序得到最终的 k 个文本.
关于 hybrid search 的具体运作逻辑: https://weaviate.io/blog/hybrid-search-fusion-algorithms
Redis
Docker 运行
发布/订阅模式
发布者
订阅者
运行方式: 打开两个终端, 一个运行 python redis_publisher.py, 另一个运行 python redis_subscriber.py
Redis 的发布/订阅一般不会存储消息, 也就是说假设先启动 redis_publisher.py 并且先发送了一条消息, 然后再启动 redis_subscriber.py, 那么这一条消息将不会被收到. 上面的例子是异步的写法.
Last updated
Was this helpful?