GoodAI-LTM は、テキスト埋め込みモデル、再ランキング、ベクトル データベース、メモリとクエリの書き換え、自動チャンク、チャンク メタデータ、チャンク拡張などの重要なコンポーネントを組み合わせることで、エージェントにテキスト ベースの長期記憶を提供します。このパッケージは、ソーシャル エージェントにダイアログ中心のメモリ ストリームを提供するように特別に設計されています。
さらに、GoodAI-LTM には、Python ベースのアプリにシームレスに統合するための会話型エージェント コンポーネント (LTMAgent) が含まれています。
pip install goodai-ltm
LTMAgent
インスタンスのreply
メソッドを呼び出して、エージェントから応答を取得します。
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:"
で始まる SentenceTransformer (Huggingface) (たとえば、 "st:sentence-transformers/multi-qa-mpnet-base-cos-v1"
。"flag:"
で始まるフラグ埋め込みモデル (例: "flag:BAAI/bge-base-en-v1.5"
。"openai:"
で始まる OpenAI 埋め込みモデル名 (例: "openai:text-embedding-ada-002"
。名前 | ベースモデル | # パラメータ | # ストレージ埋め込み |
---|---|---|---|
em-MiniLM-p1-01 | マルチqa-MiniLM-L6-cos-v1 | 22.7m | 1 |
em-MiniLM-p3-01 | マルチqa-MiniLM-L6-cos-v1 | 22.7m | 3 |
em-distilroberta-p1-01 | 文-transformers/all-distrilroberta-v1 | 82.1m | 1 |
em-distilroberta-p3-01 | 文-transformers/all-distrilroberta-v1 | 82.1m | 3 |
em-distilroberta-p5-01 | 文-transformers/all-distrilroberta-v1 | 82.1m | 5 |
クエリのリストの埋め込みを取得するには、次のようにencode_queries
メソッドを呼び出します。
r_emb = em.encode_queries(['hello?'])
これは numpy 配列を返します。 Pytorch tensor を取得するには、 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
フォルダーにあります。