Skip to content

Navigation Menu

Sign in
Sign up

Repository files navigation

๐Ÿง  Semantic Memory

ไธบ AI Agent ๆ‰“้€ ็š„ๆœฌๅœฐ่ฏญไน‰่ฎฐๅฟ†ไธŽๆฃ€็ดข็ณป็ปŸ โ€” ๅฎŒๅ…จ็ฆป็บฟ,ไฟๆŠค้š็ง

GitHub stars Python License: MIT Offline Vector DB: FAISS Embedding: ONNX

๐ŸŽฏ ๆ˜ฏไป€ไนˆ

Semantic Memory ๆ˜ฏ OpenClaw Agent ็š„้•ฟๆœŸ่ฎฐๅฟ†ๆจกๅ—,ๅŸบไบŽ ONNX + FAISS ๅฎž็ŽฐๅฎŒๅ…จ็ฆป็บฟ็š„ๅ‘้‡่ฏญไน‰ๆฃ€็ดข,ๆ— ้œ€ไปปไฝ• API Key,ไธไพ่ต–ไบ‘ๆœๅŠก,ๆ•ฐๆฎๅฎŒๅ…จไฟ็•™ๅœจๆœฌๅœฐใ€‚

ๆ ธๅฟƒ่ƒฝๅŠ›:

  • ๐Ÿ” ่ฏญไน‰ๆœ็ดข โ€” ่พ“ๅ…ฅ่‡ช็„ถ่ฏญ่จ€,็žฌ้—ดๅœจๅ…จ้‡่ฎฐๅฟ†ไธญๆฃ€็ดข็›ธๅ…ณๅ†…ๅฎน
  • ๐Ÿ’พ ่ฎฐๅฟ†็ฎก็† โ€” ๆทปๅŠ ใ€็ผ–่พ‘ใ€ๅˆ ้™คใ€ๆ ‡็ญพๅŒ–ใ€้‡่ฆๆ€ง่ฏ„ๅˆ†
  • ๐Ÿ“š ็Ÿฅ่ฏ†ๅบ“ โ€” ๅคšๆ–‡ๆกฃ็ฎก็†ใ€ๆ‰น้‡ๅฏผๅ…ฅใ€ๆ–‡ๆกฃ้—ฎ็ญ”
  • ๐Ÿค– AI ไธŠไธ‹ๆ–‡ๅฌๅ›ž โ€” ่‡ชๅŠจไธบ AI ๆไพ›็›ธๅ…ณ่ฎฐๅฟ†ไฝœไธบไธŠไธ‹ๆ–‡
  • โšก ๅฎŒๅ…จ็ฆป็บฟ โ€” ONNX ๆจกๅž‹ๆœฌๅœฐๆŽจ็†,้›ถ็ฝ‘็ปœไพ่ต–

๐Ÿš€ ๅฟซ้€Ÿๅผ€ๅง‹

ๅฎ‰่ฃ…ไพ่ต–

# ๅ…‹้š†ๆˆ–่ฟ›ๅ…ฅ้กน็›ฎ็›ฎๅฝ•
cd semantic-memory
# ๅฎ‰่ฃ…ๆ ธๅฟƒไพ่ต–
pip install -r requirements.txt
# ไป…ๆ ธๅฟƒๅŠŸ่ƒฝ(ไธๅซๆ–‡ๆกฃ่งฃๆž)
pip install onnxruntime faiss-cpu numpy chardet
# ๅฎŒๆ•ดๅฎ‰่ฃ…(ๅซ PDF/DOCX/XLSX ่งฃๆž)
pip install PyPDF2 python-docx openpyxl python-pptx cryptography
# ๅฏ้€‰:Web UI
pip install streamlit
# ๅฏ้€‰:API ๆœๅŠก
pip install fastapi uvicorn

้ฆ–ๆฌก่ฟ่กŒ(่‡ชๅŠจไธ‹่ฝฝๆจกๅž‹)

from memory_manager import MemoryManager
mgr = MemoryManager() # ้ฆ–ๆฌก่‡ชๅŠจไธ‹่ฝฝ ~100MB ONNX ๆจกๅž‹

ๅŸบ็ก€็”จๆณ•

