3.4 建立短期問答記憶池(Short-term Memory Buffer)
為了讓系統能理解多輪對話的語境並避免重複提問,本專題新增短期記憶機制,讓模型能暫存使用者最近五輪的問答內容。 在每次新輸入時,系統會先檢查記憶池是否有資料,若存在先前的對話,就會計算目前輸入與過去問題之間的語義相似度,以判斷是否屬於相同主題。
以下這段程式會從記憶池中找出與當前輸入最相似的歷史對話,並依照相似度排序後取出前兩筆作為輔助參考,確保系統回應時能延續先前的語意脈絡。
def retrieve_memory_relevant(user_input, top_k=2):
if not memory_buffer:
return ""
query_emb = np.array(embedding_model.embed_query(user_input))
sims = []
for past_q, past_a in memory_buffer:
past_emb = np.array(embedding_model.embed_query(past_q))
sim = np.dot(query_emb, past_emb) / (np.linalg.norm(query_emb) * np.linalg.norm(past_emb))
sims.append(sim)
top_idx = sorted(range(len(sims)), key=lambda i: sims[i], reverse=True)[:top_k]
related = "\n\n".join([
f"使用者曾說:{memory_buffer[i][0]}\nAI 回覆:{memory_buffer[i][1]}"
for i in top_idx
])
return related
下列程式則負責初始化記憶池與設定最大容量,讓系統的記憶保持短期性,避免佔用過多運算資源,同時確保只保留最近的對話。
memory_buffer = []
max_memory_size = 5
而在主要聊天流程中,當使用者輸入新問題時,系統會先檢查記憶池中是否存在相關內容,若有相似對話則自動將其附加至檢索內容, 幫助模型在回答時參考舊資料,這樣模型在回覆時能根據語義延伸過去的主題,而不是重新開始。
# 加入記憶池中的相關內容
related_memory = retrieve_memory_relevant(user_input)
if related_memory:
retrieved_chunks = f"{retrieved_chunks}\n\n(以下是過去對話的相關內容,供你參考)\n{related_memory}"
最後當回覆生成後,會將這輪問答存入記憶池中,並確保總數不超過五輪。這樣的設計讓系統能保留短期語意連續性,同時避免記憶過載或語義干擾,使對話更自然流暢。
# 更新記憶池(維持固定大小)
memory_buffer.append((user_input, reply))
if len(memory_buffer) > max_memory_size:
memory_buffer.pop(0)