跳转至

使用 Builtin Memory layer

Builtin Memory family 将可复用 entry 保存为不可变 Artifact revision。builtin extra 包含完整 runtime 和两种受支持的 database integration。远程应用应采用远程访问文档说明的 Server API。

选择 database

安装内置实现:

uv add "powercontext[builtin]"

SQLite 是默认选择。open_builtin_runtime() 持有所选 database profile,并为两种 database 返回同一个 BuiltinRuntime interface:

from powercontext.builtin.artifacts.memory import MemoryEntryInput
from powercontext.builtin.persistence.sqlite import SQLiteConfig
from powercontext.builtin.runtime import (
    BuiltinConfig,
    RememberMemoryRequest,
    open_builtin_runtime,
)


async def save_note() -> None:
    config = BuiltinConfig(
        database=SQLiteConfig(url="sqlite+aiosqlite:///powercontext.db")
    )
    async with open_builtin_runtime(config) as runtime:
        result = await runtime.memory.for_scope("project-alpha").remember(
            RememberMemoryRequest(
                entries=(
                    MemoryEntryInput(
                        kind="decision",
                        text="Use one composition root for the process.",
                    ),
                )
            )
        )
        assert result.memory_ref.revision == 1

scope ID 在数据库中选择相互隔离的 Source journal、Memory lifecycle 和 Trigger cursor。

写入和演进 entry

ScopedMemoryApplication.remember() 接受显式的 MemoryEntryInput。基于 Source 的 extraction 使用另一条路径: 先 capture Source,再通过已经配置 candidate pipeline 的 Runtime flush 待处理 Source window。

result 包含新的不可变 Memory reference 和发生变化的 entry。后续 mutation 直接使用它的 citation:

from powercontext.builtin.runtime import ReviseMemoryEntryRequest

memory = runtime.memory.for_scope("project-alpha")
entries = await memory.list()
current = entries.entries[0]
revised = await memory.revise(
    ReviseMemoryEntryRequest(
        citation=current.citation,
        kind=current.entry.kind,
        text="Use PowerContext as the only composition root.",
        reason="Clarify ownership.",
    )
)

retire() 将 entry 标记为 inactive,但不删除不可变 content。changes() 返回紧凑的 revision change。 expected revision 和 citation 保留 optimistic concurrency,调用方无需重新构造 reference。

检索、展开与引用

SQLite 和 OceanBase 都会初始化全文索引,因此不配置 embedding model 也可以检索:

from powercontext.builtin.runtime import SearchMemoryRequest

result = await runtime.memory.for_scope("project-alpha").search(
    SearchMemoryRequest(query="composition root", mode="fts")
)

每个 hit 都包含参与排序的精确 Memory revision、entry identity 和 entry version。Runtime 的 list 和 exact-read operation 返回相同的 citation 字段。

mode="auto" 会选择当前可用的最强模式,并可在 query embedding 暂时不可用时回退到 FTS。显式请求 vectorhybrid 时,如果 profile 没有提供相应能力,操作会失败。

启用 SQLite Vec1

只有同时提供 0.7 或更高版本的 Vec1 loadable extension 和 embedding model,SQLite 才会启用向量检索。 PowerContext 不负责安装或构建这个 native extension;请提供适用于目标操作系统和架构的 library:

from pathlib import Path

config = BuiltinConfig(
    database=SQLiteConfig(
        url="sqlite+aiosqlite:///powercontext.db",
        vec1_extension=Path("/opt/sqlite-extensions/vec1"),
    )
)
async with open_builtin_runtime(
    config,
    embedding_model=embedding_model,
) as runtime:
    ...

SQLite profile 会组合 FTS5 和 Vec1 strategy,并通过 Memory capabilities 报告 ftsvectorhybrid。持久化 projection 与 query vector 必须使用同一个 EmbeddingProfile,包括 model name、dimension、distance 和 normalization。更换 profile 后,应先重建 projection,再恢复 vector search。

调用 MemoryService.rebuild_projections() 可以从权威 Memory revision 重建派生检索数据。revision 和 entry 表 始终是事实来源。

使用 OceanBase 持久化

使用 OceanBaseConfig 即可选择 OceanBase,不需要修改 Server 或 Runtime 代码:

from pydantic import SecretStr

from powercontext.builtin.persistence.oceanbase import OceanBaseConfig
from powercontext.builtin.runtime import BuiltinConfig, open_builtin_runtime

config = OceanBaseConfig(
    url=SecretStr(
        "mysql+aoceanbase://user:password@127.0.0.1:2881/powercontext?charset=utf8mb4"
    )
)

async with open_builtin_runtime(
    BuiltinConfig(database=config),
    embedding_model=embedding_model,
) as runtime:
    memory = runtime.memory.for_scope("project-alpha")

OceanBase profile 与 SQLite 使用相同的 index 组合方式。全文 strategy 始终可用;提供 embedding model 后,会增加 VECTOR projection 和 HNSW strategy,并启用 vectorhybrid mode。SQLite FTS5 与 OceanBase FULLTEXT 服务于同一组 Runtime 和 Server search 调用,Vec1 与 HNSW 也通过同一接口提供向量检索。

运行检查

对外提供服务前,应确认:

  • 所选 profile 能够成功打开并完成初始化;
  • 每个 tenant 或 project 映射到预期的 scope ID;
  • 定时 extraction 已经配置 candidate pipeline;
  • Vec1 配置包含匹配的 embedding model;
  • OceanBase vector search 配置了匹配的 embedding model;
  • capability response 与实际初始化的 index 一致;
  • database 和 scheduler 资源会随进程生命周期关闭。