iT邦幫忙

2025 iThome 鐵人賽

DAY 11
1
Software Development

建構跨平台AI對話機器人:從LINE到Telegram實踐SDGs推廣的30天專案紀實系列 第 11

Day 11【對話邏輯】 建立基本的對話流程與回覆格式化,讓機器人能「說人話」

  • 分享至 

  • xImage
  •  

HI!大家好,我是 Shammi 😊

在過去十天,我成功建構了 RAG 架構的核心骨幹,讓機器人可以從 PDF 知識庫中,找到並回答使用者的問題。但目前的機器人還像是一個圖書館的管理員,只會精準地丟出書裡的內容。

從今天開始,我要試著讓它學會「說人話」。先設計基本的對話流程,並將回答進行格式化,讓它看起來更像是一個真正的 AI 機器人。

🌐 一、為什麼需要對話邏輯與回覆格式化?

  • 提升使用者體驗:一個好的對話機器人,應該能夠引導使用者,並讓他們感覺像是在和一個知識淵博的專家對話,而不是在和冷冰冰的程式碼互動。
  • 確保回答清晰:透過格式化,我們可以將 LLM 生成的答案整理得更有條理,例如使用標題、條列式或粗體字,讓使用者能快速掌握重點。
  • 應對無關問題:如果使用者提出的問題與 SDGs 無關,我希望機器人能禮貌地回絕,而不是隨便亂回答或丟出錯誤訊息,在測試提示詞的過程中,也發現機器人會「腦補」句子,這也是測試中要多多注意的一個重要環節。

🌐 二、實作教學:建立 RAG 機器人的對話迴圈

將 Day 10 的 RAG 流程,包裝進一個簡單的對話迴圈中。

步驟 1:整合完整的 RAG 流程函式

首先,先將 Day 10 中定義的 get_rag_answer 函式沿用過來。

這個函式將負責從接收問題、檢索、到生成答案的整個流程。

#程式碼無需再新增,僅示意步驟
def get_rag_answer(query):
    #step1. 將問題向量化 (檢索)
    query_vector = get_embedding(query)

    #step2. 在 FAISS 索引中搜尋
    distances, indices = index.search(query_vector, k=3)

    #step3. 取得最相關的原始內容
    retrieved_chunks = [stored_chunks[i] for i in indices[0]]

    #step4. 傳給 LLM 產生最終回覆 (生成)
    final_answer = generate_response(query, retrieved_chunks)

    return final_answer

步驟 2:建立對話迴圈與回覆格式化

接著,再撰寫一個 while 迴圈,讓機器人可以持續接收使用者的輸入,並將回覆進行簡單的格式化。

def chat_loop():
    print("嗨,我是 SDGs 知識機器人,我叫阿米!請問有什麼關於 SDGs 的問題嗎?")
    print("輸入 'exit' 或 'quit' 可以隨時結束對話。")
    
    while True:
        # 接收使用者輸入
        user_query = input("你:")
        
        # 檢查是否為結束指令
        if user_query.lower() in ['exit', 'quit']:
            print("阿米:期待下次為你服務!")
            break
        
        # 呼叫我們整合好的 RAG 函式
        answer = get_rag_answer(user_query)
        
        # 格式化並印出回覆
        print("\n" + "="*50)
        print("阿米:")
        print(answer)
        print("="*50 + "\n")

# 啟動對話迴圈
chat_loop()

在這個迴圈中,我們加上了簡單的結束指令,並用分隔線來讓每一輪的對話更清晰。

步驟 3:在 LLM Prompt 中加入格式化指令

為了讓回覆內容更有條理,我們可以在 Day 10 的 generate_response 函式中,修改 Prompt,直接要求 LLM 輸出帶有格式的內容。

def generate_response(query, retrieved_chunks):

    prompt = f"""
    你是一位專精於永續發展目標 (SDGs) 的專家。
    請根據以下提供的參考資料,簡潔且精準地回答使用者的問題。
    請使用 **Markdown 語法**來格式化你的回答,例如粗體、標題或條列式清單,讓回答更有條理。
    如果參考資料中沒有相關資訊,請禮貌地告知使用者。

    使用者問題:{query}

    參考資料:
    {context}
    """

(後段程式碼不變)請沿用 Day 10 generate_response 函式中,沒有被修改的程式碼,只更新 prompt 的內容即可。

這樣一來,LLM 在生成回覆時,就會自動幫我們整理出一個美觀又易讀的答案。

參考結果:
https://ithelp.ithome.com.tw/upload/images/20250908/20151627ddBiDCkEkr.jpg

總結

今天的篇幅讓機器人加上了基本的對話邏輯,從一個單向的「問答機」升級為能持續互動的「聊天機器人」。
接下來,將進入專案下一個階段:功能擴充與優化。明天的文章,我將繼續探討如何加入更進階的功能,例如處理更複雜的對話,或是在回覆中加入原始資料來源的連結,讓機器人變得更加強大。🤖🤖🤖


上一篇
Day 10【LLM 整合】串接大型語言模型:讓機器人具備生成回覆的能力
下一篇
Day 12【Web 原型】讓你的機器人開口說話!
系列文
建構跨平台AI對話機器人:從LINE到Telegram實踐SDGs推廣的30天專案紀實16
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言