【AI】利用生成式AI 建構應用 - 04 - 多輪對談 及 強化LLM的三種方式簡介

使用Ollama 進行多輪對談 及 強化LLM的三種方式簡介

多輪對話

修改原本的python 程式,將每次的使用者input 跟AI output 都加到messages 陣列中,並帶入messages 參數傳給LLM。如此一來,先前的對話變成LLM 的參考資料,也稱作上下文 (Context)。

import ollama
from datetime import datetime

# 指定遠端
client = ollama.Client(
    host='http://192.168.0.XXX:11434'
)

messages= [
    {"role": "system", "content": "你是一個很有幫助的AI 助手,用繁體中文回答問題"}
]

user_messages = [
    {"role": "user", "content": "用兩句話介紹獵人裡面的酷拉皮卡,他有什麼念能力"},
    {"role": "user", "content": "我剛剛說的句子是甚麼?"}
]

# 多輪對話
for i in range(2):
	# 每次拿一句丟給LLM
    messages.append(user_messages[i])

    now = datetime.now().strftime("%H:%M:%S")
    print(f'user [{now}]: {messages[len(messages)-1]["content"]}\n')


	# 呼叫LLM,並保存訊息
    response = client.chat(
        model="llama3.1-tw",    # 輸入ollama 中設定的model name
        messages=messages
    )
    messages.append(response["message"])

    now = datetime.now().strftime("%H:%M:%S")
    print(f'AI [{now}]: {messages[len(messages) - 1]["content"]}\n')
    

# user [11:03:07]: 用兩句話介紹獵人裡面的酷拉皮卡,他有什麼念能力
# AI [11:03:12]: 酷拉皮卡是日本漫畫《獵人》中的重要角色,他的念能力稱為「雷射念」( Blasting)。這種能力可以將自己的意識投射到遠處的目標上,再以極快的速度發射一個能量光束攻擊對方。

# user [11:03:12]: 我剛剛說的句子是甚麼?
# AI [11:03:20]: 你剛才說的是:「用兩句話介紹獵人裡面的酷拉皮卡,他有什麼念能力」

我們成功了進行多輪對談。跟03 文章比起來,我們提供了更多跟酷拉皮卡相關的資訊: 獵人、念能力。但模型回覆還是有錯,就是我們在02 文章提到的"幻覺"。我們希望模型可以回覆的更正確,於是發展出提升精準度的方式。


提升回覆精準度

以下是LLM 三種常見強化方式比較

項目Prompt EngineeringRAG(Retrieval-Augmented Generation)Fine-tuning(微調)
原理透過精心設計提示詞(Prompt),引導模型「怎麼思考、怎麼回答」先從外部資料庫檢索相關內容,再把資料丟給 LLM 生成答案用特定資料再訓練模型權重,讓模型「真的學會」某些知識或風格
實作難度⭐ 
幾乎零成本,純文字設計
⭐⭐⭐ 
需要向量化、資料庫、檢索流程
⭐⭐⭐⭐⭐
資料準備、訓練、評估、部署成本高
效果中等~不穩定
依賴模型本身能力,容易飄
高、穩定、可控
適合「有知識來源」的問題
高(在特定任務)
一致性最好,但因事先訓練,彈性最低
知識即時性❌ 受限於模型訓練完成的時間點✅ 可即時更新資料❌ 受限於模型訓練完成的時間點
幻覺風險高(受限於訓練資料)低(有資料來源)中(學歪就全歪)
成本幾乎 0中(向量 DB、查詢DB 時效能)高(GPU、訓練時間)
適合情境快速試驗、PoC、聊天體驗優化企業知識庫、文件問答、法規、內部資料特定語氣、固定任務、分類、格式嚴格輸出

三種方法都有各自適合的情境,也可以搭配使用。下一篇文章,作者會使用LangChain 進行RAG 實作。