from memory_manager import MemoryManager
mgr = MemoryManager()
# โ”€โ”€ ๆทปๅŠ ่ฎฐๅฟ† โ”€โ”€
mem_id = mgr.add(
 text="ไปŠๅคฉๅ’Œๅผ ไธ‰่ฎจ่ฎบไบ† AI ้กน็›ฎ่ฟ›ๅฑ•,ๆ•ˆๆžœๅพˆๅฅฝใ€‚",
 tags=["ๅทฅไฝœ", "AI้กน็›ฎ"],
 importance=0.8,
 source="conversation",
)
print(f"่ฎฐๅฟ†ๅทฒไฟๅญ˜: {mem_id}")
# โ”€โ”€ ่ฏญไน‰ๆœ็ดข โ”€โ”€
results = mgr.search("AI ้กน็›ฎ่ฟ›ๅฑ•ๅฆ‚ไฝ•?", top_k=5)
for r in results:
 print(f" ็›ธไผผๅบฆ {r['score']:.2%} | {r['text'][:50]}...")
# โ”€โ”€ AI ไธŠไธ‹ๆ–‡ๅฌๅ›ž โ”€โ”€
context = mgr.recall("ๅผ ไธ‰็š„้กน็›ฎ่ฎจ่ฎบ", max_chars=2000)
print(context) # ๅฏ็›ดๆŽฅ็ฒ˜่ดด็ป™ๅคงๆจกๅž‹
# โ”€โ”€ ็Ÿฅ่ฏ†ๅบ“ โ”€โ”€
mgr.create_kb("ๆˆ‘็š„ๆ–‡ๆกฃๅบ“", "ๅญ˜ๆ”พๅทฅไฝœๆ–‡ๆกฃ")

๐Ÿ“– ่ฏฆ็ป†็”จๆณ•

1. ๆทปๅŠ ่ฎฐๅฟ†

# ๅ•ๆก่ฎฐๅฟ†
mem_id = mgr.add(
 text="็”จๆˆทๅๅฅฝๅœจๅพฎไฟกๆฒŸ้€š",
 tags=["็”จๆˆท", "ๅๅฅฝ"],
 importance=0.9,
 source="manual",
)
# ๆ‰น้‡ๆทปๅŠ 
mem_ids = mgr.batch_add([
 {"text": "ๅผ ไธ‰่ดŸ่ดฃๅ‰็ซฏ", "tags": ["ๅทฅไฝœ"]},
 {"text": "ๆŽๅ››่ดŸ่ดฃๅŽ็ซฏ", "tags": ["ๅทฅไฝœ"]},
])
# ่‡ชๅŠจๅˆ†ๅ—(้•ฟๆ–‡ๆœฌ่‡ชๅŠจๅˆ‡ๅˆ†)
mem_id = mgr.add("้•ฟๆ–‡ๆœฌๅ†…ๅฎน..." * 100, auto_chunk=True)

2. ่ฏญไน‰ๆœ็ดข

# ๆ ‡ๅ‡†ๆœ็ดข
results = mgr.search(
 query="ๅผ ไธ‰็š„่”็ณปๆ–นๅผ",
 top_k=5, # ่ฟ”ๅ›žๆ•ฐ้‡
 tag="ๅทฅไฝœ", # ๆ ‡็ญพ่ฟ‡ๆปค(ๅฏ้€‰)
 min_score=0.5, # ๆœ€ไฝŽ็›ธไผผๅบฆ(ๅฏ้€‰)
 kb_name="ๆˆ‘็š„ๆ–‡ๆกฃๅบ“", # ็Ÿฅ่ฏ†ๅบ“ๆœ็ดข(ๅฏ้€‰)
)
for r in results:
 print(f"[{r['score']:.2%}] {r['text']}")
 print(f" ๆ ‡็ญพ: {r['tags']} | ้‡่ฆๆ€ง: {r['importance']:.1f}")

3. AI ไธŠไธ‹ๆ–‡ๅฌๅ›ž

ไธ“ไธบ AI ๅฏน่ฏ่ฎพ่ฎก,่‡ชๅŠจๅฐ†็›ธๅ…ณ่ฎฐๅฟ†ๆ ผๅผๅŒ–ไธบ่ฟž่ดฏไธŠไธ‹ๆ–‡:

