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 показывает, как добавить статьи Википедии в базу знаний агента.
Вы можете сохранить конфигурацию агента и его память/знания, получив его состояние в виде строки с помощью метода 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"
.Имя | Базовая модель | # параметры | # объем памяти |
---|---|---|---|
em-MiniLM-p1-01 | multi-qa-MiniLM-L6-cos-v1 | 22,7 м | 1 |
em-MiniLM-p3-01 | multi-qa-MiniLM-L6-cos-v1 | 22,7 м | 3 |
em-distilroberta-p1-01 | преобразователи предложений/all-distrilroberta-v1 | 82,1 м | 1 |
em-distilroberta-p3-01 | преобразователи предложений/all-distrilroberta-v1 | 82,1 м | 3 |
em-distilroberta-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)
См. README оценок.
Обратитесь к странице проекта Goodai-ltm-benchmark.
Дополнительный пример кода можно найти в папке examples
.