iT邦幫忙

2023 iThome 鐵人賽

DAY 28
0

全端 LLM 應用開發-Day28-Langchain 的 Memory

還記我們在第 25 天時,用了 ConversationalRetrievalChain,並且定義了一個 function ask_question_with_context 來儲存 Chat history。

在 Langchain 裡面,有個 Memory 的模組,可以幫助我們來儲存這樣的子的對話紀錄。常見的 Memory 有下面幾種:

  1. ConversationBufferMemory

這種 Memory 允許存儲訊息,並將這些對話紀錄存到一個變數中。它的主要功能是將對話紀錄保存,並隨時提取。

  1. ConversationBufferWindowMemory

這種 Memory 保持對話中的交互作用列表。它只使用最後 K 次的互動。此種 Memory 可幫助系統追蹤到最近的參數 K 次交互作用,確保不會遺失重要的互動資訊。例如說 ConversationBufferWindowMemory(k=1),就只會紀錄上一組對話。

  1. ConversationTokenBufferMemory

這種 Memory 保有最近互動的暫存,並使用 token 長度而非互動的數量。它的主要功能是基於 token 的長度來儲存和管理互動,確保 Memory 使用的最大效率。這裡常見的有兩個參數,llm=llm, max_token_limit=50llm 就是放入 ChatGPT 這種 AI model ,而 max_token_limit 是限制最多記得多長的 token 的對話紀錄。

  1. ConversationSummaryMemory

這種 Memory 會把前面的對話紀錄做摘要。雖然看起來很不錯,但也是還要再放了一個參數是 llm,就由這個 LLM 來把對話紀錄做摘要。也就是說會比較消耗 ChatGPT token 量。

用 ConversationBufferMemory 來改寫

  1. 我們繼續使用前幾天範例,貼上下面的 function。
def memory_chat():
    return ConversationBufferMemory(
        memory_key="chat_history",
        return_messages=True,
        output_key="answer")
  1. 接著我們在 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
)
  1. 接著我們就直接問 ChatGPT 問題,不再使用我們自己定義的 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 給印出來。

before prompt template


上一篇
全端 LLM 應用開發-Day27-Langchain 的 Model I/O
下一篇
全端 LLM 應用開發-Day29-Langchain 的 chain
系列文
全端 LLM 應用開發(向量資料庫, Hugging Face, OpenAI, Azure ML, LangChain, FastAPI and more)30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言