09. TimeWeightedVectorStoreRetriever
TimeWeightedVectorStoreRetriever
TimeWeightedVectorStoreRetriever
adalah alat pencarian yang menggunakan kombinasi kemiripan semantik dan pembusukan dari waktu ke waktu, yang memungkinkannya untuk memberikan hasil yang memperhitungkan “kesegaran” dan “relevansi” dokumen atau data.
Algoritme penilaian dibuat sebagai berikut
di mana semantic_similarity
mewakili kemiripan semantik antara dokumen atau data, dan decay_rate
adalah tingkat yang mewakili seberapa besar skor meluruh dari waktu ke waktu. hours_passed
adalah waktu (dalam jam) sejak objek terakhir kali diakses hingga saat ini.
Fitur utama dari metode ini adalah metode ini mengevaluasi “kesegaran informasi” berdasarkan waktu terakhir kali sebuah objek diakses, yang berarti bahwa objek yang sering diakses akan mempertahankan skor yang tinggi dari waktu ke waktu, yang meningkatkan kemungkinan informasi yang sering digunakan atau penting akan muncul di bagian atas hasil pencarian. Pendekatan ini memberikan hasil pencarian dinamis yang memperhitungkan kesegaran dan relevansi.
Secara khusus, decay_rate
mengacu pada waktu yang telah berlalu sejak sebuah objek dalam retriever terakhir diakses, bukan sejak dibuat, yang berarti bahwa objek yang sering diakses tetap “segar”.
Membperbarui paket:
%pip install -qU deeplake lark
from datetime import datetime, timedelta
import faiss
from langchain.docstore import InMemoryDocstore
from langchain.retrievers import TimeWeightedVectorStoreRetriever
from langchain_community.vectorstores import FAISS
from langchain_core.documents import Document
from langchain_openai import OpenAIEmbeddings
low decay_rate
decay_rate
yang rendah (di sini kita akan mengaturnya mendekati nol secara ekstrem) berarti memori akan “diingat” lebih lama.decay_rate
0 berarti memori tidak akan pernah dilupakan
, yang membuat retriever ini setara dengan pencarian vektor.
Inisialisasi sebuah TimeWeightedVectorStoreRetriever
, mengatur penyimpanan vektor, laju peluruhan (decay_rate
) ke nilai yang sangat kecil, dan jumlah vektor yang akan diambil (k) ke 1.
# Definisikan model embedding.
embeddings_model = OpenAIEmbeddings()
# Inisialisasi penyimpanan vektor dalam keadaan kosong.
embedding_size = 1536
index = faiss.IndexFlatL2(embedding_size)
vectorstore = FAISS(embeddings_model, index, InMemoryDocstore({}), {})
# Inisialisasi pencari penyimpanan vektor dengan bobot waktu.
retriever = TimeWeightedVectorStoreRetriever(
vectorstore=vectorstore, decay_rate=0.0000000000000000000000001, k=1
)
Tambahkan objek Document
dengan string “hello world” menggunakan metode retriever.add_documents()
, dengan menetapkan waktu kemarin di last_accessed_at
sebagai metadata.
Sekali lagi, gunakan metode retriever.add_documents()
untuk menambahkan objek Document
dengan string “hello foo”.
yesterday = datetime.now() - timedelta(days=1) # Hitung tanggal kemarin.
retriever.add_documents(
# Tambahkan dokumen dengan konten "hello world" dan atur tanggal kemarin pada metadata.
[Document(page_content="hello world", metadata={"last_accessed_at": yesterday})]
)
# Tambahkan dokumen dengan konten "hello foo".
retriever.add_documents([Document(page_content="hello foo")])
['78656635-e33d-4634-92ef-ba088d3eb6e5']
Panggil metode retriever.get_relevant_documents(“hello world”)
untuk mengambil dokumen yang terkait dengan “hello world”.
- “Hello World” dikembalikan terlebih dahulu karena merupakan dokumen yang paling penting.
- Dokumen “Hello World” masih dianggap baru karena
decay_rate
-nyamendekati nol
.
# “Hello World” dikembalikan terlebih dahulu karena merupakan yang paling menonjol, dan tingkat pembusukannya mendekati nol, yang berarti masih up to date.
retriever.get_relevant_documents("hello world")
[Document(metadata={'last_accessed_at': datetime.datetime(2024, 8, 30, 16, 30, 52, 468671), 'created_at': datetime.datetime(2024, 8, 30, 16, 30, 51, 51163), 'buffer_idx': 0}, page_content='hello world')]
High decay rate
Jika Anda menggunakan decay_rate
yang tinggi (misalnya 0.9999...), nilai recency
akan dengan cepat menyatu menjadi nol.
(Jika Anda menetapkan nilai ini ke 1, semua objek akan memiliki nilai recency
0, memberikan hasil yang sama dengan Pencarian Vektor).
Inisialisasi retriever menggunakan TimeWeightedVectorStoreRetriever
. Atur decay_rate
ke 0.999 untuk menyesuaikan tingkat peluruhan bobot dari waktu ke waktu.
# Definisikan model embedding.
embeddings_model = OpenAIEmbeddings()
# Inisialisasi penyimpanan vektor dalam keadaan kosong.
embedding_size = 1536
index = faiss.IndexFlatL2(embedding_size)
vectorstore = FAISS(embeddings_model, index, InMemoryDocstore({}), {})
# Inisialisasi pencari penyimpanan vektor dengan bobot waktu.
retriever = TimeWeightedVectorStoreRetriever(
vectorstore=vectorstore, decay_rate=0.999, k=1
)
Tambahkan objek Document
dengan string “halo dunia” menggunakan metode retriever.add_documents()
, dengan menetapkan waktu kemarin di last_accessed_at
sebagai metadata.
Sekali lagi, gunakan metode retriever.add_documents()
untuk menambahkan objek Document
dengan string “hello foo”.
yesterday = datetime.now() - timedelta(days=1) # Hitung tanggal kemarin.
retriever.add_documents(
# Tambahkan dokumen dengan konten "hello world" dan atur tanggal kemarin pada metadata.
[Document(page_content="hello world", metadata={"last_accessed_at": yesterday})]
)
# Tambahkan dokumen dengan konten "hello foo".
retriever.add_documents([Document(page_content="hello foo")])
['0d34c0b5-3514-4266-bf85-56cb708af7cd']
- Ketika Anda memanggil
retriever.get_relevant_documents(“hello world”)
, “Hello Foo” dikembalikan terlebih dahulu. - Ini karena retriever telah melupakan sebagian besar dokumen yang terkait dengan “hello world”.
# Ambil dokumen yang paling relevan untuk “halo dunia”.
# “Halo Foo” dikembalikan terlebih dahulu karena “halo dunia” sebagian besar dilupakan.
retriever.get_relevant_documents("hello world")
[Document(metadata={'last_accessed_at': datetime.datetime(2024, 8, 30, 16, 32, 48, 557961), 'created_at': datetime.datetime(2024, 8, 30, 16, 32, 47, 828725), 'buffer_idx': 1}, page_content='hello foo')]
Ringkasan decay_rate
- Jika Anda mengatur decay_rate ke nilai yang sangat kecil, yaitu 0,000001: Tingkat peluruhan (yaitu tingkat di mana kita melupakan informasi) sangat rendah, sehingga kita jarang melupakan informasi. Oleh karena itu, hanya ada sedikit perbedaan tertimbang waktu antara informasi yang lebih baru dan yang lebih lama. Dalam kasus ini, kami akan memberikan nilai yang lebih tinggi pada kemiripan.
- Jika Anda mengatur decay_rate ke 0.999, yang mendekati 1: Anda memiliki tingkat peluruhan yang sangat tinggi (yaitu, tingkat di mana Anda melupakan informasi), sehingga Anda melupakan hampir semua informasi dari masa lalu. Dalam hal ini, Anda akan memberikan skor yang lebih tinggi untuk informasi terbaru.
Waktu virtual
Beberapa utilitas di LangChain memungkinkan Anda untuk menirukan komponen waktu pengujian.
Fungsi mock_now
adalah fungsi utilitas yang disediakan oleh LangChain yang digunakan untuk menirukan waktu saat ini.
- Di bawah ini, kita akan mengatur waktu ke 8 Juni 2023.
import datetime
from langchain.utils import mock_now
# Mengatur waktu saat ini ke titik waktu tertentu
mock_now(datetime.datetime(2023, 6, 8, 0, 0, 0))
# cetak waktu saat ini
print(datetime.datetime.now())
Gunakan fungsi mock_now
untuk mengatur waktu saat ini menjadi 28 Maret 2024 10:11.
- Panggil
metode retriever.get_relevant_documents
untuk mengambil dokumen yang relevan untuk kueri “hello world”. - Keluarkan hasil pencarian. Perhatikan bahwa dokumen-dokumen tersebut menunjukkan waktu akses terakhir sebagai waktu yang ditetapkan (28 Maret 2024 10:11).
# Atur waktu saat ini menjadi 3 Juni 2024 pukul 10:11.
with mock_now(datetime.datetime(2024, 3, 28, 10, 11)):
# Cari dan cetak dokumen yang relevan dengan "hello world".
print(retriever.get_relevant_documents("hello world"))
[Document(metadata={'last_accessed_at': MockDateTime(2024, 8, 28, 10, 11), 'created_at': datetime.datetime(2024, 8, 30, 16, 42, 1, 535517), 'buffer_idx': 1}, page_content='hello foo')]