# migrations

dir: embeddings_queue
filename: 00001-embeddings.sqlite.sql
hash: d3755dfd232be8e8301f4d7fcfb3a486
sql:
CREATE TABLE embeddings_queue (
    seq_id INTEGER PRIMARY KEY,
    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    operation INTEGER NOT NULL,
    topic TEXT NOT NULL,
    id TEXT NOT NULL,
    vector BLOB,
    encoding TEXT,
    metadata TEXT
);


dir: sysdb
filename: 00001-collections.sqlite.sql
hash: 38352d725ad1c16074fac420b22b4633
sql:
CREATE TABLE collections (
    id TEXT PRIMARY KEY,
    name TEXT NOT NULL,
    topic TEXT NOT NULL,
    UNIQUE (name)
);

CREATE TABLE collection_metadata (
    collection_id TEXT REFERENCES collections(id) ON DELETE CASCADE,
    key TEXT NOT NULL,
    str_value TEXT,
    int_value INTEGER,
    float_value REAL,
    PRIMARY KEY (collection_id, key)
);


dir: sysdb
filename: 00002-segments.sqlite.sql
hash: 2913cb6a503055a95f625448037e8912
sql:
CREATE TABLE segments (
    id TEXT PRIMARY KEY,
    type TEXT NOT NULL,
    scope TEXT NOT NULL,
    topic TEXT,
    collection TEXT REFERENCES collection(id)
);

CREATE TABLE segment_metadata (
    segment_id TEXT  REFERENCES segments(id) ON DELETE CASCADE,
    key TEXT NOT NULL,
    str_value TEXT,
    int_value INTEGER,
    float_value REAL,
    PRIMARY KEY (segment_id, key)
);


dir: sysdb
filename: 00004-tenants-databases.sqlite.sql
hash: 048867ce8fcdefe4023c7110e4433591
sql:
CREATE TABLE IF NOT EXISTS tenants (
    id TEXT PRIMARY KEY,
    UNIQUE (id)
);

CREATE TABLE IF NOT EXISTS databases (
    id TEXT PRIMARY KEY, -- unique globally
    name TEXT NOT NULL, -- unique per tenant
    tenant_id TEXT NOT NULL REFERENCES tenants(id) ON DELETE CASCADE,
    UNIQUE (tenant_id, name) -- Ensure that a tenant has only one database with a given name
);

CREATE TABLE IF NOT EXISTS collections_tmp (
    id TEXT PRIMARY KEY, -- unique globally
    name TEXT NOT NULL, -- unique per database
    topic TEXT NOT NULL,
    dimension INTEGER,
    database_id TEXT NOT NULL REFERENCES databases(id) ON DELETE CASCADE,
    UNIQUE (name, database_id)
);

-- Create default tenant and database
INSERT OR REPLACE INTO tenants (id) VALUES ('default_tenant'); -- The default tenant id is 'default_tenant' others are UUIDs
INSERT OR REPLACE INTO databases (id, name, tenant_id) VALUES ('00000000-0000-0000-0000-000000000000', 'default_database', 'default_tenant');

INSERT OR REPLACE INTO collections_tmp (id, name, topic, dimension, database_id)
    SELECT id, name, topic, dimension, '00000000-0000-0000-0000-000000000000' FROM collections;
DROP TABLE collections;
ALTER TABLE collections_tmp RENAME TO collections;


dir: sysdb
filename: 00005-remove-topic.sqlite.sql
hash: b1367c826b8fba5f96f27befdc1d42d2
sql:
-- Remove the topic column from the Collections and Segments tables

ALTER TABLE collections DROP COLUMN topic;
ALTER TABLE segments DROP COLUMN topic;


dir: sysdb
filename: 00006-collection-segment-metadata.sqlite.sql
hash: 4eea7468935bf25d4604a0fed2366116
sql:
-- SQLite does not support adding check with alter table, as a result, adding a check
-- involve creating a new table and copying the data over. It is over kill with adding
-- a boolean type column. The application write to the table needs to ensure the data
-- integrity.
ALTER TABLE collection_metadata ADD COLUMN bool_value INTEGER;
ALTER TABLE segment_metadata ADD COLUMN bool_value INTEGER;


dir: sysdb
filename: 00007-collection-config.sqlite.sql
hash: 1c7e63bba346a42a18b6ab7f1c989bed
sql:
-- Stores collection configuration dictionaries.
ALTER TABLE collections ADD COLUMN config_json_str TEXT;


