iT邦幫忙

2024 iThome 鐵人賽

DAY 16
0
生成式 AI

LLM 應用、開發框架、RAG優化及評估方法 系列 第 16

Day16 GAI爆炸時代 - LangChain 串接 MongoDB (下)

  • 分享至 

  • xImage
  •  

寫入記憶性的問答到MongoDB中(連續問題)

from langchain_core.prompts import MessagesPlaceholder
from langchain.schema import HumanMessage, AIMessage
from langchain_core.runnables.history import RunnableWithMessageHistory
from dotenv import load_dotenv
import os
from pymongo import MongoClient

load_dotenv()

endpoint = os.environ["mongo_endpoint"]
mongo_client = MongoClient(endpoint)
db = mongo_client["mydatabase"]
collection = db["mycollection"]
from langchain_core.prompts import MessagesPlaceholder # 是一個佔位符,用於在模板中插入動態內容,例如對話歷史

prompt = ChatPromptTemplate.from_messages( # 創建一個聊天提示模板
    [
        ("system", "你是個聊天助理, 請根據問題作回應"),
        MessagesPlaceholder(variable_name="history"), # 在模板中插入了一個名為 history 的佔位符。這個佔位符將在對話歷史中插入之前的訊息
        ("human", "{input}"),
    ]
)

chain = prompt | chat_model  # 將聊天提示模板 prompt 與聊天模型 chat_model 結合

from langchain_core.runnables.history import RunnableWithMessageHistory # 用於將 Runnable 物件與訊息記憶功能結合,從而能夠處理包含對話歷史的對話流程

# 定義不同對話的記憶體
memories = {
    '0': ChatMessageHistory(),  # 需初始化為 ChatMessageHistory 或 MongoDBChatMessageHistory
    '1': ChatMessageHistory()
}

# 將聊天模型與記憶功能結合
chat_history = RunnableWithMessageHistory(
    chain,  # 前面定義的聊天處理鏈(包含提示模板和聊天模型)
    lambda session_id: memories[session_id], # 根據會話 ID (session_id) 從 memories 字典中提取相應的記憶體物件。這確保了不同的會話可以使用不同的歷史記錄。
    input_messages_key="input",
    history_messages_key="history",
)
# 交互式對話
while(True):
    question = input('請輸入問題')
    if question.lower() in ['exit']:  # 如果輸入“exit”,離開迴圈
        break
    
    current_history = memories['0'] # 獲得當前的對話歷史

    q_a = chat_history.invoke(
        {"input": question},
        config={"configurable": {"session_id": "0"}} # 使用session_id為0作為memory
    ).content # 取這個結果中的文本內容
    
    # 更新對話歷史
    current_history.add_user_message(question)
    current_history.add_ai_message(q_a)

    data = {
        'question': question,
        'ai_answer':q_a
    }

    collection.insert_one(data)    
    print(f'question:{question}')
    print(f'AI:{q_a}')

Error in RootListenersTracer.on_chain_end callback: ValueError()
Error in callback coroutine: ValueError()


question:我是個三分射手
AI:那真是太棒了!三分射手在籃球比賽中非常重要,能夠改變比賽的節奏和結果。你有沒有參加過比賽或者為某支球隊效力呢?還是有沒有特別喜愛的三分射手球星?


Error in RootListenersTracer.on_chain_end callback: ValueError()
Error in callback coroutine: ValueError()


question:我的專長是啥
AI:聽起來你對籃球特別是投三分球很有興趣和自信,所以可以說你的專長是三分球投射。這是一項需要精確度和穩定性的技能,非常不容易。你還有其他喜歡做的事情或者擅長的技能嗎?例如其他運動、音樂、藝術等?

上一篇
Day15 GAI爆炸時代 - LangChain 串接Mongo DB (上)
下一篇
Day17 GAI爆炸時代 - Azure OpenAI、Gateway介紹
系列文
LLM 應用、開發框架、RAG優化及評估方法 26
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言