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 是可选的, 实际的数据库存储里并不包含 useraddresses 这两列, 它与 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) 中的 database

  • collection: 对应于 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 所使用的距离函数目前只支持内积 (IP), 不支持 L2 及 COSINE.

备注: 所谓的 hybrid_search, 实质上只是根据多个 vector 类型的字段进行独立召回, 然后再对多个召回结果 rerank, 而目前 milvus 支持加权与 RRF 的 rerank 方法. 因此实质上 hybrid_search 也算不上是新特性.

似乎之前版本的 Milvus 只支持前缀索引 (text like 'the%'), 2.4 之后支持前缀, 中缀, 后缀索引. 以下代码参考自 https://github.com/milvus-io/pymilvus/blob/2.4/examples/fuzzy_match.py

也就是对 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 个文本.

Redis

Docker 运行

发布/订阅模式

发布者

订阅者

运行方式: 打开两个终端, 一个运行 python redis_publisher.py, 另一个运行 python redis_subscriber.py

Redis 的发布/订阅一般不会存储消息, 也就是说假设先启动 redis_publisher.py 并且先发送了一条消息, 然后再启动 redis_subscriber.py, 那么这一条消息将不会被收到. 上面的例子是异步的写法.

Last updated

Was this helpful?