還記我們在第 25 天時,用了 ConversationalRetrievalChain
,並且定義了一個 function ask_question_with_context
來儲存 Chat history。
在 Langchain 裡面,有個 Memory 的模組,可以幫助我們來儲存這樣的子的對話紀錄。常見的 Memory 有下面幾種:
這種 Memory 允許存儲訊息,並將這些對話紀錄存到一個變數中。它的主要功能是將對話紀錄保存,並隨時提取。
這種 Memory 保持對話中的交互作用列表。它只使用最後 K 次的互動。此種 Memory 可幫助系統追蹤到最近的參數 K 次交互作用,確保不會遺失重要的互動資訊。例如說 ConversationBufferWindowMemory(k=1)
,就只會紀錄上一組對話。
這種 Memory 保有最近互動的暫存,並使用 token 長度而非互動的數量。它的主要功能是基於 token 的長度來儲存和管理互動,確保 Memory 使用的最大效率。這裡常見的有兩個參數,llm=llm, max_token_limit=50
。llm
就是放入 ChatGPT 這種 AI model ,而 max_token_limit
是限制最多記得多長的 token 的對話紀錄。
這種 Memory 會把前面的對話紀錄做摘要。雖然看起來很不錯,但也是還要再放了一個參數是 llm,就由這個 LLM 來把對話紀錄做摘要。也就是說會比較消耗 ChatGPT token 量。
def memory_chat():
return ConversationBufferMemory(
memory_key="chat_history",
return_messages=True,
output_key="answer")
main()
裡面,加上與修改下面的程式碼。memory = memory_chat()
qa = ConversationalRetrievalChain.from_llm(
llm=llm,
retriever=doc_store.as_retriever(),
condense_question_prompt=QUESTION_PROMPT,
return_source_documents=True,
memory=memory, # memory 加在這裡
verbose=False
)
ask_question_with_context
。一樣添加程式碼在 main 下面。query = "公共化的托育補助是多少?"
result = qa({"question": query})
print("answer:", result["answer"])
query = "衛生福利部諮詢專線是多少?"
result = qa({"question": query})
print("answer:", result["answer"])
print("chat_history:", memory.load_memory_variables({}))
接著就會看到如下面的結果了,可以把 chat_history
給印出來。