# ็”Ÿๆˆ AI ๅฏ็›ดๆŽฅไฝฟ็”จ็š„ไธŠไธ‹ๆ–‡
context = mgr.recall(
 query="็”จๆˆท็š„ๅทฅไฝœๅๅฅฝ",
 max_chars=3000, # ๆœ€ๅคงๅญ—็ฌฆๆ•ฐ
 top_k=10,
)
# ๆ•ˆๆžœ็คบไพ‹:
# [่ฎฐๅฟ† abc123] ไปŠๅคฉๅ’Œๅผ ไธ‰่ฎจ่ฎบไบ†AI้กน็›ฎ่ฟ›ๅฑ•,ๆ•ˆๆžœๅพˆๅฅฝใ€‚
# [่ฎฐๅฟ† def456] ็”จๆˆทๅๅฅฝ้€š่ฟ‡ๅพฎไฟกๆฒŸ้€šใ€‚

4. ็Ÿฅ่ฏ†ๅบ“

ๅฐ†ๆ–‡ๆกฃๅบ“ไธŽ่ฎฐๅฟ†็ณป็ปŸ้š”็ฆป็ฎก็†:

# ๅˆ›ๅปบ็Ÿฅ่ฏ†ๅบ“
mgr.create_kb("ๆˆ‘็š„ๆ–‡ๆกฃๅบ“", description="ๅญ˜ๆ”พๅทฅไฝœ็›ธๅ…ณๆ–‡ๆกฃ")
# ๅฏผๅ…ฅๆ–‡ๆกฃ
from doc_parser import import_file_to_kb, import_directory_to_kb
# ๅ•ๆ–‡ไปถๅฏผๅ…ฅ
import_file_to_kb("report.pdf", "ๆˆ‘็š„ๆ–‡ๆกฃๅบ“")
# ๆ‰น้‡ๅฏผๅ…ฅๆ•ดไธช็›ฎๅฝ•
import_directory_to_kb("./documents/", "ๆˆ‘็š„ๆ–‡ๆกฃๅบ“", tags=["ๅฝ’ๆกฃ"])
# ็Ÿฅ่ฏ†ๅบ“่ฏญไน‰ๆœ็ดข
results = mgr.query_kb("ๆˆ‘็š„ๆ–‡ๆกฃๅบ“", "ๅนดๅบฆๆŠฅๅ‘Šๆ‘˜่ฆ", top_k=3)

5. ไบคไบ’ๅผ CLI

python scripts/interactive.py
โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—
โ•‘ Semantic Memory ไบคไบ’ๅผ็ฎก็† โ•‘
โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
 [1] ๐Ÿ’พ ๆทปๅŠ ่ฎฐๅฟ†
 [2] ๐Ÿ” ่ฏญไน‰ๆœ็ดข
 [3] ๐Ÿ“‹ ่ฎฐๅฟ†ๅˆ—่กจ
 [4] ๐Ÿ—‘๏ธ ๅˆ ้™ค่ฎฐๅฟ†
 [5] ๐Ÿ“š ็Ÿฅ่ฏ†ๅบ“
 [6] โš™๏ธ ้…็ฝฎ็ฎก็†
 [7] ๐Ÿ“Š ็ปŸ่ฎกไฟกๆฏ
 [0] ๐Ÿšช ้€€ๅ‡บ
่ฏท้€‰ๆ‹ฉๆ“ไฝœ: _

Shell ่‡ชๅŠจ่กฅๅ…จ(bash / zsh / fish):

# bash
echo 'eval "$(python -m memory.completion bash)"' >> ~/.bashrc
# zsh
echo 'eval "$(python -m memory.completion zsh)"' >> ~/.zshrc
# fish
python -m memory.completion fish > ~/.config/fish/completions/memory.fish

6. Web UI

streamlit run scripts/streamlit_app.py

ๆไพ› 7 ไธช้กต้ข:

