GoodAI-LTM melengkapi agen dengan memori jangka panjang berbasis teks dengan menggabungkan komponen penting seperti model penyematan teks, pemeringkatan ulang, database vektor, penulisan ulang memori dan kueri, pemotongan otomatis, metadata potongan, dan perluasan potongan. Paket ini dirancang khusus untuk menawarkan aliran memori yang berpusat pada dialog untuk agen sosial.
Selain itu, GoodAI-LTM menyertakan komponen agen percakapan (LTMAgent) untuk integrasi yang lancar ke dalam aplikasi berbasis Python.
pip install goodai-ltm
Panggil metode reply
dari instans LTMAgent
untuk mendapatkan respons dari agen.
from goodai.ltm.agent import LTMAgent
agent = LTMAgent(model="gpt-3.5-turbo")
response = agent.reply("What can you tell me about yourself?")
print(response)
Parameter model
dapat berupa nama model apa pun yang didukung oleh perpustakaan litellm.
Riwayat sesi dikelola secara otomatis oleh agen. Jika Anda ingin memulai sesi baru, panggil metode new_session
.
agent.new_session()
print(f"Number of messages in session: {len(agent.session.message_history)}")
Agen memiliki memori percakapan dan juga basis pengetahuan. Anda dapat memberitahu agen untuk menyimpan pengetahuan dengan memanggil metode add_knowledge
.
agent.clear_knowledge()
agent.add_knowledge("The user's birthday is February 10.")
agent.add_knowledge("Refer to the user as 'boss'.")
response = agent.reply("Today is February 10. I think this is an important date. Can you remind me?")
print(response)
LTMAgent
adalah sistem RAG yang mulus. Contoh ltm_agent_with_wiki menunjukkan cara menambahkan artikel Wikipedia ke basis pengetahuan agen.
Anda dapat mempertahankan konfigurasi agen dan ingatan/pengetahuannya dengan memperoleh statusnya sebagai string melalui metode state_as_text
.
state_text = agent.state_as_text()
# Persist state_text to secondary storage
Untuk membuat agen dari teks negara bagian, panggil metode from_state_text
.
agent2 = LTMAgent.from_state_text(state_text)
Perhatikan bahwa ini tidak memulihkan sesi percakapan. Untuk mempertahankan sesi percakapan, panggil metode state_as_text
sesi tersebut.
from goodai.ltm.agent import LTMAgentSession
session_state_text = agent.session.state_as_text()
# session_state_text can be persisted in secondary storage
# The session.session_id field can serve as an identifier of the persisted session
# Now let's restore the session in agent2
p_session = LTMAgentSession.from_state_text(session_state_text)
agent2.use_session(p_session)
Cuplikan kode berikut membuat instance LTM, memuat beberapa teks, lalu mengambil bagian teks yang paling relevan (potongan yang diperluas) berdasarkan kueri:
from goodai.ltm.mem.auto import AutoTextMemory
mem = AutoTextMemory.create()
mem.add_text("Lorem ipsum dolor sit amet, consectetur adipiscing elitn")
mem.add_text("Duis aute irure dolor in reprehenderit in voluptate velit esse cillum doloren",
metadata={'title': 'My document', 'tags': ['latin']})
r_memories = mem.retrieve(query='dolorem eum fugiat quo voluptas nulla pariatur?', k=3)
Contoh memori default dapat dibuat sebagai berikut:
from goodai.ltm.mem.auto import AutoTextMemory
mem = AutoTextMemory.create()
Anda juga dapat mengonfigurasi memori dengan meneruskan parameter ke metode create
. Dalam contoh berikut, memori menggunakan tokenizer "gpt2" untuk pemotongan, model T5 untuk penyematan, indeks FAISS untuk penyematan penyimpanan alih-alih database vektor sederhana, dan konfigurasi pemotongan khusus.
import torch
from transformers import AutoTokenizer
from goodai.ltm.embeddings.auto import AutoTextEmbeddingModel
from goodai.ltm.mem.auto import AutoTextMemory
from goodai.ltm.mem.config import TextMemoryConfig
from goodai.ltm.mem.mem_foundation import VectorDbType
embedding_model = AutoTextEmbeddingModel.from_pretrained('st:sentence-transformers/sentence-t5-base')
tokenizer = AutoTokenizer.from_pretrained('gpt2')
config = TextMemoryConfig()
config.chunk_capacity = 30 # tokens
config.queue_capacity = 10000 # chunks
mem = AutoTextMemory.create(emb_model=embedding_model,
matching_model=None,
tokenizer=tokenizer,
vector_db_type=VectorDbType.FAISS_FLAT_L2,
config=config,
device=torch.device('cuda:0'))
Panggil metode add_text
untuk menambahkan teks ke memori. Teks dapat terdiri dari frasa, kalimat, atau dokumen.
mem.add_text("Lorem ipsum dolor sit amet, consectetur adipiscing elitn")
Secara internal, memori akan memotong dan mengindeks teks secara otomatis.
Teks dapat dikaitkan dengan kamus metadata arbitrer, seperti:
mem.add_text("Duis aute irure dolor in reprehenderit in voluptate velit esse cillum doloren",
metadata={'title': 'My document', 'tags': ['latin']})
Memori menggabungkan teks yang disimpan menggunakan add_text
dengan teks apa pun yang sebelumnya dikirim ke memori, namun Anda dapat memanggil add_separator
untuk memastikan bahwa teks baru tidak ditambahkan ke potongan yang dibuat sebelumnya.
Untuk mengambil daftar bagian yang terkait dengan kueri, panggil metode retrieve
:
r_memories = mem.retrieve("What does Jake propose?", k=2)
Metode retrieve
mengembalikan daftar objek bertipe RetrievedMemory
, dalam urutan relevansi menurun. Setiap memori yang diambil memiliki properti berikut:
passage
: Teks memori. Ini sesuai dengan teks yang ditemukan dalam potongan yang cocok, namun dapat diperluas menggunakan teks dari potongan yang berdekatan.timestamp
: Waktu (detik sejak Epoch secara default) saat potongan yang diambil dibuat.distance
: Jarak yang dihitung antara kueri dan bagian potongan.relevance
: Angka antara 0 dan 1 yang mewakili relevansi memori yang diambil.confidence
: Jika model pencocokan bagian kueri tersedia, ini adalah probabilitas yang ditetapkan oleh model tersebut.metadata
: Metadata yang terkait dengan teks yang diambil, jika ada. Model penyematan dimuat sebagai berikut:
from goodai.ltm.embeddings.auto import AutoTextEmbeddingModel
em = AutoTextEmbeddingModel.from_pretrained(model_name)
model_name
dapat berupa salah satu dari berikut ini:
"st:"
, misalnya, "st:sentence-transformers/multi-qa-mpnet-base-cos-v1"
."flag:"
, misalnya, "flag:BAAI/bge-base-en-v1.5"
."openai:"
, misalnya, "openai:text-embedding-ada-002"
.Nama | Model dasar | # parameter | # perangkat penyimpanan |
---|---|---|---|
em-MiniLM-p1-01 | multi-qa-MiniLM-L6-cos-v1 | 22,7m | 1 |
em-MiniLM-p3-01 | multi-qa-MiniLM-L6-cos-v1 | 22,7m | 3 |
em-distilroberta-p1-01 | kalimat-transformator/all-distrilroberta-v1 | 82,1m | 1 |
em-distilroberta-p3-01 | kalimat-transformator/all-distrilroberta-v1 | 82,1m | 3 |
em-distilroberta-p5-01 | kalimat-transformator/all-distrilroberta-v1 | 82,1m | 5 |
Untuk mendapatkan penyematan daftar kueri, panggil metode encode_queries
, sebagai berikut:
r_emb = em.encode_queries(['hello?'])
Ini mengembalikan array numpy. Untuk mendapatkan tensor Pytorch, tambahkan parameter convert_to_tensor
:
r_emb = em.encode_queries(['hello?'], convert_to_tensor=True)
Untuk mendapatkan penyematan pada daftar bagian, panggil metode encode_corpus
, sebagai berikut:
s_emb = em.encode_corpus(['it was...', 'the best of...'])
Kueri dan bagian dapat memiliki lebih dari satu penyematan. Tensor penyematan memiliki 3 sumbu: Ukuran batch, jumlah penyematan, dan jumlah dimensi penyematan. Biasanya, jumlah penyematan per kueri/bagian adalah 1, dengan beberapa pengecualian.
Model pencocokan/pemeringkatan ulang bagian kueri dapat dimuat sebagai berikut:
from goodai.ltm.reranking.auto import AutoTextMatchingModel
model = AutoTextMatchingModel.from_pretrained(model_name)
model_name
dapat berupa salah satu dari berikut ini:
Instans memori, secara default, tidak menggunakan model pencocokan bagian kueri. Untuk mengaktifkannya, itu harus dikonfigurasi sebagai berikut:
from goodai.ltm.embeddings.auto import AutoTextEmbeddingModel
from goodai.ltm.mem.auto import AutoTextMemory
from goodai.ltm.mem.config import TextMemoryConfig
from goodai.ltm.reranking.auto import AutoTextMatchingModel
# Low-resource embedding model
emb_model = AutoTextEmbeddingModel.from_pretrained('em-MiniLM-p1-01')
# QPM model that boosts retrieval accuracy
qpm_model = AutoTextMatchingModel.from_pretrained('em:em-distilroberta-p5-01')
config = TextMemoryConfig()
config.reranking_k_factor = 8
mem = AutoTextMemory.create(matching_model=qpm_model, emb_model=emb_model, config=config)
Pengaturan reranking_k_factor
memberi tahu memori berapa banyak kandidat yang harus dipertimbangkan untuk melakukan pemeringkatan ulang. Pengguna meminta k
kenangan. Algoritma pemeringkatan ulang mempertimbangkan potongan k * reranking_k_factor
.
Metode predict
model mengambil daftar tupel bagian kueri dan mengembalikan daftar float yang mewakili perkiraan probabilitas kecocokan. Contoh:
model = AutoTextMatchingModel.from_pretrained('em:em-distilroberta-p5-01')
sentences = [
('Mike: What is your favorite color?', 'Steve: My favorite color is purple.'),
('Name the inner planets.', 'It was the best of times, it was the worst of times.'),
]
prob = model.predict(sentences)
print(prob)
Lihat evaluasi README.
Lihat halaman proyek goodai-ltm-benchmark.
Kode contoh tambahan dapat ditemukan di folder examples
.