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