้กต้ข ๅŠŸ่ƒฝ
๐Ÿ” ่ฏญไน‰ๆœ็ดข ่พ“ๅ…ฅ่‡ช็„ถ่ฏญ่จ€,็ง’็บงๆฃ€็ดข
๐Ÿ’พ ๆทปๅŠ ่ฎฐๅฟ† ๅ•ๆกๆˆ–ๆ‰น้‡ๅฏผๅ…ฅๆ–‡ไปถ
๐Ÿ“‹ ่ฎฐๅฟ†ๅˆ—่กจ ๅˆ†้กตๆต่งˆใ€ๆœ็ดขใ€ๅˆ ้™ค
๐Ÿ“Š ็ปŸ่ฎกไฟกๆฏ ๆ ‡็ญพๅˆ†ๅธƒใ€ๆฅๆบ็ปŸ่ฎกใ€ๆ€ง่ƒฝๆŒ‡ๆ ‡
๐Ÿ“š ็Ÿฅ่ฏ†ๅบ“ ๅˆ›ๅปบใ€ๅฏผๅ…ฅใ€ๆŸฅ่ฏขๆ–‡ๆกฃๅบ“
โš™๏ธ ้…็ฝฎ็ฎก็† ๅฏ่ง†ๅŒ–ไฟฎๆ”นๆ‰€ๆœ‰้…็ฝฎ้กน
๐Ÿ—๏ธ ๆ‰น้‡ๆ“ไฝœ ๆ‰น้‡ๅˆ ้™คใ€ๆ ‡็ญพ็ฎก็†ใ€ๅฏผๅ‡บ

7. REST API ๆœๅŠก

python -m uvicorn scripts.api_server:app --reload --port 8765

ไธป่ฆ็ซฏ็‚น:

ๆ–นๆณ• ่ทฏๅพ„ ่ฏดๆ˜Ž
GET /health ๅฅๅบทๆฃ€ๆŸฅ
POST /memory/add ๆทปๅŠ ่ฎฐๅฟ†
POST /memory/search ่ฏญไน‰ๆœ็ดข
POST /memory/recall AI ไธŠไธ‹ๆ–‡ๅฌๅ›ž
GET /memory/list ๅˆ—ๅ‡บ่ฎฐๅฟ†
DELETE /memory/{id} ๅˆ ้™ค่ฎฐๅฟ†
GET /kb/list ๅˆ—ๅ‡บ็Ÿฅ่ฏ†ๅบ“
POST /kb/{name}/query ็Ÿฅ่ฏ†ๅบ“ๆŸฅ่ฏข
GET /stats ็ณป็ปŸ็ปŸ่ฎก

8. Docker ้ƒจ็ฝฒ

# ๆž„ๅปบ้•œๅƒ
docker build -t semantic-memory .
# ่ฟ่กŒ(่‡ชๅŠจไธ‹่ฝฝๆจกๅž‹)
docker run -p 8765:8765 \
 -v $(pwd)/data:/app/data \
 semantic-memory
# ๆˆ–ไฝฟ็”จ Docker Compose
docker compose up -d

API ๆ–‡ๆกฃ:http://localhost:8765/docs


๐Ÿ—๏ธ ็ณป็ปŸๆžถๆž„

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ Semantic Memory โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ โ”‚
โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
โ”‚ โ”‚ ็”จๆˆท็•Œ้ขๅฑ‚ โ”‚ โ”‚ API ๆœๅŠกๅฑ‚ โ”‚ โ”‚ CLI ๅฑ‚ โ”‚ โ”‚
โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚
โ”‚ โ”‚ Streamlit UI โ”‚ โ”‚ FastAPI โ”‚ โ”‚ interactive โ”‚ โ”‚
โ”‚ โ”‚ Streamlit โ”‚ โ”‚ REST API โ”‚ โ”‚ CLI โ”‚ โ”‚
โ”‚ โ”‚ Web App โ”‚ โ”‚ /docs โ”‚ โ”‚ shell comp. โ”‚ โ”‚
โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
โ”‚ โ”‚ โ”‚ โ”‚ โ”‚
โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
โ”‚ โ”‚ โ”‚
โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
โ”‚ โ”‚ MemoryManager โ”‚ โ”‚
โ”‚ โ”‚ (็ปŸไธ€ๅ…ฅๅฃ) โ”‚ โ”‚
โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
โ”‚ โ”‚ โ”‚
โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
โ”‚ โ”‚ โ”‚ โ”‚ โ”‚
โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
โ”‚ โ”‚ ่ฎฐๅฟ†ๆ“ไฝœ โ”‚ โ”‚ ๆฃ€็ดขๆจกๅ— โ”‚ โ”‚ ๆ–‡ๆกฃ่งฃๆž โ”‚ โ”‚
โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚
โ”‚ โ”‚ add() โ”‚ โ”‚ search() โ”‚ โ”‚ doc_parser.py โ”‚ โ”‚
โ”‚ โ”‚ delete() โ”‚ โ”‚ recall() โ”‚ โ”‚ PDF่กจๆ ผๆๅ– โ”‚ โ”‚
โ”‚ โ”‚ update() โ”‚ โ”‚ query_kb() โ”‚ โ”‚ XLSX/PPTX โ”‚ โ”‚
โ”‚ โ”‚ tag() โ”‚ โ”‚ similarity() โ”‚ โ”‚ DOCX่กจๆ ผ โ”‚ โ”‚
โ”‚ โ”‚ list() โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚
โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
โ”‚ โ”‚ โ”‚ โ”‚ โ”‚
โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
โ”‚ โ”‚ ๆ ธๅฟƒๅฑ‚ โ”‚ โ”‚
โ”‚ โ”‚ โ”‚ โ”‚
โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚
โ”‚ โ”‚ โ”‚ VectorStore โ”‚ โ”‚ ONNX Embedding โ”‚ โ”‚ Config โ”‚ โ”‚ โ”‚
โ”‚ โ”‚ โ”‚ FAISS Index โ”‚ โ”‚ BGE-small-zh โ”‚ โ”‚ Logger โ”‚ โ”‚ โ”‚
โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”‚
โ”‚ โ”‚ โ”‚ โ”‚
โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
โ”‚ โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

