6 tracking change documents
Untuk mudah memahami saya sendiri saya akan buat 1 table baru dengan nama ``. Dimana saya akan menggunakan fungsi add_document yang telah kita buat lalu menggunakan index untuk mengetahui bagaimana cara merubah mendelete data tersebut. Kita akan memanfaat meta data sebagai indexing-nya, bukan UUID.
from langchain_postgres import PGVectorStore, PGEngine
from langchain_ollama.embeddings import OllamaEmbeddings
from langchain_core.documents import Document
from langchain_classic.indexes import SQLRecordManager, index
## Membuat PGEngin
connection = "postgresql+psycopg://farras:farras@localhost:6060/farraslang"
pg_engine = PGEngine.from_connection_string(connection)
## Memanggil embedding modelattr
embedding_model = OllamaEmbeddings(model="nomic-embed-text")
try:
## membuat table baru untuk latihan pada lab ini
pg_engine.init_vectorstore_table(table_name='tbl_index_test',vector_size=768)
except Exception as e:
print(f"Datase bisa jadi sudah ada {e}")
Datase bisa jadi sudah ada (psycopg.errors.DuplicateTable) relation "tbl_index_test" already exists
[SQL: CREATE TABLE "public"."tbl_index_test"(
"langchain_id" UUID PRIMARY KEY,
"content" TEXT NOT NULL,
"embedding" vector(768) NOT NULL
,
"langchain_metadata" JSON
);]
(Background on this error at: https://sqlalche.me/e/20/f405)
## Membuat object vectorab
object_vector_store = await PGVectorStore.create(
engine=pg_engine,
embedding_service=embedding_model,
table_name="tbl_index_test")
import uuid
import datetime
## Membuat document
docs = [
Document(
page_content="saya hari ini lagi diruma sakit RST Dompet duafa, saya sendang mengidap penyakit infeksi paru",
id = str(uuid.uuid4()),
metadata={
"tanggal":str(datetime.datetime.now()),
"sumber":"data_pertama"
}),
Document(
page_content="saya sedang belajar langchain juga hari ini.",
id = str(uuid.uuid4()),
metadata={
"tanggal":str(datetime.datetime.now()),
"sumber":"data_kedua"
})
]
object_vector_store.add_documents(docs)
['65c7042f-c3ca-4c06-b334-d55f5044fe39', 'd3ddac4e-1a09-4399-a191-362ada02dede']
object_vector_store.similarity_search_with_relevance_scores("Saya")
[(Document(id='1731dbb6-ee9b-5a00-a5e4-e7ce812394d4', metadata={'tanggal': '2026-02-08 15:11:22.206724', 'sumber': 'data_pertama'}, page_content='Jalan lagi saja kesana daya'),
0.6081339793484831),
(Document(id='e4d06eba-0e45-591c-9906-8b26596227fc', metadata={'tanggal': '2026-02-08 15:09:02.820277', 'another': 'metadata', 'sumber': 'data_ketiga'}, page_content='Jalan lagi saja kesana dan kemana2'),
0.5774851214814807),
(Document(id='abc1bb66-0d10-5a53-83b1-3f4bcc93e927', metadata={'tanggal': '2026-02-08 15:11:57.745049', 'another': 'metadata', 'sumber': 'data_kedua'}, page_content='Apa sajalah'),
0.563711947227461),
(Document(id='f46296c0-d573-54df-8c61-93ec531eba27', metadata={'tanggal': '2026-02-08 14:49:54.801741', 'di': 'rst'}, page_content='Mengapa berganti'),
0.5624964050942282)]
Saya memasukan 2 document pada vector store dan kita dapat melihat query diatas mengembalikan 2 kata yang memiliki kemiripan dengan kata yang dicari.
Namun katakan data yg dimasukan diatas salah, lalau bagaimana untuk meng-editnya. Umumnya jika menggunkan tools yang kita gunakan saat ini tidak memungkinkan kecuali kita menghaus dan memasukan ulang kembali data serta embedding valuenya.
Namun ada cara yang dapat kita gunakan agar kita dapat memantain data pada vectorize, yaitu menggunakan SQLRecordManager dan Index yang tersedia pada module langchain_classic
Sebagai bukti saya membuat lagi satu dokumen dengan isian yang sama tanpa menggunakan SQLRecordManager
docs = [
Document(
page_content="saya hari ini lagi diruma sakit RST Dompet duafa, saya sendang mengidap penyakit infeksi paru",
id = str(uuid.uuid4()),
metadata={
"tanggal":str(datetime.datetime.now()),
"sumber":"data_pertama"
}),
Document(
page_content="saya sedang belajar langchain juga hari ini.",
id = str(uuid.uuid4()),
metadata={
"tanggal":str(datetime.datetime.now()),
"sumber":"data_kedua"
})
]
object_vector_store.add_documents(docs)
['8b2ad7c8-c8ef-4fd4-aa6c-5ceeb19b1bbc', '05cb6dbb-ce49-48a1-a0af-d88136ba565c']
Ada data duplikate pada vectorzie yan terjadi
Updating using the index¶
## name namesapce
name_space = "my_name_space"
## Membuat record manager
record_manager = SQLRecordManager(namespace=name_space,db_url=connection)
## Membuat database schema named upsertation_record
record_manager.create_schema()
Pertama saya memasukan dokumen pertama
new_docs = [Document(
page_content="Bismillah sekarang tanggal 08 Februari 2026 saya lagi dirumah sakit",
metadata={
"tanggal":str(datetime.datetime.now()),
"sumber":"data_pertama"
}),]
new_docs
## Index pertama
index_1 = index(
docs_source=new_docs,
record_manager=record_manager,
vector_store=object_vector_store,
cleanup="incremental",
source_id_key="sumber"
)
C:\Users\maruf\anaconda3\envs\llm\Lib\site-packages\langchain_core\indexing\api.py:392: UserWarning: Using SHA-1 for document hashing. SHA-1 is *not* collision-resistant; a motivated attacker can construct distinct inputs that map to the same fingerprint. If this matters in your threat model, switch to a stronger algorithm such as 'blake2b', 'sha256', or 'sha512' by specifying `key_encoder` parameter in the `index` or `aindex` function. _warn_about_sha1()
Lalu saya menjalankan lagi kode yang sama seperti diatas
new_docs = [Document(
page_content="Bismillah sekarang tanggal 08 Februari 2026 saya lagi dirumah sakit",
metadata={
"tanggal":str(datetime.datetime.now()),
"sumber":"data_pertama"
}),]
new_docs
## Index pertama
index_1 = index(
docs_source=new_docs,
record_manager=record_manager,
vector_store=object_vector_store,
cleanup="incremental",
source_id_key="sumber"
)
Maka data tidak akan duplicate pada database, misalkan ada rubah sedikit data
new_docs = [Document(
page_content="Jalan lagi saja kesana daya",
metadata={
"tanggal":str(datetime.datetime.now()),
"sumber":"data_pertama"
}),]
## Index pertama
index_1 = index(
docs_source=new_docs,
record_manager=record_manager,
vector_store=object_vector_store,
cleanup="incremental",
source_id_key="sumber"
)
index_1
{'num_added': 1, 'num_updated': 0, 'num_skipped': 0, 'num_deleted': 1}
then how to add new document
doc_2 = [Document(
page_content="Apa sajalah",
metadata={
"tanggal":str(datetime.datetime.now()),
"another":"metadata",
"sumber":"data_kedua"
}),]
index_2 = index(
doc_2,
record_manager=record_manager,vector_store=object_vector_store, cleanup="incremental", source_id_key="sumber"
)
index_2
{'num_added': 1, 'num_updated': 0, 'num_skipped': 0, 'num_deleted': 1}
Jadi initnya adaah meta data dijadikan patokan ID sebagai source_id_key sedangkan konten hashingnya digunakan untuk menetapkan apakah ada perubahan yang harus dilakukan atau di skip.