> For the complete documentation index, see [llms.txt](https://altero.gitbook.io/langchain-book-by-altero/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://altero.gitbook.io/langchain-book-by-altero/ch10-retriever/09.-timeweightedvectorstoreretriever.md).

# 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

<figure><img src="/files/7WpW21qNHNNQlbrWAoHb" alt=""><figcaption></figcaption></figure>

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:

```notebook-python
%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")])
```

```
['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")
```

```
[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")])
```

```
['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")
```

```
[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"))
```

```
[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')]
```