ๆ•ฐๆฎๆตๅ‘:

็”จๆˆท่พ“ๅ…ฅ โ”€โ”€โ†’ MemoryManager.add() โ”€โ”€โ†’ Text โ†’ ONNX Encoder โ”€โ”€โ†’ ๅ‘้‡
 โ†“ โ†“
 [chunk text] FAISS Index
 โ†“ โ†“
 JSON metadata ID mapping
 โ†“ โ†“
 memories/ โ†โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

๐Ÿ“ ้กน็›ฎๆ–‡ไปถ็ป“ๆž„

semantic-memory/
โ”œโ”€โ”€ scripts/
โ”‚ โ”œโ”€โ”€ __init__.py # ๅŒ…ๅ…ฅๅฃ
โ”‚ โ”œโ”€โ”€ core.py # ONNX Embedding ๅผ•ๆ“Ž
โ”‚ โ”œโ”€โ”€ vector_store.py # FAISS ๅ‘้‡ๅญ˜ๅ‚จ
โ”‚ โ”œโ”€โ”€ memory_manager.py # ่ฎฐๅฟ†็ฎก็†ๅ™จ(ๆ ธๅฟƒ API)
โ”‚ โ”œโ”€โ”€ config.py # ้…็ฝฎ็ฎก็†
โ”‚ โ”œโ”€โ”€ sensitive_filter.py # ๆ•ๆ„Ÿไฟกๆฏ่ฟ‡ๆปค
โ”‚ โ”œโ”€โ”€ logging.py # ็ปŸไธ€ๆ—ฅๅฟ—ๆจกๅ—
โ”‚ โ”œโ”€โ”€ batch.py # ๆ‰น้‡ๆ“ไฝœ API
โ”‚ โ”œโ”€โ”€ interactive.py # ไบคไบ’ๅผ CLI
โ”‚ โ”œโ”€โ”€ retry.py # ๆŒ‡ๆ•ฐ้€€้ฟ้‡่ฏ•่ฃ…้ฅฐๅ™จ
โ”‚ โ”œโ”€โ”€ doc_parser.py # ๅคšๆ ผๅผๆ–‡ๆกฃ่งฃๆž(PDF่กจๆ ผใ€XLSXใ€PPTX)
โ”‚ โ”œโ”€โ”€ streamlit_app.py # Web UI(Streamlit)
โ”‚ โ”œโ”€โ”€ api_server.py # FastAPI REST ๆœๅŠก
โ”‚ โ””โ”€โ”€ completion/ # Shell ่‡ชๅŠจ่กฅๅ…จ
โ”‚ โ”œโ”€โ”€ bash_completion
โ”‚ โ”œโ”€โ”€ zsh_completion
โ”‚ โ””โ”€โ”€ fish_completion
โ”œโ”€โ”€ tests/
โ”‚ โ”œโ”€โ”€ conftest.py # pytest ้…็ฝฎ + fixtures
โ”‚ โ”œโ”€โ”€ test_core.py # ONNX ๅผ•ๆ“Žๆต‹่ฏ•(ๅพ…่กฅๅ……)
โ”‚ โ”œโ”€โ”€ test_vector_store.py
โ”‚ โ”œโ”€โ”€ test_memory_manager.py
โ”‚ โ”œโ”€โ”€ test_config.py
โ”‚ โ”œโ”€โ”€ test_sensitive_filter.py
โ”‚ โ””โ”€โ”€ test_batch.py
โ”œโ”€โ”€ data/ # ๆ•ฐๆฎ็›ฎๅฝ•(่‡ชๅŠจๅˆ›ๅปบ)
โ”‚ โ”œโ”€โ”€ memories/ # ่ฎฐๅฟ† JSON ๆ–‡ไปถ
โ”‚ โ”œโ”€โ”€ kb/ # ็Ÿฅ่ฏ†ๅบ“ๆ•ฐๆฎ
โ”‚ โ”œโ”€โ”€ models/ # ONNX ๆจกๅž‹็ผ“ๅญ˜
โ”‚ โ””โ”€โ”€ logs/ # ๆ—ฅๅฟ—ๆ–‡ไปถ
โ”œโ”€โ”€ .github/
โ”‚ โ””โ”€โ”€ workflows/
โ”‚ โ””โ”€โ”€ ci.yml # GitHub Actions CI/CD
โ”œโ”€โ”€ Dockerfile # Docker ้•œๅƒๆž„ๅปบ
โ”œโ”€โ”€ docker-compose.yml # Docker Compose ็ผ–ๆŽ’
โ”œโ”€โ”€ docker/
โ”‚ โ””โ”€โ”€ README.md # Docker ้ƒจ็ฝฒๆŒ‡ๅ—
โ”œโ”€โ”€ docs/
โ”‚ โ””โ”€โ”€ api_examples.md # API ไฝฟ็”จ็คบไพ‹
โ”œโ”€โ”€ requirements.txt # Python ไพ่ต–
โ”œโ”€โ”€ pyproject.toml # ้กน็›ฎๅ…ƒๆ•ฐๆฎ + pytest ้…็ฝฎ
โ”œโ”€โ”€ CONTRIBUTING.md # ่ดก็ŒฎๆŒ‡ๅ—
โ”œโ”€โ”€ LICENSE # MIT License
โ””โ”€โ”€ README.md # ๆœฌๆ–‡ไปถ

