This commit is contained in:
Dita Aji Pratama 2026-07-03 17:53:18 +07:00
parent 51f4a8c9d0
commit 856362a008
4 changed files with 200 additions and 70 deletions

1
.gitignore vendored
View File

@ -1,3 +1,4 @@
**/__pycache__/ **/__pycache__/
*.py[cod] *.py[cod]
*$py.class *$py.class
.venv/

View File

@ -1,20 +1,42 @@
import lancedb import gc, sys, lancedb
import config, embedding import config, embedding
db = lancedb.connect(config.memories_db_path)
table = db.open_table(config.memories_table) def main():
question = "cara mengecek spam di outlook" db = lancedb.connect(config.memories_db_path)
query_vector = embedding.embed_text(config.model_url, config.model_name, question) table = db.open_table(config.memories_table)
results = ( question = sys.argv[1]
table.search(query_vector, vector_column_name="vector_title") query_vector = embedding.embed_text(config.model_url, config.model_name, question)
results = (
table.search(query_vector, vector_column_name="vector_context")
.limit(3) .limit(3)
.to_list() .to_list()
) )
print("Pertanyaan:")
print(question) print("\n" + "=" * 60)
print("Hasil paling mirip:") print(f"Pertanyaan: {question}")
for row in results:
print("=" * 60) print("=" * 60)
print("ID:", row["id"])
print("Title:", row["title"]) if not results:
print("Story:", row["story"]) print("Tidak ada memori yang ditemukan.")
print("Distance:", row["_distance"]) else:
print(f"Ditemukan {len(results)} memori yang relevan berdasarkan KONTEKS:\n")
for i, row in enumerate(results, 1):
print(f"--- Memori #{i} ---")
print(f"Kapan: {row['relative_time']}")
print(f"Kejadian: {row['event']}")
print(f"Detail: {row['detail']}")
print(f"Kondisi Fisik: {row['physical']}")
print(f"Emosi: {row['emotional']}")
print(f"Kategori: {row['category']}")
print(f"Skor Jarak: {row.get('_distance', 'N/A')}")
print("-" * 30)
print("=" * 60)
del table
del db
gc.collect()
if __name__ == "__main__":
main()

View File

@ -1,11 +1,23 @@
import lancedb, pyarrow import gc, lancedb, pyarrow
import config import config
db = lancedb.connect(config.memories_db_path)
schema = pyarrow.schema([ def main():
pyarrow.field( 'id', pyarrow.string() ), db = lancedb.connect(config.memories_db_path)
pyarrow.field( 'title', pyarrow.string() ), schema = pyarrow.schema([
pyarrow.field( 'story', pyarrow.string() ), pyarrow.field('id', pyarrow.uuid(), metadata={'description': 'Unique identifier (UUID)'}),
pyarrow.field( 'vector_title', pyarrow.list_( pyarrow.float32(), config.memories_vector_size ) ), pyarrow.field('timestamp', pyarrow.timestamp('ms'), metadata={'description': 'When record created'}),
]) pyarrow.field('relative_time', pyarrow.string(), metadata={'description': 'Explaining when it happen'}),
db.create_table(config.memories_table, schema=schema) pyarrow.field('event', pyarrow.string(), metadata={'description': 'What event'}),
print(f'Table "{config.memories_table}" berhasil diproses.') pyarrow.field('category', pyarrow.string(), metadata={'description': 'Event category'}),
pyarrow.field('detail', pyarrow.string(), metadata={'description': 'Event detail'}),
pyarrow.field('physical', pyarrow.string(), metadata={'description': 'Character physical state'}),
pyarrow.field('emotional', pyarrow.string(), metadata={'description': 'Character emotional state'}),
pyarrow.field('vector_context', pyarrow.list_(pyarrow.float32(), config.memories_vector_size)),
])
db.create_table(config.memories_table, schema=schema)
print(f'Table "{config.memories_table}" berhasil diproses.')
del db
gc.collect()
if __name__ == "__main__":
main()

View File

