LLM Belleği
Çoğu LLM tabanlı uygulamanın WeChat'e benzer bir sohbet arayüzü vardır. AI diyaloğu sürecinin önemli bir işlevi, önceki konuşma içinde daha önce söylenen bilgilere başvurabilme yeteneğidir. Bu, insan diyaloğu sürecine benzer şekilde, önceki içeriği tekrar etmeksizin hatırlama yeteneğine sahip olan "Bellek" olarak adlandırılır.
Bellek bileşenleri genellikle insanların hatırlama yeteneğine benzer şekilde tarihsel konuşma bilgilerini LLM alanında depolama yeteneğini kapsar. LangChain, ayrı ayrı kullanılabilen veya sorunsuz bir şekilde bir zincire entegre edilebilen çeşitli bellek fonksiyon bileşenlerini kapsar.
Bellek bileşenleri, okuma ve yazma olmak üzere iki temel işlemi uygulamak zorundadır.
LangChain'in çeşitli Zincir görev bileşenleri için, Bellek işlevini etkili hale getirirseniz benzer mantıkla aşağıdaki gibi çalışacaktır:
- İlk kullanıcı girişini aldığında, Zincir görevi, bellek bileşeninden ilgili tarihsel bilgileri sorgulamaya çalışacak, ardından tarihsel bilgileri ve kullanıcının girişini birleştirip LLM'e iletmek için içsel olarak kullanılan ipuçlarına dahil edecektir.
- LLM'den gelen içerik alındığında, sonucu bir dahaki sefere kolayca sorgulamak üzere otomatik olarak bellek bileşenine depolayacaktır.
LangChain'de bellek yeteneğinin uygulanma süreci aşağıdaki diyagramda gösterildiği gibidir:
Bellek Bileşenlerini Sisteme Entegre Etme
Bellek bileşenlerini kullanmadan önce, aşağıdaki iki soruyu düşünmelisiniz:
- Tarihsel mesaj verilerini nasıl depolayacaksınız
- Tarihsel mesaj verilerini nasıl sorgulayacaksınız
Depolama: Sohbet Mesajı Listesi
Sohbet modelini kullanıyorsanız, konuşma verileri bir sohbet mesajları listesidir. LangChain, tarihsel mesaj verilerini depolamak için çeşitli depolama motorlarını destekler, en basiti hafızada saklamaktır. Uygulamada, genellikle en yaygın kullanılan yöntem onları bir veritabanında saklamaktır.
Sorgulama: İlgili Tarihsel Konuşma Mesajlarını Nasıl Sorgularsınız
LLM'nin bellek yeteneğini uygulamak için, tarihsel mesaj içeriğini arka plan bilgisi olarak kullanarak ipuçlarına dahil etmektir. Bu şekilde, LLM soruları cevaplarken arka plan bilgilerine başvurabilir.
Tarihsel mesaj verilerini depolamak oldukça kolaydır ve daha zorlayıcı bir yönü, mevcut konuşma içeriğiyle ilgili tarihsel mesajları nasıl sorgulayacağınızdır. Mevcut konuşmayla ilgili tarihsel mesajları sorgulama ihtiyacının temel nedeni, LLM'nin maksimum token sınırı nedeniyle; tüm tarihsel konuşma içeriğini ipuçlarına sıkıştıramayız.
Yaygın tarihsel mesaj sorgulama stratejileri şunları içerir:
- Sadece en son N mesajı ipuçları için arka plan bilgisi olarak sorgulama
- Tarihsel mesajları özetlemek için yapay zekayı kullanma, bu özet ipuçları için arka plan bilgisi olarak hizmet eder
- Mevcut konuşmayla benzer tarihsel mesajları sorgulamak için vektör veritabanını kullanma
LangChain Bileşeninin Kullanım Örneği
LangChain'deki Bellek bileşeninin nasıl kullanıldığına bir göz atalım. Burada, Bellek bileşeniyle etkileşim temel bilgilerini tanıtacağız.
İlk olarak, Görev zincirinde ConversationBufferMemory'nin nasıl kullanılacağını görelim. ConversationBufferMemory, sadece sohbet mesajlarının bir listesini hafızada saklayabilen çok basit bir bellek bileşenidir ve bunları yeni bir konuşma ipucu şablonuna iletebilir.
from langchain.memory import ConversationBufferMemory
bellek = ConversationBufferMemory()
bellek.chat_memory.add_user_message("merhaba!")
bellek.chat_memory.add_ai_message("ne var?")
- Not: LangChain benzer kullanıma sahip çeşitli Bellek bileşenleri sağlar.
Zincirde Bellek Bileşeninin Kullanımı
Daha sonra, Zincirde Bellek bileşeninin nasıl kullanılacağını görelim. Aşağıda, LangChain'de kapsüllenmiş iki model olan LLM ve ChatModel'ın Bellek bileşenini nasıl kullandığını tanıtacağız.
LLM Modeli'nin Bellek Bileşenini Kullanımı Örneği
from langchain_openai import OpenAI
from langchain_core.prompts import PromptTemplate
from langchain.chains import LLMChain
from langchain.memory import ConversationBufferMemory
llm = OpenAI(temperature=0)
template = """İnsanlarla konuşan harika bir sohbet botusunuz.
Önceki konuşma:
{chat_history}
Yeni soru: {soru}
AI'nin cevabı:"""
ipucu = PromptTemplate.from_template(template)
bellek = ConversationBufferMemory(memory_key="chat_history")
konuşma = LLMChain(
llm=llm,
ipucu=ipucu,
detaylı=True,
bellek=bellek
)
konuşma({"soru": "merhaba"})
from langchain_openai import ChatOpenAI
from langchain.prompts import (
ChatPromptTemplate,
MessagesPlaceholder,
SystemMessagePromptTemplate,
HumanMessagePromptTemplate,
)
from langchain.chains import LLMChain
from langchain.memory import ConversationBufferMemory
llm = ChatOpenAI()
prompt = ChatPromptTemplate(
messages=[
SystemMessagePromptTemplate.from_template(
"Sen harika bir sohbet botusun ve bir insanla konuşuyorsun."
),
MessagesPlaceholder(variable_name="chat_history"),
HumanMessagePromptTemplate.from_template("{question}")
]
)
memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True)
conversation = LLMChain(
llm=llm,
prompt=prompt,
verbose=True,
memory=memory
)
conversation({"question": "selam"})