โš™๏ธ ้…็ฝฎๅ‚่€ƒ

้…็ฝฎ้กน ้ป˜่ฎคๅ€ผ ่ฏดๆ˜Ž
model_id "BAAI/bge-small-zh-v1.5" ONNX ๆจกๅž‹ๆ ‡่ฏ†
device "cpu" ่ฟ่กŒ่ฎพๅค‡(cpu / cuda)
search_top_k 5 ้ป˜่ฎค่ฟ”ๅ›žๆ•ฐ้‡
search_min_score 0.0 ๆœ€ไฝŽ็›ธไผผๅบฆ้˜ˆๅ€ผ
half_life_days 14.0 ่ฎฐๅฟ†ๅŠ่กฐๆœŸ(ๅคฉ)
min_importance 0.2 ไฝŽไปทๅ€ผ่ฎฐๅฟ†้˜ˆๅ€ผ
dedup_threshold 0.95 ๅŽป้‡็›ธไผผๅบฆ้˜ˆๅ€ผ
dedup_enabled true ๅฏ็”จๅŽป้‡
sensitive_filter_enabled true ๅฏ็”จๆ•ๆ„Ÿไฟกๆฏ่ฟ‡ๆปค
metrics_enabled true ๅฏ็”จๆ€ง่ƒฝ็ปŸ่ฎก
chunk_max_chars 500 ๆ–‡ๆœฌๅˆ†ๅ—ๆœ€ๅคงๅญ—็ฌฆๆ•ฐ
chunk_overlap 50 ๅˆ†ๅ—้‡ๅ ๅญ—็ฌฆๆ•ฐ

้…็ฝฎๆ–‡ไปถ่ทฏๅพ„:~/.semantic_memory/config.json(ๆˆ–้€š่ฟ‡ SEMANTIC_MEMORY_DATA_DIR ็Žฏๅขƒๅ˜้‡่ฆ†็›–)


๐Ÿงช ๆต‹่ฏ•

