From 856362a008571c2d2eb2db90e5a84b8537f4e794 Mon Sep 17 00:00:00 2001 From: Dita Aji Pratama Date: Fri, 3 Jul 2026 17:53:18 +0700 Subject: [PATCH] Improve --- .gitignore | 1 + memories_semantic_search.py | 58 ++++++++---- table_create.py | 32 +++++-- table_modify.py | 179 +++++++++++++++++++++++++++--------- 4 files changed, 200 insertions(+), 70 deletions(-) diff --git a/.gitignore b/.gitignore index 2bb299d..a9fa7b5 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ **/__pycache__/ *.py[cod] *$py.class +.venv/ diff --git a/memories_semantic_search.py b/memories_semantic_search.py index 3930585..46b3740 100644 --- a/memories_semantic_search.py +++ b/memories_semantic_search.py @@ -1,20 +1,42 @@ -import lancedb +import gc, sys, lancedb import config, embedding -db = lancedb.connect(config.memories_db_path) -table = db.open_table(config.memories_table) -question = "cara mengecek spam di outlook" -query_vector = embedding.embed_text(config.model_url, config.model_name, question) -results = ( - table.search(query_vector, vector_column_name="vector_title") - .limit(3) - .to_list() -) -print("Pertanyaan:") -print(question) -print("Hasil paling mirip:") -for row in results: + +def main(): + db = lancedb.connect(config.memories_db_path) + table = db.open_table(config.memories_table) + question = sys.argv[1] + query_vector = embedding.embed_text(config.model_url, config.model_name, question) + + results = ( + table.search(query_vector, vector_column_name="vector_context") + .limit(3) + .to_list() + ) + + print("\n" + "=" * 60) + print(f"Pertanyaan: {question}") print("=" * 60) - print("ID:", row["id"]) - print("Title:", row["title"]) - print("Story:", row["story"]) - print("Distance:", row["_distance"]) + + if not results: + print("Tidak ada memori yang ditemukan.") + 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() diff --git a/table_create.py b/table_create.py index b9f262d..7310bcb 100644 --- a/table_create.py +++ b/table_create.py @@ -1,11 +1,23 @@ -import lancedb, pyarrow +import gc, lancedb, pyarrow import config -db = lancedb.connect(config.memories_db_path) -schema = pyarrow.schema([ - pyarrow.field( 'id', pyarrow.string() ), - pyarrow.field( 'title', pyarrow.string() ), - pyarrow.field( 'story', pyarrow.string() ), - pyarrow.field( 'vector_title', pyarrow.list_( pyarrow.float32(), config.memories_vector_size ) ), -]) -db.create_table(config.memories_table, schema=schema) -print(f'Table "{config.memories_table}" berhasil diproses.') + +def main(): + db = lancedb.connect(config.memories_db_path) + schema = pyarrow.schema([ + pyarrow.field('id', pyarrow.uuid(), metadata={'description': 'Unique identifier (UUID)'}), + pyarrow.field('timestamp', pyarrow.timestamp('ms'), metadata={'description': 'When record created'}), + pyarrow.field('relative_time', pyarrow.string(), metadata={'description': 'Explaining when it happen'}), + pyarrow.field('event', pyarrow.string(), metadata={'description': 'What event'}), + 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() diff --git a/table_modify.py b/table_modify.py index 9a58bfe..ed2fd17 100644 --- a/table_modify.py +++ b/table_modify.py @@ -1,43 +1,138 @@ -import lancedb +import gc, lancedb, uuid +from datetime import datetime, timedelta import config, embedding -db = lancedb.connect(config.memories_db_path) -table = db.open_table(config.memories_table) -docs = [ - { - "id": "wifi-001", - "title": "Perubahan password WiFi menjadi login portal", - "story": ( - "Password WiFi kantor telah berubah. " - "Sekarang akses WiFi menggunakan login portal. " - "Akun login akan diberikan melalui chat pribadi masing-masing user." - ), - }, - { - "id": "m365-001", - "title": "Cara cek spam pada Outlook Group", - "story": ( - "Untuk mengecek spam pada Outlook Group, buka Outlook Web. " - "Masuk ke menu Groups, pilih group terkait, lalu cek folder Junk Email atau Spam." - ), - }, - { - "id": "printer-001", - "title": "Printer tidak terdeteksi di komputer", - "story": ( - "Jika printer tidak terdeteksi, cek koneksi kabel atau jaringan. " - "Pastikan driver printer sudah terinstall, lalu coba restart service Print Spooler." - ), - }, -] -for doc in docs: - row = { - "id" : doc["id" ], - "title" : doc["title" ], - "story" : doc["story" ], - "vector_title" : embedding.embed_text(config.model_url, config.model_name, doc["title"]), - } - table.add([row]) - print(f"Menambahkan record: {doc['title']}") -print("\nTable berhasil diproses.") -print("Nama table:", config.memories_table) -print("Jumlah row:", table.count_rows()) + +def main(): + db = lancedb.connect(config.memories_db_path) + table = db.open_table(config.memories_table) + now = datetime.now() + + memories = [ + { + "id": uuid.uuid4(), + "timestamp": now - timedelta(days=10), + "relative_time": "Saat pertama kali menginjakkan kaki di Kota Perak", + "event": "Pertemuan pertama", + "category": "Social", + "detail": "Bertemu dengan karakter utama di perpustakaan kota, suasana terasa canggung namun hangat.", + "physical": "Tegak, sedikit gemetar", + "emotional": "Gugup, Penasaran", + }, + { + "id": uuid.uuid4(), + "timestamp": now - timedelta(days=9), + "relative_time": "Setelah badai pasir mereda di gurun", + "event": "Kesepakatan awal", + "category": "Plot", + "detail": "Menyepakati kerjasama untuk mencari artefak kuno yang hilang di hutan terlarang.", + "physical": "Bersalaman dengan erat", + "emotional": "Optimis, Bertekad", + }, + { + "id": uuid.uuid4(), + "timestamp": now - timedelta(days=7), + "relative_time": "Ketika bulan darah mencapai puncaknya", + "event": "Serangan mendadak", + "category": "Action", + "detail": "Diserang oleh sekelompok goblin saat berkemah di pinggir sungai.", + "physical": "Siaga, memegang senjata", + "emotional": "Terkejut, Waspada", + }, + { + "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 = { + "id": mem["id"], + "timestamp": mem["timestamp"], + "relative_time": mem["relative_time"], + "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]) + print(f"Menambahkan memori: {mem['event']}") + + print("\nTable memori roleplaying dengan vector_context berhasil diproses.") + print("Nama table:", config.memories_table) + print("Jumlah row:", table.count_rows()) + + del table + del db + gc.collect() + +if __name__ == "__main__": + main()