dir: sysdb
filename: 00008-maintenance-log.sqlite.sql
hash: 0a0e7e93111a01789addf64961c6127c
sql:
-- Records when database maintenance operations are performed.
-- At time of creation, this table is only used to record vacuum operations.
CREATE TABLE maintenance_log (
  id INT PRIMARY KEY,
  timestamp INT NOT NULL,
  operation TEXT NOT NULL
);


dir: sysdb
filename: 00009-segment-collection-not-null.sqlite.sql
hash: 054355aef9e63702bf54ea29e61563f1
sql:
-- This makes segments.collection non-nullable.
CREATE TABLE segments_temp (
    id TEXT PRIMARY KEY,
    type TEXT NOT NULL,
    scope TEXT NOT NULL,
    collection TEXT REFERENCES collection(id) NOT NULL
);

INSERT INTO segments_temp SELECT * FROM segments;
DROP TABLE segments;
ALTER TABLE segments_temp RENAME TO segments;


dir: metadb
filename: 00001-embedding-metadata.sqlite.sql
hash: 2b4cf52c4bb2676e21d6860a4409f856
sql:
CREATE TABLE embeddings (
    id INTEGER PRIMARY KEY,
    segment_id TEXT NOT NULL,
    embedding_id TEXT NOT NULL,
    seq_id BLOB NOT NULL,
    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    UNIQUE (segment_id, embedding_id)
);

CREATE TABLE embedding_metadata (
    id INTEGER REFERENCES embeddings(id),
    key TEXT NOT NULL,
    string_value TEXT,
    int_value INTEGER,
    float_value REAL,
    PRIMARY KEY (id, key)
);

CREATE TABLE max_seq_id (
    segment_id TEXT PRIMARY KEY,
    seq_id BLOB NOT NULL
);

CREATE VIRTUAL TABLE embedding_fulltext USING fts5(id, string_value);


dir: metadb
filename: 00002-embedding-metadata.sqlite.sql
hash: 12a570f7121b3a8ce750a2a7c36da20f
sql:
-- SQLite does not support adding check with alter table, as a result, adding a check
-- involve creating a new table and copying the data over. It is over kill with adding
-- a boolean type column. The application write to the table needs to ensure the data
-- integrity.
ALTER TABLE embedding_metadata ADD COLUMN bool_value INTEGER


dir: metadb
filename: 00003-full-text-tokenize.sqlite.sql
hash: f97ad6334aeaa8f419f01110b648b97a
sql:
CREATE VIRTUAL TABLE embedding_fulltext_search USING fts5(string_value, tokenize='trigram');
INSERT INTO embedding_fulltext_search (rowid, string_value) SELECT rowid, string_value FROM embedding_metadata;
DROP TABLE embedding_fulltext;


dir: metadb
filename: 00004-metadata-indices.sqlite.sql
hash: fb36603a45ee2cd0254cef3ef86585e8
sql:
CREATE INDEX IF NOT EXISTS embedding_metadata_int_value ON embedding_metadata (key, int_value) WHERE int_value IS NOT NULL;
CREATE INDEX IF NOT EXISTS embedding_metadata_float_value ON embedding_metadata (key, float_value) WHERE float_value IS NOT NULL;
CREATE INDEX IF NOT EXISTS embedding_metadata_string_value ON embedding_metadata (key, string_value) WHERE string_value IS NOT NULL;


# collections

id: 4907d9d3-1c7b-4e57-ae82-8b923d48e29a
name: langchain
database_id: 00000000-0000-0000-0000-000000000000
config_json_str:
{"hnsw_configuration": {"space": "l2", "ef_construction": 100, "ef_search": 100, "num_threads": 22, "M": 16, "resize_factor": 1.2, "batch_size": 100, "sync_threshold": 1000, "_type": "HNSWConfigurationInternal"}, "_type": "CollectionConfigurationInternal"}


# embedding_metadata

key: chroma:document
string_value:
### 文档 1
标题：自定义TCP协议的帧结构设计
内容：自定义TCP协议推荐采用固定帧头、长度字段、命令字、数据区和校验码的结构。长度字段有助于分包与粘包处理，命令字支持多指令扩展，校验码保障数据完整性。

### 文档 2
标题：7B和14B模型的显存需求
内容：7B参数量模型量化为4-bit时，通常需要6-8GB显存。14B模型即使量化，也建议使用24GB以上显存的GPU，如RTX 4090或A100。

### 文档 3
标题：Wireshark过滤RTMP流量的方法
内容：可以使用Wireshark的显示过滤器“tcp.port == 1935”来捕获RTMP流量。为提升分析效率，可结合“frame.len > 100”过滤大数据包。

### 文档 4
标题：向量数据库中的余弦相似度计算
内容：向量数据库通过计算查询向量与文档向量的余弦相似度来检索最相关内容，常用库如FAISS、Chroma和Milvus都支持该方法。