# ่ฟ่กŒๅ…จ้ƒจๆต‹่ฏ•
pytest tests/ -v
# ่ฟ่กŒๅนถ็”Ÿๆˆ่ฆ†็›–็އๆŠฅๅ‘Š
pytest tests/ -v --cov=scripts --cov-report=html
# ไป…่ฟ่กŒๅ•ๅ…ƒๆต‹่ฏ•(ไธๅซ้›†ๆˆๆต‹่ฏ•)
pytest tests/ -v -m "not integration"
# ๅ•ไธชๆต‹่ฏ•ๆ–‡ไปถ
pytest tests/test_memory_manager.py -v

ๆณจๆ„:้ƒจๅˆ†ๆต‹่ฏ•(ๅฆ‚ ONNX ๆจกๅž‹ๅŠ ่ฝฝ)้œ€่ฆ็ฝ‘็ปœ่ฟžๆŽฅไธ‹่ฝฝๆจกๅž‹,ๅฑžไบŽ้›†ๆˆๆต‹่ฏ•ใ€‚


๐Ÿ”ง ๅธธ่ง้—ฎ้ข˜

Q: ้ฆ–ๆฌก่ฟ่กŒๆŠฅ FileNotFoundError: model not found?

้ฆ–ๆฌกๅฏๅŠจไผš่‡ชๅŠจไธ‹่ฝฝ ~100MB ็š„ ONNX ๆจกๅž‹ใ€‚ๅฆ‚้‡็ฝ‘็ปœ้—ฎ้ข˜,ๅฏๆ‰‹ๅŠจไธ‹่ฝฝ:

from scripts.core import download_model
download_model() # ้‡ๆ–ฐไธ‹่ฝฝๆจกๅž‹

Q: ๅฆ‚ไฝ•ๆŒ‡ๅฎšๆจกๅž‹ๅญ˜ๅ‚จไฝ็ฝฎ?

import os
os.environ["SEMANTIC_MEMORY_DATA_DIR"] = "/path/to/data"
mgr = MemoryManager() # ๆจกๅž‹ๅ’Œๆ•ฐๆฎๅฐ†ๅญ˜ๆ”พๅœจๆญค็›ฎๅฝ•

Q: ๆจกๅž‹ไธ‹่ฝฝๅคฑ่ดฅ/่ถ…ๆ—ถ?

ไฝฟ็”จไปฃ็†ๆˆ–ๆ‰‹ๅŠจไธ‹่ฝฝ:

# ่ฎพ็ฝฎไปฃ็†
export HTTP_PROXY=http://127.0.0.1:7890
export HTTPS_PROXY=http://127.0.0.1:7890
python -c "from memory_manager import MemoryManager; MemoryManager()"

Q: Docker ไธญ GPU ๅŠ ้€Ÿ?

# Dockerfile.gpu(ไฝฟ็”จ onnxruntime-gpu)
FROM semantic-memory:latest
RUN pip install onnxruntime-gpu
docker run --gpus all -p 8765:8765 semantic-memory:gpu

Q: ๅฆ‚ไฝ•่ฟ็งปๆ•ฐๆฎๅˆฐๆ–ฐๆœบๅ™จ?

ๆ•ดไธช data/ ็›ฎๅฝ•ๅณๆ•ฐๆฎ,ๅคๅˆถๅˆฐๆ–ฐๆœบๅ™จๅฏนๅบ”ไฝ็ฝฎๅณๅฏใ€‚FAISS ็ดขๅผ•ไธŽๆจกๅž‹ๅ‡ๅœจ้ฆ–ๆฌกๅฏๅŠจๆ—ถ่‡ชๅŠจ้‡ๅปบใ€‚

Q: ่ฎฐๅฟ†ๆ•ฐ้‡ๅพˆๅคšๅŽๆœ็ดขๅ˜ๆ…ข?

bge-small-zh-v1.5 ๆจกๅž‹็ปดๅบฆ 512,ๅœจ 10 ไธ‡ๆก่ฎฐๅฟ†ๅ†…ๆœ็ดขๆ€ง่ƒฝ่‰ฏๅฅฝใ€‚ๅฆ‚้œ€ๆ›ดๅคง่ง„ๆจก,ๅฏๅˆ‡ๆขๅˆฐ bge-base-zh-v1.5(็ปดๅบฆ 768)ๆˆ–ไฝฟ็”จ GPUใ€‚


