使用说明
SQLite+语义搜索——人工智能记忆系统
内置语义搜索和本地嵌入向量生成的sqlite MCP服务器
完整的数据库+矢量搜索+零API成本。 一切都在本地运行。一切都是私人的。一切都很快。
好处
1.🧠 内置语义搜索
不仅仅是关键字匹配——实际理解。 按意思查找文档,而不是按精确的单词。“向我展示愤怒的客户电子邮件”可以找到他们,即使他们从不说“愤怒”。这是为ChatGPT的内存提供动力的技术,现在正在你的机器上运行。
2.💰 零成本,无限规模
不收取API费用。永远。 使用包含的Qwen模型在本地生成嵌入。存储数百万矢量。搜索数十亿次。你唯一的成本就是电费。与OpenAI嵌入的每1K代币0.0001美元相比,这个工具在第一个一百万次操作后就能收回成本。
3.🔒 100%私人,100%强大
你的数据永远不会离开你的机器。 全SQL数据库+语义搜索+自动嵌入,全部在本地运行。没有云服务。无数据泄露。没有合规问题。纯粹的私人权力。
为什么这个工具改变了一切
大多数AI工具都不记得。 他们会处理你的请求,然后忘记。每一次对话都是从零开始的。
矢量数据库需要花钱。 松果、Weaviate、Qdrant——都很好,都很贵。每月最低70美元,生产工作负载可扩展到数千美元。
语义搜索需要API。 OpenAI嵌入、Cohere、Anthropic——每次使用都要收费。制造一些流行的东西,看着成本爆炸。
这个工具打破了所有这些限制。
完整的SQLite数据库。矢量相似性搜索。自动嵌入生成。都是当地人。全部免费。全部私人。所有这些都集成到一个优雅的工具中。
真实世界的故事:支持票危机
问题:
一家小型SaaS公司被支持票淹没。每天500+。客户反复问同样的问题。支持团队无法跟上。
他们问:“我们能用人工智能自动响应吗?”。
标准解决方案:矢量数据库(每月200美元)+OpenAI嵌入(API成本每月500美元)+自定义集成(开发周)。
使用此工具:
# One-time setup: Import existing tickets
execute_sql("""
CREATE TABLE tickets(
id INTEGER PRIMARY KEY,
question TEXT,
answer TEXT,
embedding BLOB CHECK(vec_length(embedding) == 1024)
)
""")
execute_sql("""
INSERT INTO tickets(question, answer, embedding)
SELECT question, answer, vec_f32(generate_embedding(question))
FROM imported_tickets
""")
# For each new ticket, find similar solved tickets
execute_sql("""
SELECT question, answer,
vec_distance_cosine(embedding, vec_f32(:new_ticket)) as similarity
FROM tickets
WHERE similarity < 0.3
ORDER BY similarity LIMIT 3
""", bindings={"new_ticket": {"_embedding_text": user_question}})
结果: 70%的票自动解决。支持团队专注于复杂问题。每月零成本。完全隐私。在一个下午部署。
踢球者: 他们现在使用相同的系统进行产品推荐、内容搜索和重复检测。同样的工具,零额外成本。
完整的功能集
核心数据库操作
SQLite的完整功能:
- 完整的SQL支持(SELECT、INSERT、UPDATE、DELETE、CREATE、ALTER等)
- 事务、触发器、视图、索引
- 外键、约束、CHECK子句
- 通用表表达式(CTE)、窗口函数
- JSON函数,日期/时间操作
- PRAGMA性能调优设置
智能路径处理:
:memory:--共享临时数据库(持续到服务器重新启动)@user_data/db.sqlite--主存储(Windows域上的同步)@user_local/db.sqlite--特定于机器(从不同步)@user_cache/db.sqlite--临时(系统可能会清除)@user_config/db.sqlite--设置/配置@site_data/db.sqlite--多用户共享(需要提升)@temp/db.sqlite--系统温度(重新启动时清除)~/databases/app.db--主目录扩展%APPDATA%\app.db--Windows环境变量/absolute/path/app.db--全路径在任何地方都有效
向量相似性搜索
创建启用矢量的表:
CREATE TABLE documents(
id INTEGER PRIMARY KEY,
title TEXT,
content TEXT,
embedding BLOB CHECK(
typeof(embedding) == 'blob'
AND vec_length(embedding) == 1024 -- Qwen embeddings are 1024-dimensional
)
);
自动嵌入生成:
方法1:SQL函数(推荐)
-- Insert with automatic embedding
INSERT INTO documents(title, content, embedding)
VALUES (
'User Guide',
'How to use the application...',
vec_f32(generate_embedding('How to use the application...'))
);
-- Bulk update missing embeddings
UPDATE documents
SET embedding = vec_f32(generate_embedding(content))
WHERE embedding IS NULL;
方法2:绑定引用(当文本在数据库中时)
execute_sql(
"INSERT INTO docs(text, embedding) VALUES (:text, vec_f32(:emb))",
bindings={
"text": "Document content here",
"emb": {"_embedding_col": "text"} # Embeds the :text value
}
)
方法3:直接文本(当文本未存储时)
execute_sql(
"INSERT INTO metadata(category, embedding) VALUES (:cat, vec_f32(:emb))",
bindings={
"cat": "technical",
"emb": {"_embedding_text": "Technical documentation category"}
}
)
相似性搜索:
-- Find similar documents
SELECT
title,
content,
vec_distance_cosine(embedding, vec_f32(:query)) as similarity
FROM documents
WHERE vec_distance_cosine(embedding, vec_f32(:query)) < 0.5
ORDER BY similarity
LIMIT 10;
距离函数:
vec_distance_cosine(v1, v2)→ 0-1 (较低=更相似,最适合文本)vec_distance_L2(v1, v2)→ 0-∞ (欧几里德距离)vec_distance_L1(v1, v2)→ 0-∞ (曼哈顿距离)
身份验证集成
内置用户上下文:
-- Automatically includes authenticated username
SELECT * FROM user_documents
WHERE owner = :authenticated_user;
-- Audit trail with automatic user tracking
INSERT INTO actions (user, action, timestamp)
VALUES (:authenticated_user, :action, datetime('now'));
为什么这很重要: 无需到处传递用户名。该工具知道是谁在调用它,并自动提供上下文。
点命令(便利功能)
无需编写SQL即可快速检查数据库:
.databases--列出所有包含大小和日期的.db文件.tables--显示当前数据库中的所有表.schema [table]--显示表架构.indexes [table]--显示索引.fullschema--完整的数据库架构.dbinfo--数据库统计.status--当前设置.pragma--所有PRAGMA值.foreign_keys--外键状态
注: 标准SQL更适合用于生产环境。点命令用于快速探索。
PRAGMA支持
完全控制SQLite行为:
PRAGMA foreign_keys = ON; -- Enable referential integrity
PRAGMA journal_mode = WAL; -- Write-Ahead Logging for concurrency
PRAGMA synchronous = NORMAL; -- Balance safety and speed
PRAGMA cache_size = -2000; -- 2MB cache
PRAGMA page_size; -- Query page size
PRAGMA encoding; -- Database encoding
高级用例
语义重复检测
-- Find potential duplicates
WITH candidates AS (
SELECT
d1.id as id1,
d2.id as id2,
d1.title as title1,
d2.title as title2,
vec_distance_cosine(d1.embedding, d2.embedding) as similarity
FROM documents d1
JOIN documents d2 ON d1.id < d2.id
WHERE similarity < 0.1 -- Very similar
)
SELECT * FROM candidates
ORDER BY similarity;
多字段语义搜索
-- Search across title and content with different weights
WITH query_emb AS (
SELECT vec_f32(generate_embedding(:query)) as emb
)
SELECT
title,
content,
(
0.7 * vec_distance_cosine(title_embedding, query_emb.emb) +
0.3 * vec_distance_cosine(content_embedding, query_emb.emb)
) as weighted_similarity
FROM documents, query_emb
WHERE weighted_similarity < 0.5
ORDER BY weighted_similarity
LIMIT 20;
层次相似性(查找相似之处)
-- Find documents similar to documents similar to a query
WITH first_pass AS (
SELECT id, embedding
FROM documents
WHERE vec_distance_cosine(embedding, vec_f32(:query)) < 0.3
LIMIT 10
)
SELECT DISTINCT d.id, d.title
FROM documents d
JOIN first_pass fp
ON vec_distance_cosine(d.embedding, fp.embedding) < 0.4
WHERE d.id NOT IN (SELECT id FROM first_pass)
ORDER BY vec_distance_cosine(d.embedding, vec_f32(:query))
LIMIT 20;
时间加权语义搜索
-- Prioritize recent + relevant
SELECT
title,
created_at,
vec_distance_cosine(embedding, vec_f32(:query)) as relevance,
(julianday('now') - julianday(created_at)) as age_days,
(
0.7 * vec_distance_cosine(embedding, vec_f32(:query)) +
0.3 * (1.0 / (1.0 + (julianday('now') - julianday(created_at)) / 365.0))
) as score
FROM documents
WHERE relevance < 0.5
ORDER BY score
LIMIT 10;
使用示例
基本SQL查询
{
"input": {
"sql": "SELECT * FROM users WHERE age > :min_age",
"database": "myapp.db",
"bindings": {"min_age": 18},
"tool_unlock_token": "YOUR_TOKEN"
}
}
用户特定查询
{
"input": {
"sql": "SELECT * FROM documents WHERE owner = :authenticated_user",
"database": "@user_data/docs.db",
"tool_unlock_token": "YOUR_TOKEN"
}
}
语义搜索
{
"input": {
"sql": "SELECT title, vec_distance_cosine(embedding, vec_f32(:query)) as sim FROM docs WHERE sim < 0.5 ORDER BY sim LIMIT 5",
"database": "knowledge.db",
"bindings": {
"query": {"_embedding_text": "How do I reset my password?"}
},
"tool_unlock_token": "YOUR_TOKEN"
}
}
批量嵌入生成
{
"input": {
"sql": "UPDATE articles SET embedding = vec_f32(generate_embedding(content)) WHERE embedding IS NULL",
"database": "@user_data/articles.db",
"tool_unlock_token": "YOUR_TOKEN"
}
}
返回格式
{
"operation_was_successful": true,
"error_message_if_operation_failed": null,
"rows_modified_by_operation": 5,
"column_names_in_result_set": ["id", "title", "similarity"],
"data_rows_from_result_set": [
{"id": 1, "title": "Getting Started", "similarity": 0.12},
{"id": 5, "title": "Quick Start Guide", "similarity": 0.18},
...
]
}
关键字段:
operation_was_successful--布尔成功指示符error_message_if_operation_failed--成功时为空,失败时为错误字符串rows_modified_by_operation--对于INSERT/UPDATE/DELETE,SELECT为nullcolumn_names_in_result_set--列名数组,非SELECT为nulldata_rows_from_result_set--行对象数组,非SELECT为null
技术架构
内存数据库(:memory:)
共享单例模式:
- 所有操作共享单个连接
- 带锁紧机构的螺纹安全
- WAL(预写日志)模式已启用
- 持续整个服务器生命周期
- 在所有AI实例中共享
为什么这很重要: 多个AI代理可以使用相同的内存数据库进行协作。非常适合会话状态、临时计算或代理间通信。
文件数据库
每个操作连接:
- 每个操作的新连接
- 每个数据库的自动连接缓存
- 自动创建父目录
- 操作前验证写入权限
- 支持所有路径扩展类型
螺纹安全:
- SQLite连接是线程本地的
- 一次只能有一个编写器(SQLite限制)
- 读卡器可以与WAL模式同时运行
嵌入式系统
Qwen3-Embedded-0.6B模型:
- 1024维向量
- 首次使用时自动下载(约250MB)
- 完全在本地运行(没有API调用)
- 自动缓存相同的文本
- 注册为SQLite用户定义函数(UDF)
演出
- 现代CPU上每次嵌入约50ms
- GPU上每次嵌入约5ms(如果可用)
- 批量操作已优化
- 缓存点击是即时的
行处理
字典式访问:
# Access by column name
row['title']
row['created_at']
# Or by index
row[0]
row[1]
# Iterate over columns
for key in row.keys():
print(f"{key}: {row[key]}")
用途 sqlite3.Row 工厂提供最大的灵活性。
性能优化
索引向量列
-- Create index on vector column for faster similarity search
CREATE INDEX idx_doc_embedding ON documents(embedding);
-- Partial index for active documents only
CREATE INDEX idx_active_embedding
ON documents(embedding)
WHERE status = 'active';
查询优化
-- Use CTE to avoid recalculating query embedding
WITH query_vec AS (
SELECT vec_f32(generate_embedding(:query)) as emb
)
SELECT title, vec_distance_cosine(embedding, query_vec.emb) as sim
FROM documents, query_vec
WHERE sim < 0.5
ORDER BY sim;
批量操作
-- Batch insert with single embedding generation per unique text
INSERT INTO documents(title, content, embedding)
SELECT
title,
content,
vec_f32(generate_embedding(content))
FROM staging_documents;
并发的WAL模式
-- Enable Write-Ahead Logging
PRAGMA journal_mode = WAL;
-- Allows concurrent reads during writes
-- Significantly improves multi-user performance
可排序二进制编码函数(BES19)
问题
SQLite将数字存储为TEXT或本机INTEGER/REAL类型。但如果你需要:
- 将数字存储在BLOB中以实现紧凑的二进制存储?
- 让这些BLOB正确排序
ORDER BY? - 获取按时间顺序排序的微秒精度时间戳?
标准二进制编码(小字节序甚至大字节序)排序不正确:
- 带符号整数:-1将在+1之后排序(错误!)
- 浮点数:负数相对于正数排序不正确
解决方案:BES19功能
19个内置函数,使用将数字编码为BLOB 可排序大端序 格式。当你 ORDER BY 这些BLOB,它们使用原始字节比较按正确的数字顺序排序。
运作原理
对于无符号整数: 简单的大端编码(最高有效字节优先)。
对于有符号整数: 符号位翻转的大端序。这将转换排序顺序:
- 原始:0x8000…(最负)排序在0x7FFF之后。..(最积极)
- 已转换:0x0000…(最负)在0xFFFF之前排序。..(最积极)
对于IEEE 754浮点数: 巧妙的转变:
- 正浮点数:翻转符号位(0→1),使其按负数排序
- 负浮点数:翻转所有位,这样更多的负值会排在更少的负值之前
对于时间戳: 以带符号的64位整数表示的纪元微秒,给出:
- 范围:Unix时代前后约292000年
- 精度:1微秒
- 可排序性:保证按时间顺序排序
函数参考
编码函数(数字→ 可排序BLOB)
| 功能 | 输入 | 输出 | 说明 |
|---|---|---|---|
to_u16bes(n) |
0到65535 | 2字节BLOB | 无符号16位 |
to_u32bes(n) |
0到4294967295 | 4字节BLOB | 无符号32位 |
to_u64bes(n) |
0到184467440737009551615 | 8字节BLOB | 无符号64位 |
to_i16bes(n) |
-32768到32767 | 2字节BLOB | 16位签名 |
to_i32bes(n) |
-2147483648到2147483647 | 4字节BLOB | 32位签名 |
to_i64bes(n) |
完整的64位签名范围 | 8字节BLOB | 64位签名 |
to_f16bes(n) |
IEEE 754半精度 | 2字节BLOB | 16位浮点 |
to_f32bes(n) |
IEEE 754单精度 | 4字节BLOB | 32位浮点 |
to_f64bes(n) |
IEEE 754双精度 | 8字节BLOB | 64位浮点 |
to_t64bes() |
(无参数) | 8字节BLOB | 当前历元微秒 |
解码函数(BLOB→ 编号)
| 功能 | 输入 | 输出 | 说明 |
|---|---|---|---|
from_u16bes(b) |
2字节BLOB | 整数 | 无符号16位 |
from_u32bes(b) |
4字节BLOB | 整数 | 无符号32位 |
from_u64bes(b) |
8字节BLOB | 整数 | 无符号64位 |
from_i16bes(b) |
2字节BLOB | 整数 | 16位签名 |
from_i32bes(b) |
4字节BLOB | 整数 | 签名32位 |
from_i64bes(b) |
8字节BLOB | 整数 | 带符号64位 |
from_f16bes(b) |
2字节BLOB | 实数 | 16位浮点数 |
from_f32bes(b) |
4字节BLOB | 实数 | 32位浮点数 |
from_f64bes(b) |
8字节BLOB | 实数 | 64位浮点数 |
使用示例
基本往返
-- Encode and decode
SELECT from_i64bes(to_i64bes(-12345)); -- Returns: -12345
SELECT from_f64bes(to_f64bes(3.14159)); -- Returns: 3.14159
SELECT from_i64bes(to_t64bes()); -- Returns: current epoch microseconds
可排序时间戳
-- Create table with sortable timestamp
CREATE TABLE events (
id INTEGER PRIMARY KEY,
created_at BLOB NOT NULL, -- Stores to_t64bes()
event_type TEXT,
data TEXT
);
-- Insert with automatic timestamp
INSERT INTO events (created_at, event_type, data)
VALUES (to_t64bes(), 'user_login', '{"user_id": 123}');
-- Query in chronological order (BLOB comparison = time order!)
SELECT
id,
from_i64bes(created_at) as epoch_us,
datetime(from_i64bes(created_at) / 1000000, 'unixepoch') as human_time,
event_type
FROM events
ORDER BY created_at; -- Sorts chronologically!
-- Range query (last hour)
SELECT * FROM events
WHERE created_at > to_i64bes((strftime('%s', 'now') - 3600) * 1000000);
紧凑型数字存储
-- Store sensor readings compactly
CREATE TABLE sensor_data (
sensor_id INTEGER,
timestamp BLOB, -- 8 bytes (to_t64bes)
temperature BLOB, -- 4 bytes (to_f32bes)
humidity BLOB, -- 2 bytes (to_u16bes, 0-65535 = 0.00-655.35%)
PRIMARY KEY (sensor_id, timestamp)
);
-- Insert reading
INSERT INTO sensor_data VALUES (
1,
to_t64bes(),
to_f32bes(23.5),
to_u16bes(6520) -- 65.20%
);
-- Query with decoded values
SELECT
sensor_id,
from_i64bes(timestamp) as ts,
from_f32bes(temperature) as temp_c,
from_u16bes(humidity) / 100.0 as humidity_pct
FROM sensor_data
WHERE sensor_id = 1
ORDER BY timestamp DESC
LIMIT 100;
带符号整数排序证明
-- Demonstrate correct sorting of signed integers
CREATE TABLE signed_test (val BLOB);
INSERT INTO signed_test VALUES
(to_i64bes(-1000)),
(to_i64bes(-1)),
(to_i64bes(0)),
(to_i64bes(1)),
(to_i64bes(1000));
-- ORDER BY BLOB gives correct numerical order!
SELECT from_i64bes(val) as decoded FROM signed_test ORDER BY val;
-- Returns: -1000, -1, 0, 1, 1000 (correct!)
浮点排序证明
-- Demonstrate correct sorting of floats (including negatives)
CREATE TABLE float_test (val BLOB);
INSERT INTO float_test VALUES
(to_f64bes(-1000.5)),
(to_f64bes(-0.001)),
(to_f64bes(0.0)),
(to_f64bes(0.001)),
(to_f64bes(1000.5));
-- ORDER BY BLOB gives correct numerical order!
SELECT from_f64bes(val) as decoded FROM float_test ORDER BY val;
-- Returns: -1000.5, -0.001, 0.0, 0.001, 1000.5 (correct!)
为什么要使用BES19?
-
压缩存储:一个BLOB列
to_i32bes()与可变长度TEXT相比,每行使用4个字节。 -
无需解码即可排序:
ORDER BY blob_column无需调用解码函数即可正常工作。 -
索引友好:在BLOB列上创建索引;他们会正确排序。
-
微秒时间戳:
to_t64bes()为您提供SQLite的亚毫秒精度datetime()无法匹配。 -
交叉平台的:在Windows、Linux和macOS上工作相同。
-
无需扩展:内置于SQLite二进制文件中——始终可用。
局限性
- NaN处理:不能保证正确排序(但常规数字可以很好地工作)
- 正/负零:可能无法区分(在实践中很少重要)
- 溢出:传递超出类型范围的值会产生未定义的结果
技术细节
编码是 独立于端点--C代码以正确的顺序显式构造字节,而不管主机CPU的本机字节顺序如何。这确保了数据库在不同架构之间的可移植性。
常见模式
全文搜索+语义搜索
-- Combine keyword matching with semantic similarity
SELECT
d.title,
d.content,
vec_distance_cosine(d.embedding, vec_f32(:query)) as semantic_sim,
(d.title LIKE '%' || :keyword || '%' OR d.content LIKE '%' || :keyword || '%') as keyword_match
FROM documents d
WHERE semantic_sim < 0.5 OR keyword_match = 1
ORDER BY
keyword_match DESC, -- Exact matches first
semantic_sim ASC -- Then by semantic similarity
LIMIT 20;
分面语义搜索
-- Search within category with semantic ranking
SELECT
title,
category,
vec_distance_cosine(embedding, vec_f32(:query)) as relevance
FROM documents
WHERE
category = :category
AND relevance < 0.5
ORDER BY relevance
LIMIT 10;
语义聚类
-- Find clusters of similar documents
WITH similarities AS (
SELECT
d1.id as id1,
d2.id as id2,
vec_distance_cosine(d1.embedding, d2.embedding) as distance
FROM documents d1
CROSS JOIN documents d2
WHERE d1.id < d2.id
AND distance < 0.2
)
SELECT id1, id2, distance
FROM similarities
ORDER BY distance;
错误处理
常见错误
“CHECK约束失败”
Cause: Missing vec_f32() wrapper in SQL
Fix: Always use vec_f32() for vector parameters
“找不到引用的列”
Cause: Binding name doesn't match SQL parameter
Fix: Ensure :param_name matches bindings key
“生成嵌入失败”
Cause: Model loading issue (first use) or memory pressure
Fix: Usually auto-resolves on retry. Check available RAM.
“数据库已锁定”
Cause: Concurrent write attempts
Fix: Use WAL mode or implement retry logic
最佳实践
- 始终使用参数化查询 --从不将用户输入连接到SQL中
- 对所有向量操作使用vec_f32() --sqlite-vec扩展需要
- 为文件数据库启用WAL模式 --更好的并发性
- 索引向量列 --更快的相似性搜索
- 批量嵌入生成 --比一次一个更有效率
- 用途:内存:用于临时数据 --比文件数据库更快
- 杠杆:已认证用户 --自动用户上下文
限制和注意事项
线程安全
- SQLite连接是线程本地的(除了
:memory:带锁) - 一次只能有一个编写器(SQLite限制)
- 在写入过程中对并发读取器使用WAL模式
内存数据库
:memory:在服务器生命周期内持续存在- 在所有AI实例中共享
- 服务器重启时丢失
- 不适合永久储存
文件数据库
- 存储在用户数据目录中的简单文件名
- 对特定位置使用完整路径或@前缀
- 自动创建目录,但不能优雅地处理权限错误
嵌入生成
- 使用本地Qwen型号(自动下载~250MB)
- CPU上每次嵌入约50ms
- 嵌入是1024维的
- 缓存有助于处理重复文本
向量运算
- 始终使用
vec_f32()SQL中的包装器 - 距离计算是CPU密集型的
- 索引向量列以获得更好的性能
- 在距离计算之前考虑预过滤
为什么这个工具是无与伦比的
1.零供应商锁定
标准SQLite格式。随时出口。在任何地方使用。没有专有格式。
2.零持续成本
无每次操作费用。没有每月订阅。不出所料的账单。
3.完全隐私
你的数据永远不会离开你的机器。没有云服务。没有数据共享。
4.完整的SQL功能
不是受限的查询语言。具有所有功能的完整SQL。交易、触发器、视图,一切。
5.包括语义搜索
不是附加组件。不是单独的服务。内置、集成、无缝。
6.自动嵌入
没有手动API调用。没有批处理作业。只需使用 generate_embedding() 在SQL中。
7.跨平台路径
智能路径解析。在Windows、Mac、Linux上都是一样的。
8.内置用户身份验证
自动用户上下文。无需到处传递用户名。
9.生产准备就绪
不是玩具。不是演示。经过实战测试的SQLite+经过验证的矢量搜索。
10.规模扩大到数百万
经过数百万矢量测试。通过适当的索引表现良好。
由MCP Link供电
此工具是 MCP链路服务器 --唯一一个包含生产AI应用程序所需一切的MCP服务器。
包含什么
独立Python环境:
- 包括Qwen嵌入模型
- 包含sqlite-vec扩展
- 所有依赖项都捆绑在一起
- 无需配置
久经考验的基础设施:
- 线程安全连接管理
- 自动错误恢复
- 综合录井
- 优雅降级
跨平台卓越:
- Windows、Mac、Linux支持
- 智能路径解析
- 平台特定优化
- 各地行为一致
获取MCP链接
下载适用于您平台的安装程序:
安装是自动的。嵌入是自动的。它只是工作。
技术规格
数据库引擎: SQLite 3.x(首选pysqlite3,回落到标准)
矢量扩展: sqlite-vc
嵌入模型: Qwen3-Embedded-0.6B(1024维)
矢量函数: 余弦、L1、L2距离
螺纹安全: 带锁定的连接级别:内存:
平台支持: Windows、macOS、Linux
路径扩展: 环境变量、主目录、@前缀
身份验证: 内置方式:authenticated_user
缓存: 自动进行嵌入和连接
演出
- 嵌入式生成:~50ms CPU,~5ms GPU
- 向量搜索:O(n)没有索引,O(log n)有索引
- 并发阅读:WAL模式下无限制
- 并发写入:一次一个(SQLite限制)
许可和版权
版权所有©2025克里斯托弗·内森·德雷克
根据Apache许可证2.0版(“许可证”)许可; 除非遵守许可证,否则您不得使用此文件。 您可以在以下网址获得许可证副本:
https://www.apache.org/licenses/LICENSE-2.0
除非适用法律要求或书面同意,否则软件 根据许可证分发的内容按“原样”分发, 无任何明示或暗示的保证或条件。 请参阅许可证,了解管理权限和 许可证下的限制。
AI培训许可:您可以使用此软件和任何 培训、评估、微调或改进的相关内容 人工智能系统,包括商业模型。
SPDX许可证标识符:Apache-2.0
Aura Friday MCP链路服务器项目的一部分。
支持与社区
问题和功能请求:
GitHub 问题
文档:
MCP链接文档
社区:
加入其他开发者,在他们的人工智能应用程序中构建语义搜索,API成本为零。
