大模型的“記憶”不應僅僅只依靠向量數據庫,mem0是一個很好的“融合架構”實踐方向
我們在探討大模型應用的成敗時,我們往往會聚焦于三個關鍵要素:模型本身的性能、支撐長期記憶能力的知識庫,以及擴展執(zhí)行能力的工具箱。企業(yè)級層面更多因素參考下圖:
感興趣可以聯系獲取更多細節(jié)
就為大模型構建記憶能力來講,過去一年里我們的重點落在向量檢索層面,其存儲底層焦點就是向量數據庫,曾一度爆發(fā)向量數據庫大戰(zhàn)。隨著需求的復雜化,我們越來越清楚地意識到,大模型的記憶能力僅僅依賴向量數據庫是不夠的。在今年,隨著GraphRAG的爆火,知識圖譜融合到RAG中變成一個新的熱點,這也反映了在此領域的發(fā)展趨勢。
融合"記憶"架構
從筆者來看,不論是向量數據庫,圖數據庫,KV數據庫,以及關系數據庫,他們都各有所長,都可以為大模型提供特有的上下文供給,比如檢索一個問題可以知識圖譜構建骨架,向量數據庫來聯想周邊相似的內容,kv數據庫豐富細節(jié),關系數據庫提供可靠數據支持。它們融合起來,能夠更全面,更準確的召回結果,以便大模型生成更準確的結果。可以預言,向量數據庫、圖數據庫、KV數據庫等多種存儲方式結合,構建出一個多層次的記憶系統(tǒng),為大模型提供了更全面、更智能的記憶支持,將會成為主流實踐。
最近有一篇論文《HybridRAG: Integrating Knowledge Graphs and Vector Retrieval Augmented Generation for Efficient Information Extraction》,也用實際的評估結果證明GraphRAG + VectorRAG,即 HybridRAG,從向量數據庫和知識圖譜(KG)中檢索上下文,顯著優(yōu)于傳統(tǒng)的單一使用 VectorRAG 和 GraphRAG的結果。在信息提取過程中,利用向量數據庫進行廣泛的相似性檢索,同時通過知識圖譜提供結構化的、關系豐富的上下文數據,從而生成更準確、上下文相關的回答。
在論文提到的金融領域的實驗顯示,HybridRAG在檢索準確性和答案生成方面表現出色,尤其在結合了兩種RAG方法后,相比單獨使用任一技術,HybridRAG在信實性(faithfulness)和答案相關性(answer relevance)等關鍵指標上都有顯著提升。以下是論文中三種RAG管道(VectorRAG、GraphRAG、HybridRAG)在不同評估指標上的實驗結果展示:
評估指標 | VectorRAG | GraphRAG | HybridRAG |
準確性(Faithfulness) | 0.94 | 0.96 | 0.96 |
答案相關性(Answer Relevance) | 0.91 | 0.89 | 0.96 |
上下文精度(Context Precision) | 0.84 | 0.96 | 0.79 |
上下文召回率(Context Recall) | 1.0 | 0.85 | 1.0 |
來自:https://arxiv.org/abs/2408.04948
現在,我們已經理解了多種異構存儲對大模型記憶構建的意義,那么在這方面比較有前途的框架支持呢。
Mem0
Mem0正是這樣一個項目,它通過結合知識圖譜、向量數據庫和鍵值存儲等多種數據存儲方式,為AI提供了一個強大的記憶中間層。這不僅讓AI能夠記住用戶偏好,還能根據個體需求不斷學習和適應。
Mem0的記憶系統(tǒng)不僅僅是數據的簡單存儲和檢索,而是通過智能化的分析和管理,讓大模型的記憶變得更具個性化,Mem0可以即時更新記憶,加入新的信息和交互,在多個會話中保留信息,保持對話連續(xù)性,對于長期參與至關重要,如虛擬伴侶或個性化學習助手。,維持上下文的連貫性,具有時效性、相關性和遺忘機制,會優(yōu)先考慮最近的對話,并逐漸遺忘過時的信息,這能夠確保記憶的準確和及時,以便給出更準確的響應。
官方是這么解釋其工作過程的:
Mem0 采用混合數據庫方法來管理和檢索人工智能代理和助手的長期記憶。每個記憶都與唯一標識符(如用戶 ID 或Agent ID)相關聯,從而使 Mem0 能夠組織和訪問特定于個人或上下文的記憶。當使用 add() 方法將信息添加到 Mem0 時,系統(tǒng)會提取相關事實和偏好,并將其存儲到不同的數據存儲區(qū):向量數據庫、KV數據庫和圖數據庫。當AI Agent或 LLM 需要調用記憶時,就會使用 search() 方法。然后,Mem0 會在這些數據存儲中執(zhí)行搜索,從每個來源檢索相關信息。然后,這些信息會通過一個評分層,評分層會根據相關性、重要性和再現性來評估這些信息的重要性。檢索到的記憶可以根據需要添加到 LLM 的提示中,從而增強其響應的個性化和相關性。
當一個AI助手或代理與用戶互動時,Mem0會根據交互中的關鍵信息,為用戶建立專屬的記憶空間。通過對用戶的長期行為進行分析,Mem0能夠實時調整和優(yōu)化大模型的應答,使其更加貼近用戶的個性和需求。
例如,當你告訴AI助手你喜歡在周末打網球時,Mem0不僅會記錄下這條信息,還會通過圖數據庫將這條信息與其他相關記憶(如你平時的運動習慣、喜歡的運動品牌等)關聯起來。未來,當你再與AI互動時,它不僅能記住你喜歡網球,還能根據這些信息提供更為細致和個性化的建議。
下面是mem0使用的基本方法。
pip install mem0ai
import os
from mem0 import Memory
# 假設你已經有了OpenAI API密鑰
os.environ['OPENAI_API_KEY'] = 'sk-proj-V7DGXzoKsCZVKMGSq3otY4ir2ip8vUwpI8ec_nT3BlbkFJAOz9PVs3oe-6Qq8gW0DRBGBOqTmcsfWP4FDkdXymrdTN9kSUXFqmEdrycA'
m = Memory()
def store_practice_memory(user_id, practice_details):
"""
存儲用戶的網球訓練記憶。
"""
m.add(practice_details, user_id=user_id, metadata={"category": "tennis_practice"})
all_memories = m.get_all(user_id=user_id)
print("memorie0------: ", all_memories[0])
memory_id = all_memories[0]["id"] # get a memory_id
return memory_id
def retrieve_practice_memory(user_id, query):
"""
檢索用戶的網球訓練記憶。
"""
related_memories = m.search(query=query, user_id=user_id)
return related_memories
def provide_training_advice(user_id, query):
"""
提供個性化的網球訓練建議。
"""
training_history = retrieve_practice_memory(user_id, query)
if training_history:
response = "基于你之前的訓練,建議你今天專注于提升反手擊球技巧。"
else:
response = "歡迎開始你的網球訓練之旅,讓我們從基礎的正手和反手擊球開始吧。"
return response
def update_practice_memory(memory_id, new_details):
"""
更新用戶的網球訓練記憶。
"""
m.update(memory_id=memory_id, data=new_details)
return memory_id
def get_memory_history(user_id, memory_id):
"""
獲取特定記憶的歷史記錄。
"""
all_memories = m.get_all(user_id=user_id)
print(all_memories)
memory_id = all_memories[0]["id"] # get a memory_id
history = m.history(memory_id=memory_id)
return history
def delete_memory(memory_id):
"""
刪除特定記憶。
"""
result = m.delete(memory_id=memory_id)
return result
def delete_all_memory(user_id):
"""
刪除所有記憶。
"""
result = m.delete_all(user_id=user_id)
return result
user_id = "alice"
practice_details = "今天練習了正手擊球,感覺力量控制有所提升。"
memory_id = store_practice_memory(user_id, practice_details)
print(f"memory_id: {memory_id}\n")
#memory_id: 66b96ee0-dab6-4347-bcf6-280845f87983
# 用戶請求訓練建議
query = "正手擊球訓練"
advice = provide_training_advice(user_id, query)
print(f"advice: {advice}\n")
#advice: 基于你之前的訓練,建議你今天專注于提升反手擊球技巧。
# 用戶在某項技能上取得了顯著進步,更新記憶
new_details = "正手擊球技巧已顯著提升,可以開始練習截擊了。"
update_practice_memory(memory_id, new_details)
# 獲取記憶的歷史變化
memory_history = get_memory_history(user_id, memory_id)
print(f"memory_history: {memory_history}\n")
#memory_history: [{'id': '1d1e7ac4-6cd5-431a-b931-b71d4940c30b', 'memory_id': '66b96ee0-dab6-4347-bcf6-280845f87983', 'old_memory': None, 'new_memory': 'Practiced forehand strokes today. Feels that power control has improved.', 'event': 'ADD', 'created_at': '2024-09-01T22:38:57.313817-07:00', 'updated_at': None}, {'id': 'fd36b9a3-4d50-44e8-9997-1d5a1a9f09f4', 'memory_id': '66b96ee0-dab6-4347-bcf6-280845f87983', 'old_memory': 'Practiced forehand strokes today. Feels that power control has improved.', 'new_memory': '正手擊球技巧已顯著提升,可以開始練習截擊了。', 'event': 'UPDATE', 'created_at': '2024-09-01T22:38:57.313817-07:00', 'updated_at': '2024-09-01T22:38:57.752296-07:00'}]
# 刪除記憶
delete_memory(memory_id)
all_memories = m.get_all(user_id)
print(f"all_memories: {all_memories}\n")
#all_memories: []
圖數據庫使用:
- 構建
from mem0 import Memory
config = {
"llm": {
"provider": "openai",
"config": {
"model": "gpt-4o-mini",
"temperature": 0
}
},
"graph_store": {
"provider": "neo4j",
"config": {
"url": URL,
"username": USERNAME,
"password": PASSWORD
}
},
"version": "v1.1"
}
m = Memory.from_config(config_dict=config)
user_id = "alice123"
m.add("I like painting", user_id=user_id)
m.add("I love to play badminton", user_id=user_id)
m.add("I hate playing badminton", user_id=user_id)
m.add("My friend name is john and john has a dog named tommy", user_id=user_id)
m.add("My name is alice", user_id=user_id)
m.add("John loves to hike and Harry loves to hike as well", user_id=user_id)
m.add("My friend peter is the spiderman", user_id=user_id)
- 查詢:
m.get_all(user_id=user_id)
m.search("Who is spiderman?", user_id=user_id)
{'memories': [{'id': '44c054fc-a671-4b51-baee-76f4f73b8135',
'memory': "Friend named Peter is referred to as 'the spiderman.'",
'hash': '3990cbff8c4252e1ea3435a9f0eebf3d',
'metadata': None,
'score': 0.657225732037368,
'created_at': '2024-08-27T15:53:17.605817-07:00',
'updated_at': None,
'user_id': 'alice123'}],
'entities': [{'source': 'peter',
'relation': 'identity',
'destination': 'spiderman'}]}
在這一過程中,Mem0不僅僅是一個簡單的記憶存儲工具,而是通過對信息的深度處理,成為了一個智能化的“記憶中樞”,幫助大模型在與用戶的每次互動中都能變得更加精準和貼心。
還有一個類似的項目GraphMemory(https://github.com/bradAGI/GraphMemory),感興趣可以查閱。
可以推測,混合的記憶存儲結構會和混合RAG檢索結構一起,成為LLM應用的標準范式。?
本文轉載自 ??AI工程化??,作者: ully
