跳转至

常见问题 (FAQ)

安装和设置

Q: 系统需求是什么?

A: OntoMem 需要: - Python 3.11 或更高版本 - 最少 2GB RAM - 任何操作系统:Linux、macOS 或 Windows

Q: 我需要单独安装 FAISS 吗?

A: 不需要,FAISS 包含在基础安装中(faiss-cpu)。

对于 GPU 加速(仅 NVIDIA):

pip install faiss-gpu

Q: 我可以在不使用 LLM 功能的情况下使用 OntoMem 吗?

A: 可以!LLM 功能是可选的。你可以使用经典合并策略(MERGE_FIELD、KEEP_INCOMING、KEEP_EXISTING)而无需任何 LLM 客户端或嵌入器。


使用问题

Q: 我如何定义我的数据模式?

A: 使用 Pydantic BaseModel:

from pydantic import BaseModel
from typing import List, Optional

class MyEntity(BaseModel):
    id: str  # 唯一标识符
    name: str
    tags: List[str]
    metadata: Optional[dict] = None

Q: 我应该用什么作为 key_extractor?

A: 任何唯一标识实体的字段(或组合):

# 简单:使用单个字段
key_extractor=lambda x: x.id

# 复合:组合多个字段
key_extractor=lambda x: f"{x.first_name}_{x.last_name}"

# 复杂:自定义逻辑
key_extractor=lambda x: x.email.lower().split("@")[0]

Q: 自动合并如何工作?

A: 当你添加具有现有键的实体时:

  1. 触发合并(不创建重复)
  2. 策略确定如何解决冲突
  3. 结果是单个整合的实体
memory.add(v1)  # 添加
memory.add(v1_updated)  # 触发合并,不重复

Q: MERGE_FIELD 和 LLM.BALANCED 的区别是什么?

A:

  • MERGE_FIELD:简单、确定性(非空覆盖)
  • LLM.BALANCED:智能综合,可以解决复杂矛盾,较慢并消耗 LLM tokens

使用 MERGE_FIELD 来提高速度/降低成本。使用 LLM.BALANCED 处理复杂数据。


搜索和检索

Q: 我如何搜索我的记忆?

A: 两种方法:

# 1. 精确查询(快速)
entity = memory.get("john_doe")

# 2. 语义搜索(需要索引)
memory.build_index()
results = memory.search("人工智能研究", top_k=5)

Q: 我必须构建索引才能使用记忆吗?

A: 不。你可以在不构建索引的情况下使用 get()。索引仅在 search() 时需要。

A: 取决于你的用例: - k=1-5:查找最相关的单个项目 - k=5-10:获取顶部候选项 - k=20+:检索大型候选集

k=5 开始,根据结果调整。


持久化

Q: 我如何保存我的记忆?

A: 使用 dump()

memory.dump("./my_memory")
# 创建:my_memory/memory.json, my_memory/faiss.index, 等

Q: 我如何恢复已保存的记忆?

A: 使用 load()

new_memory = OMem(...)  # 使用相同模式创建实例
new_memory.load("./my_memory")  # 恢复状态

Q: dump() 创建了哪些文件?

A: - memory.json:序列化的实体 - faiss.index:向量索引(如果已构建) - metadata.json:配置信息

Q: 我可以将记忆导出为 JSON/CSV 吗?

A: 可以,手动操作:

import json

# 导出为 JSON
with open("export.json", "w") as f:
    data = [item.model_dump() for item in memory.items]
    json.dump(data, f)

# 导出为 CSV
import pandas as pd
df = pd.DataFrame([item.model_dump() for item in memory.items])
df.to_csv("export.csv", index=False)

性能和扩展

Q: OntoMem 可以处理多少个实体?

A: 取决于: - 可用 RAM - 实体大小 - 搜索需求

指南: - <100K 实体:没有问题 - 100K-1M 实体:监控 RAM,考虑批处理 - >1M 实体:考虑分片或专门向量数据库

Q: 语义搜索是否很慢?

A: 不是: - 构建索引:每个实体约 0.5-1ms - 搜索:典型查询约 10-100ms - 使用 MERGE_FIELD 合并:<1ms - 使用 LLM 策略合并:约 1-2 秒(LLM 调用开销)

Q: 我应该重建索引吗?

A: 在主要更新后:

memory.build_index(force=True)  # 从头重建

否则,它会自动增量更新。


集成和 LLM

Q: 支持哪些 LLM 提供商?

A: 任何 LangChain 兼容模型: - OpenAI (GPT-4, GPT-3.5) - Anthropic (Claude) - Google (Gemini) - 开源(通过 Ollama、HuggingFace)

# OpenAI
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(model="gpt-4o")

# Anthropic
from langchain_anthropic import ChatAnthropic
llm = ChatAnthropic(model="claude-3-opus")

# Ollama
from langchain_community.chat_models import ChatOllama
llm = ChatOllama(model="llama2")

Q: 我如何设置我的 API 密钥?

A:

# 环境变量
export OPENAI_API_KEY="sk-..."

# 或在代码中
import os
os.environ["OPENAI_API_KEY"] = "sk-..."

Q: 我应该使用哪个嵌入模型?

A: 受欢迎的选择:

from langchain_openai import OpenAIEmbeddings
embedder = OpenAIEmbeddings(model="text-embedding-3-small")

# 开源
from langchain_community.embeddings import HuggingFaceEmbeddings
embedder = HuggingFaceEmbeddings(model_name="all-MiniLM-L6-v2")

故障排除

Q: 我收到"ImportError: FAISS not found"

A:

pip install faiss-cpu
# 或者 GPU:
pip install faiss-gpu

Q: LLM 合并非常慢

A: 这是预期的。LLM 调用每次合并需要 1-2 秒。对于频繁操作使用经典策略。

Q: 我的搜索结果不相关

A: 尝试: 1. 检查嵌入模型(使用更好的嵌入) 2. 增加 k 以获取更多候选项 3. 检查搜索查询质量

Q: 我收到重复的实体

A: 验证 key_extractor 正确标识唯一实体:

# 检查键是否真正唯一
keys = memory.keys
if len(keys) != len(set(keys)):
    print("检测到重复键!")

Q: 内存消耗很高

A: - 检查实体大小(如果太大则使用总结) - 考虑批处理/分片 - 定期重建索引


贡献和开发

Q: 我如何为 OntoMem 做贡献?

A: 1. Fork 仓库 2. 创建功能分支 3. 进行更改 4. 添加测试 5. 提交 PR

查看贡献指南。

Q: 我如何运行测试?

A:

uv sync --group dev
pytest tests/

Q: 我如何构建文档?

A:

uv add --group dev mkdocs mkdocs-material
mkdocs serve


其他问题

Q: OntoMem 是否可用于生产?

A: OntoMem 目前处于版本 0.1.5(alpha)。它适合实验和开发。在生产中使用时要谨慎并进行彻底测试。

Q: 路线图是什么?

A: 查看 GitHub Issues 了解计划的功能。

Q: 我如何报告 bug?

A:GitHub 上开启 issue


仍有问题?GitHub Discussions 上提问。