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__/
*.py[cod]
*$py.class
.venv/

View File

@ -1,20 +1,42 @@
import lancedb
import gc, sys, lancedb
import config, embedding
def main():
db = lancedb.connect(config.memories_db_path)
table = db.open_table(config.memories_table)
question = "cara mengecek spam di outlook"
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_title")
table.search(query_vector, vector_column_name="vector_context")
.limit(3)
.to_list()
)
print("Pertanyaan:")
print(question)
print("Hasil paling mirip:")
for row in results:
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()

View File

@ -1,11 +1,23 @@
import lancedb, pyarrow
import gc, lancedb, pyarrow
import config
def main():
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 ) ),
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()

View File

@ -1,43 +1,138 @@
import lancedb
import gc, lancedb, uuid
from datetime import datetime, timedelta
import config, embedding
def main():
db = lancedb.connect(config.memories_db_path)
table = db.open_table(config.memories_table)
docs = [
now = datetime.now()
memories = [
{
"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": 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": "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": 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": "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."
),
"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 doc in docs:
for mem in memories:
context_text = f"[{mem['category']}] {mem['event']} - {mem['relative_time']}: {mem['detail']}"
row = {
"id" : doc["id" ],
"title" : doc["title" ],
"story" : doc["story" ],
"vector_title" : embedding.embed_text(config.model_url, config.model_name, doc["title"]),
"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 record: {doc['title']}")
print("\nTable berhasil diproses.")
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()