Skip to content

隨著大型語言模型(LLMs)如 OpenAI 的 GPT-4 持續演進,讓它們更容易使用與整合到真實世界應用中的框架與技術也不斷推進。不論你是在打造聊天機器人、自動化文件分析,或是創建能推理與使用工具的智能代理,理解如何與 LLM 互動都是關鍵。這篇文章會帶你從基礎開始,使用 OpenAI API 和 LangChain,逐步深入到模組化、結構化,甚至可以平行作業的鏈式功能。

使用 OpenAI 和 LangChain 傳送基礎提示

開發任何 LLM 應用的第一步,就是學會如何發送提示(prompt)並接收回應。

直接使用 OpenAI API

import openai

openai.api_key = "your-api-key"

response = openai.ChatCompletion.create(
    model="gpt-4",
    messages=[
        {"role": "system", "content": "你是一個樂於助人的助手。"},
        {"role": "user", "content": "用簡單的方式解釋量子運算。"}
    ]
)

print(response['choices'][0]['message']['content'])

使用 LangChain(底層仍是 OpenAI)

from langchain.chat_models import ChatOpenAI
from langchain.schema import HumanMessage

chat = ChatOpenAI(model_name="gpt-4")
response = chat([HumanMessage(content="用簡單的方式解釋量子運算。")])
print(response.content)

LangChain 幫助你隱藏繁瑣的細節,同時開啟進階功能的大門。

使用 LangChain 串流和批次處理回應

LangChain 也讓串流回應與批次處理變得很簡單:

串流回應

from langchain.callbacks.streaming_stdout import StreamingStdOutCallbackHandler

chat = ChatOpenAI(
    streaming=True,
    callbacks=[StreamingStdOutCallbackHandler()],
    model_name="gpt-4"
)

chat([HumanMessage(content="講一個關於勇敢貓咪的長故事。")])

批次處理

messages = [
    [HumanMessage(content="什麼是人工智慧?")],
    [HumanMessage(content="介紹一下機器學習。")]
]

responses = chat.generate(messages)
for res in responses.generations:
    print(res[0].text)

迭代式提示工程的重要性

在許多情境中,單次提示通常無法直接得到理想的回應。因此,我們必須進行迭代式提示工程:反覆調整、測試和改進提示,直到引導 LLM 產生符合需求的回應。這種實踐讓開發者可以更好地控制 LLM 行為,提高模型回應的準確性與品質。

抽象與重用提示:使用提示模板

若你發現自己不斷重複類似的提示內容,可以透過提示模板(Prompt Templates)來抽象化提示。這樣做可以提高重用性,減少錯誤,同時讓系統更容易擴展和維護。

探索 LangChain 表達式語言(LCEL)

LangChain Expression Language(LCEL)允許你以優雅且模組化的方式組合鏈(chains)。LCEL 不只讓提示組合變得容易,還能清楚定義每個步驟的輸入與輸出,讓開發複雜流程變得直覺又清晰。

創建自訂 LCEL 功能:客製化 Runnable

當內建元件無法滿足你的需求時,你可以透過自訂 Runnable來擴充 LCEL。自訂 Runnable 讓你可以添加自己的邏輯,插入到鏈條的任意位置,實現高度個性化的行為。

組合與平行作業的鏈

LangChain 允許你串接多個鏈條(chains),甚至可以設計鏈條並行作業。這意味著你可以同時處理多個請求或多個分析步驟,大幅提高整體運算效率和應用的即時性。

深入理解 Chat LLM 的訊息類型

與聊天型 LLM 互動時,我們使用不同訊息類型(message types),例如:

  • system 訊息(設定模型角色)
  • user 訊息(用戶輸入)
  • assistant 訊息(模型回應)

掌握這些訊息類型,才能有效地使用少量樣本提示(few-shot prompting)思維鏈提示(chain-of-thought prompting),並且透過控制 system 訊息來定義 LLM 的行為與語氣。

聊天記憶:保存對話歷史

為了讓聊天機器人能記住過去的對話內容,我們可以將人類訊息(HumanMessage)和 AI 訊息(AIMessage)儲存下來。這樣可以實現更自然的多輪對話,並且讓 LLM 理解上下文。

定義結構化輸出格式

有時,我們需要 LLM 產生特定結構的回應(例如 JSON 或表格格式)。透過明確地在提示中指定輸出結構,可以大幅提升 LLM 生成可解析資料的可靠度。

結構化資料分析與標記

透過結合 LLM 與結構化資料集合,可以執行如長篇文件分析、自動化分類、標籤生成等多種文本處理任務,讓 LLM 成為強大的資料助手。

超越 LLM:自訂工具與代理

雖然 LLM 很強大,但它們也有侷限。透過創建自訂工具(custom tools)並提供給 LLM 使用,可以擴展模型能力,讓它能查詢外部資料、運算或操作 API。

更進一步,可以打造具備推理能力的智能代理(agents)。代理能根據情境判斷何時使用工具,並將工具的結果整合到最終回應中,實現更複雜的任務自動化。


結語

從單純發送提示,到打造模組化、結構化、甚至具備推理與工具使用能力的智能代理,LLM 應用開發是一場精彩的旅程。掌握 OpenAI API 和 LangChain 的運用,將為你的 AI 開發帶來無限可能!