يزود GoodAI-LTM الوكلاء بذاكرة طويلة المدى قائمة على النص من خلال الجمع بين المكونات الأساسية مثل نماذج تضمين النص، وإعادة الترتيب، وقواعد البيانات المتجهة، وإعادة كتابة الذاكرة والاستعلام، والتقطيع التلقائي، وبيانات تعريف القطعة، وتوسيع القطعة. تم تصميم هذه الحزمة خصيصًا لتقديم تدفق ذاكرة يركز على الحوار للوكلاء الاجتماعيين.
بالإضافة إلى ذلك، يتضمن GoodAI-LTM مكون وكيل المحادثة (LTMAgent) للتكامل السلس في التطبيقات المستندة إلى Python.
pip install goodai-ltm
قم باستدعاء أسلوب reply
الخاص بمثيل LTMAgent
للحصول على رد من الوكيل.
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)
يمكن أن تكون معلمة model
هي اسم أي نموذج تدعمه مكتبة Litellm.
يتم الاحتفاظ بسجل الجلسة تلقائيًا بواسطة الوكيل. إذا كنت تريد بدء جلسة جديدة، فاتصل بالطريقة new_session
.
agent.new_session()
print(f"Number of messages in session: {len(agent.session.message_history)}")
لدى الوكيل ذاكرة محادثة وأيضًا قاعدة معرفية. يمكنك إخبار الوكيل بتخزين المعرفة عن طريق استدعاء طريقة 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
هو نظام RAG سلس. يوضح مثال ltm_agent_with_wiki كيفية إضافة مقالات Wikipedia إلى قاعدة معارف الوكيل.
يمكنك الاستمرار في تكوين الوكيل وذكرياته/معرفته عن طريق الحصول على حالته كسلسلة عبر طريقة state_as_text
.
state_text = agent.state_as_text()
# Persist state_text to secondary storage
لإنشاء وكيل من نص الحالة، قم باستدعاء الأسلوب from_state_text
.
agent2 = LTMAgent.from_state_text(state_text)
لاحظ أن هذا لا يؤدي إلى استعادة جلسة المحادثة. للاستمرار في جلسة المحادثة، اتصل بالطريقة state_as_text
الخاصة بالجلسة.
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)
يقوم مقتطف التعليمات البرمجية التالي بإنشاء مثيل LTM، ويقوم بتحميل بعض النصوص ثم يسترد المقاطع النصية الأكثر صلة (الأجزاء الموسعة) عند تقديم استعلام:
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)
يمكن إنشاء مثيل الذاكرة الافتراضية على النحو التالي:
from goodai.ltm.mem.auto import AutoTextMemory
mem = AutoTextMemory.create()
يمكنك أيضًا تكوين الذاكرة عن طريق تمرير المعلمات إلى طريقة create
. في المثال التالي، تستخدم الذاكرة رمزًا مميزًا "gpt2" للتقطيع، ونموذج T5 للتضمين، وفهرس FAISS لتضمين التخزين بدلاً من قاعدة بيانات متجهة بسيطة، وتكوين التقطيع المخصص.
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'))
استدعاء الأسلوب add_text
لإضافة نص إلى الذاكرة. قد يتكون النص من عبارات أو جمل أو مستندات.
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']})
تقوم الذاكرة بتسلسل النص المخزن باستخدام add_text
مع أي نص تم إرساله مسبقًا إلى الذاكرة، ولكن يمكنك استدعاء add_separator
للتأكد من عدم إضافة نص جديد إلى القطع التي تم إنشاؤها مسبقًا.
لاسترداد قائمة المقاطع المرتبطة بالاستعلام، قم باستدعاء طريقة retrieve
:
r_memories = mem.retrieve("What does Jake propose?", k=2)
تقوم طريقة retrieve
بإرجاع قائمة بالكائنات من النوع RetrievedMemory
، بترتيب تنازلي من حيث الصلة. تتمتع كل ذاكرة مستردة بالخصائص التالية:
passage
: نص الذاكرة. يتوافق هذا مع النص الموجود في مقطع مطابق، ولكن يمكن توسيعه باستخدام نص من الأجزاء المجاورة.timestamp
: الوقت (بالثواني منذ العصر افتراضيًا) الذي تم فيه إنشاء القطعة المستردة.distance
: المسافة المحسوبة بين الاستعلام وممر القطعة.relevance
: رقم بين 0 و 1 يمثل أهمية الذاكرة المستردة.confidence
: إذا كان نموذج مطابقة مقطع الاستعلام متاحًا، فهذا هو الاحتمال الذي يعينه النموذج.metadata
: البيانات الوصفية المرتبطة بالنص المسترد، إن وجدت. يتم تحميل نموذج التضمين على النحو التالي:
from goodai.ltm.embeddings.auto import AutoTextEmbeddingModel
em = AutoTextEmbeddingModel.from_pretrained(model_name)
يمكن أن يكون model_name
واحدًا مما يلي:
"st:"
، على سبيل المثال، "st:sentence-transformers/multi-qa-mpnet-base-cos-v1"
."flag:"
، على سبيل المثال، "flag:BAAI/bge-base-en-v1.5"
."openai:"
، على سبيل المثال، "openai:text-embedding-ada-002"
.اسم | النموذج الأساسي | # حدود | # وحدة تخزين |
---|---|---|---|
إم-مينيLM-p1-01 | متعدد qa-MiniLM-L6-cos-v1 | 22.7 م | 1 |
إم-مينيLM-p3-01 | متعدد qa-MiniLM-L6-cos-v1 | 22.7 م | 3 |
إم-ديستيلروبيرتا-p1-01 | محولات الجملة/all-distrilroberta-v1 | 82.1 م | 1 |
إم-ديستيلروبيرتا-p3-01 | محولات الجملة/all-distrilroberta-v1 | 82.1 م | 3 |
إم-ديستيلروبيرتا-p5-01 | محولات الجملة/all-distrilroberta-v1 | 82.1 م | 5 |
للحصول على تضمينات لقائمة الاستعلامات، اتصل بالتابع encode_queries
كما يلي:
r_emb = em.encode_queries(['hello?'])
يؤدي هذا إلى إرجاع مجموعة numpy. للحصول على موتر Pytorch، قم بإضافة المعلمة convert_to_tensor
:
r_emb = em.encode_queries(['hello?'], convert_to_tensor=True)
للحصول على تضمينات لقائمة المقاطع، اتصل بالتابع encode_corpus
كما يلي:
s_emb = em.encode_corpus(['it was...', 'the best of...'])
يمكن أن تحتوي الاستعلامات والمقاطع على أكثر من تضمين واحد. تشتمل موترات التضمين على 3 محاور: حجم الدفعة وعدد التضمينات وعدد أبعاد التضمين. عادةً، سيكون عدد التضمينات لكل استعلام/مقطع هو 1، مع بعض الاستثناءات.
يمكن تحميل نموذج مطابقة/إعادة ترتيب مقطع الاستعلام على النحو التالي:
from goodai.ltm.reranking.auto import AutoTextMatchingModel
model = AutoTextMatchingModel.from_pretrained(model_name)
يمكن أن يكون model_name
واحدًا مما يلي:
لا تستخدم مثيلات الذاكرة، بشكل افتراضي، نموذج مطابقة مقطع الاستعلام. لتمكين واحد، يجب تكوينه على النحو التالي:
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)
يخبر إعداد reranking_k_factor
الذاكرة بعدد المرشحين الذين يجب أن تأخذهم في الاعتبار لإعادة الترتيب. يطلب المستخدم ذكريات k
. تأخذ خوارزمية إعادة الترتيب في الاعتبار قطع k * reranking_k_factor
.
تأخذ طريقة predict
للنموذج قائمة من مجموعات مرور الاستعلام وتقوم بإرجاع قائمة من العوامات التي تمثل احتمالات المطابقة المقدرة. مثال:
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)
راجع التمهيدي للتقييمات.
ارجع إلى صفحة مشروع Goodai-ltm-benchmark.
يمكن العثور على رمز المثال الإضافي في مجلد examples
.