๐Ÿ› ๏ธ ๆ‰ฉๅฑ•ไธŽๅฎšๅˆถ

ๆทปๅŠ ๆ–ฐ็š„ Embedding ๆจกๅž‹

from scripts.core import ONNXEmbeddingEngine
class MyEncoder(ONNXEmbeddingEngine):
 def __init__(self):
 super().__init__(model_id="your-model-id")
mgr = MemoryManager(encoder=MyEncoder())

่‡ชๅฎšไน‰่ฎฐๅฟ†่ฟ‡ๆปคๅ™จ

def my_filter(text: str) -> str:
 # ่‡ชๅฎšไน‰่ฟ‡ๆปค้€ป่พ‘
 return text.replace("ๅ†…้ƒจไปฃๅท", "[ๅทฒ่„ฑๆ•]")
from memory_manager import MemoryManager
mgr = MemoryManager(custom_filters=[my_filter])

็Ÿฅ่ฏ†ๅบ“ๆ’ไปถ(ๆ–‡ๆกฃ่งฃๆžๅ™จ)

# ๅœจ doc_parser.py ไธญๆณจๅ†Œๆ–ฐ็š„่งฃๆžๅ™จ
PARSERS[".odt"] = _parse_odt # ๆทปๅŠ  ODT ๆ”ฏๆŒ

๐Ÿ“‹ ๅพ…ๅฎŒๆˆๅŠŸ่ƒฝ

  • test_core.py โ€” ONNX ๅผ•ๆ“Žๅ•ๅ…ƒๆต‹่ฏ•(้œ€่ฆ mock ONNX Runtime)
  • ้€š็”จ้‡่ฏ•ๆœบๅˆถ โ€” API ่ฐƒ็”จๅ’Œ่ฎฐๅฟ†ๆ“ไฝœๆทปๅŠ  @retry ่ฃ…้ฅฐๅ™จ
  • Streamlit Web UI โ€” ๅฎŒๆ•ดๅฏ่ง†ๅŒ–็•Œ้ข(่ฟ›่กŒไธญ)
  • ๆ–‡ๆกฃๆˆชๅ›พ โ€” โœ… README ๆˆชๅ›พๅทฒๅฎŒๆˆ(่งไธŠๆ–นๆผ”็คบๅ›พ);่ง†้ข‘ๆผ”็คบๅพ…ๅฝ•ๅˆถ
  • PDF ่กจๆ ผๆ™บ่ƒฝ่งฃๆž โ€” ๅคๆ‚ PDF ่กจๆ ผ็ป“ๆž„่ฏ†ๅˆซ
  • GitHub Actions CI Token โ€” ้œ€่ฆๆ—  Token ๆ–นๅผ้…็ฝฎ(ๅฏ็”จ GITHUB_TOKEN)

๐Ÿค ่ดก็Œฎ

ๆฌข่ฟŽๆไบค Issue ๅ’Œ Pull Request!

  1. Fork ๆœฌไป“ๅบ“
  2. ๅˆ›ๅปบ็‰นๆ€งๅˆ†ๆ”ฏ:git checkout -b feature/my-feature
  3. ๆไบคๆ›ดๆ”น:git commit -am 'Add some feature'
  4. ๆŽจ้€ๅˆ†ๆ”ฏ:git push origin feature/my-feature
  5. ๅˆ›ๅปบ Pull Request

่ดก็ŒฎๆŒ‡ๅ—่ฏฆ่ง CONTRIBUTING.mdใ€‚


๐Ÿ“„ License

MIT License โ€” ่ฏฆ่ง LICENSE ๆ–‡ไปถใ€‚

About

๐Ÿง  OpenClaw ๆœฌๅœฐ่ฏญไน‰่ฎฐๅฟ†็ณป็ปŸ โ€” 100%็ฆป็บฟใ€้š็งไผ˜ๅ…ˆใ€้›ถ้…็ฝฎ | Local Semantic Memory for AI Agents with ONNX + FAISS

Topics

Resources

Contributing

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

AltStyle ใซใ‚ˆใฃใฆๅค‰ๆ›ใ•ใ‚ŒใŸใƒšใƒผใ‚ธ (->ใ‚ชใƒชใ‚ธใƒŠใƒซ) /