09. Timeweightedvectorstoreretriever

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:

Output
%pip install -qU deeplake lark
Python
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.

Python
# 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”.

Python
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")])
Output
['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-nya mendekati nol.
Python
# “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")
Output
[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.

Python
# 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”.

Python
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")])
Output
['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”.
Python
# 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")
Output
[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.
Python
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).
Python
# 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"))
Output
[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')]