@ -1,43 +1,138 @@
import lancedb import gc, lancedb, uuid
from datetime import datetime, timedelta
import config, embedding import config, embedding
db = lancedb.connect(config.memories_db_path)
table = db.open_table(config.memories_table) def main():
docs = [ db = lancedb.connect(config.memories_db_path)
table = db.open_table(config.memories_table)
now = datetime.now()
memories = [
{ {
"id": "wifi-001", "id": uuid.uuid4(),
"title": "Perubahan password WiFi menjadi login portal", "timestamp": now - timedelta(days=10),
"story": ( "relative_time": "Saat pertama kali menginjakkan kaki di Kota Perak",
"Password WiFi kantor telah berubah. " "event": "Pertemuan pertama",
"Sekarang akses WiFi menggunakan login portal. " "category": "Social",
"Akun login akan diberikan melalui chat pribadi masing-masing user." "detail": "Bertemu dengan karakter utama di perpustakaan kota, suasana terasa canggung namun hangat.",
), "physical": "Tegak, sedikit gemetar",
"emotional": "Gugup, Penasaran",
}, },
{ {
"id": "m365-001", "id": uuid.uuid4(),
"title": "Cara cek spam pada Outlook Group", "timestamp": now - timedelta(days=9),
"story": ( "relative_time": "Setelah badai pasir mereda di gurun",
"Untuk mengecek spam pada Outlook Group, buka Outlook Web. " "event": "Kesepakatan awal",
"Masuk ke menu Groups, pilih group terkait, lalu cek folder Junk Email atau Spam." "category": "Plot",
), "detail": "Menyepakati kerjasama untuk mencari artefak kuno yang hilang di hutan terlarang.",
"physical": "Bersalaman dengan erat",
"emotional": "Optimis, Bertekad",
}, },
{ {
"id": "printer-001", "id": uuid.uuid4(),
"title": "Printer tidak terdeteksi di komputer", "timestamp": now - timedelta(days=7),
"story": ( "relative_time": "Ketika bulan darah mencapai puncaknya",
"Jika printer tidak terdeteksi, cek koneksi kabel atau jaringan. " "event": "Serangan mendadak",
"Pastikan driver printer sudah terinstall, lalu coba restart service Print Spooler." "category": "Action",
), "detail": "Diserang oleh sekelompok goblin saat berkemah di pinggir sungai.",
"physical": "Siaga, memegang senjata",
"emotional": "Terkejut, Waspada",
}, },
] {
for doc in docs: "id": uuid.uuid4(),
"timestamp": now - timedelta(days=5),
"relative_time": "Di tengah perdebatan panas di aula rapat",
"event": "Diskusi moral",
"category": "Emotional",
"detail": "Berdebat tentang moralitas penggunaan sihir terlarang untuk menyelamatkan desa.",
"physical": "Tangan mengepal, napas berat",
"emotional": "Marah, Dilema",
},
{
"id": uuid.uuid4(),
"timestamp": now - timedelta(days=3),
"relative_time": "Sesaat setelah pintu kuil terlarang terbuka",
"event": "Penemuan petunjuk",
"category": "Investigation",
"detail": "Menemukan peta tua di reruntuhan kuil yang menunjukkan lokasi tepat artefak.",
"physical": "Mata terbelalak, membungkuk melihat peta",
"emotional": "Sangat senang, Antusias",
},
{
"id": uuid.uuid4(),
"timestamp": now - timedelta(days=2),
"relative_time": "Saat malam sunyi di bawah pohon kehidupan",
"event": "Momen tenang",
"category": "Social",
"detail": "Berbagi cerita masa lalu di depan api unggun di bawah langit berbintang.",
"physical": "Rileks, bersandar pada pohon",
"emotional": "Tenang, Melankolis",
},
{
"id": uuid.uuid4(),
"timestamp": now - timedelta(days=1),
"relative_time": "Ketika topeng sang pengkhianat terbuka",
"event": "Pengkhianatan",
"category": "Plot",
"detail": "Mengetahui bahwa salah satu rekan tim ternyata adalah mata-mata dari kerajaan lawan.",
"physical": "Kaku, tatapan tajam",
"emotional": "Terkhianati, Kecewa",
},
{
"id": uuid.uuid4(),
"timestamp": now - timedelta(hours=5),
"relative_time": "Di lorong gelap bawah tanah kastil",
"event": "Diskusi rahasia",
"category": "Plot",
"detail": "Membicarakan rencana infiltrasi ke markas musuh menggunakan terowongan bawah tanah.",
"physical": "Membungkuk, berbisik",
"emotional": "Waspada, Serius",
},
{
"id": uuid.uuid4(),
"timestamp": now - timedelta(hours=2),
"relative_time": "Saat matahari baru saja terbit di ufuk timur",
"event": "Latihan tempur",
"category": "Training",
"detail": "Melatih kombinasi serangan sihir dan fisik untuk meningkatkan sinkronisasi tim.",
"physical": "Keringat bercucuran, napas terengah",
"emotional": "Fokus, Pantang menyerah",
},
{
"id": uuid.uuid4(),
"timestamp": now,
"relative_time": "Tepat sebelum genderang perang bertalu",
"event": "Persiapan akhir",
"category": "Plot",
"detail": "Memeriksa kembali semua perlengkapan sebelum memasuki gerbang terakhir menuju artefak.",
"physical": "Menyesuaikan pelindung lengan",
"emotional": "Tegang, Percaya Diri",
},
]
for mem in memories:
context_text = f"[{mem['category']}] {mem['event']} - {mem['relative_time']}: {mem['detail']}"
row = { row = {
"id" : doc["id" ], "id": mem["id"],
"title" : doc["title" ], "timestamp": mem["timestamp"],
"story" : doc["story" ], "relative_time": mem["relative_time"],
"vector_title" : embedding.embed_text(config.model_url, config.model_name, doc["title"]), "event": mem["event"],
"category": mem["category"],
"detail": mem["detail"],
"physical": mem["physical"],
"emotional": mem["emotional"],
"vector_context": embedding.embed_text(config.model_url, config.model_name, context_text),
} }
table.add([row]) table.add([row])
print(f"Menambahkan record: {doc['title']}") print(f"Menambahkan memori: {mem['event']}")
print("\nTable berhasil diproses.")
print("Nama table:", config.memories_table) print("\nTable memori roleplaying dengan vector_context berhasil diproses.")
print("Jumlah row:", table.count_rows()) print("Nama table:", config.memories_table)
print("Jumlah row:", table.count_rows())
del table
del db
gc.collect()
if __name__ == "__main__":
main()