### 文档 5
标题：如何在LangChain中构建RAG系统
内容：LangChain RAG系统通常由文本分块、向量化、向量库检索和大模型生成组成。常用Embedding模型为sentence-transformers或BGE系列。

### 文档 6
标题：抓包分析中常见的丢包现象
内容：网络丢包通常表现在ACK重传、TCP重传次数增加和RTT延迟波动。抓包时可用Wireshark统计TCP流分析查看丢包比例。

### 文档 7
标题：LLaMA模型本地微调推荐流程
内容：本地微调LLaMA模型可使用LoRA方法，搭配QLoRA量化节省显存。推荐使用transformers+peft+bitsandbytes组合工具链。

### 文档 8
标题：EtherCAT主站与从站通信机制
内容：EtherCAT主站通过周期性帧发送控制命令，从站设备读取帧中的对应数据区进行响应，实现高速实时控制。

### 文档 9
标题：WebSocket多客户端管理策略
内容：可通过中心调度Channel管理WebSocket客户端，采用心跳机制维护在线状态，并使用消息路由表实现指令分发。


key: chroma:document
string_value:
### 文档 8
标题：EtherCAT主站与从站通信机制
内容：EtherCAT主站通过周期性帧发送控制命令，从站设备读取帧中的对应数据区进行响应，实现高速实时控制。

### 文档 9
标题：WebSocket多客户端管理策略
内容：可通过中心调度Channel管理WebSocket客户端，采用心跳机制维护在线状态，并使用消息路由表实现指令分发。

### 文档 10
标题：RTMP流媒体的Chunk机制
内容：RTMP协议将数据划分为Chunk进行分片传输，每个Chunk包含基本头、消息头和数据体部分，有助于减少延迟和控制带宽。

### 文档 11
标题：本地部署Qwen2.5模型的注意事项
内容：Qwen2.5模型上下文长度可达32k，推荐使用8GB以上显存显卡，并使用4-bit量化以降低显存占用。

### 文档 12
标题：如何进行抓包数据的自动化分析
内容：可使用TShark结合Python脚本自动提取流量数据，如帧大小、时间戳、协议字段，实现丢包检测和延迟计算。

### 文档 13
标题：RAG系统中的Chunk大小设置技巧
内容：推荐将文档chunk大小设置为500-1000字符，避免上下文缺失，同时提升检索相关性和大模型生成质量。

### 文档 14
标题：本地知识库问答系统的搭建流程
内容：先收集txt或md文档，通过Embedding编码为向量，存入向量库，最后接入大模型进行检索增强问答（RAG）。

### 文档 15
标题：SOEM库在EtherCAT通信中的应用
内容：SOEM是轻量级开源EtherCAT主站库，支持C语言接口，适用于Windows、Linux平台的实时工业控制应用。

### 文档 16
标题：Qwen-VL多模态模型的图文输入结构
内容：Qwen-VL模型支持同时输入图像和文本，图像先经过视觉编码模块转为向量，再与文本Token序列拼接输入模型。

### 文档 17
标题：如何使用FAISS构建本地向量检索库
内容：使用FAISS时，需先将文档编码为向量，构建索引如IndexFlatL2或IndexIVFFlat，然后可快速检索相似内容。

### 文档 18
标题：TCP大数据传输中的分片重组策略
内容：在TCP大数据传输场景中，推荐应用层自行进行分片标记和重组，避免粘包和分包问题，提升协议健壮性。


key: chroma:document
string_value:
### 文档 17
标题：如何使用FAISS构建本地向量检索库
内容：使用FAISS时，需先将文档编码为向量，构建索引如IndexFlatL2或IndexIVFFlat，然后可快速检索相似内容。

### 文档 18
标题：TCP大数据传输中的分片重组策略
内容：在TCP大数据传输场景中，推荐应用层自行进行分片标记和重组，避免粘包和分包问题，提升协议健壮性。

### 文档 19
标题：多轮对话系统中的上下文记忆机制
内容：多轮对话可通过窗口滑动机制维护上下文历史，或使用RAG结合向量检索对历史内容进行动态提取和复用。

### 文档 20
标题：本地模型中的量化技术简介
内容：常见量化技术包括4-bit QLoRA、8-bit GPTQ和NF4等，用于降低模型显存占用，便于在消费级显卡上运行大模型。

### 文档 21
标题：如何检测RTMP流中的卡顿现象
内容：可统计RTMP包间隔时间和丢包率，若连续多帧时间超过正常范围或发生重传，说明存在卡顿风险。


