LangChain 教學:Models – 語言模型整合
OpenAI、Ollama、Llama、Gemini、Claude
簡介
在當前的 AI 應用開發中,大型語言模型 (LLM) 已成為最核心的推動力。無論是聊天機器人、文件摘要、程式碼輔助,甚至是企業內部的知識庫查詢,都離不開 LLM 提供的自然語言理解與生成能力。
然而,單一模型往往無法滿足所有情境需求:有的需要高精度且具備最新資料的回應(如 OpenAI 的 GPT‑4),有的則需要在本地端離線運算以確保資料隱私(如 Ollama、Llama),還有的則在成本、速度或特定領域表現上各有優勢(如 Gemini、Claude)。
LangChain 作為一個「模型抽象層」與「工作流程編排」的框架,讓開發者可以 輕鬆切換、組合多種 LLM,同時提供統一的 API、記憶體管理、工具呼叫等功能。本文將從概念、程式碼範例、常見陷阱與最佳實踐,帶你快速上手在 LangChain 中整合 OpenAI、Ollama、Llama、Gemini、Claude 五大模型。
核心概念
1. LangChain 的模型抽象層
LangChain 把不同廠商的 LLM 包裝成 LLM 介面,主要提供兩個方法:
| 方法 | 功能 | 範例 |
|---|---|---|
invoke(prompt) |
單次文字輸入,返回模型回應 | llm.invoke("你好!") |
stream(prompt) |
逐字串流回傳,適合長回應或 UI 即時顯示 | for await (const chunk of llm.stream("寫一段詩")) |
只要把對應的模型客戶端(如 OpenAI, ChatOpenAI, ChatAnthropic)實例化成 LLM,就能在同一段程式碼中自由切換。
2. 多模型混合 (Hybrid) 的概念
在實務上,我們常會 「先用成本低的模型」 產生草稿,再交給 「高品質模型」 進行精煉。例如:
- 使用 Ollama(本地模型)快速生成初稿。
- 把草稿送至 OpenAI GPT‑4 進行語法與事實校正。
LangChain 的 LLMChain、SequentialChain、RouterChain 等組件,使這類工作流程的撰寫如同搭積木般簡潔。
3. 認證與環境設定
不同模型的認證方式各異:
| 模型 | 認證方式 | 常見環境變數 |
|---|---|---|
| OpenAI | API Key | OPENAI_API_KEY |
| Ollama | 本地服務端口 | OLLAMA_HOST(預設 http://localhost:11434) |
| Llama (Meta) | 本地路徑或 API | LLAMA_PATH |
| Gemini | Google Cloud Service Account | GOOGLE_APPLICATION_CREDENTIALS |
| Claude | API Key | ANTHROPIC_API_KEY |
在 LangChain 中,只要在程式開始前正確設定環境變數,框架會自動讀取。
程式碼範例
以下示範 Node.js(使用 langchainjs)整合五種模型,涵蓋 單模型呼叫、串流、混合工作流 三個情境。每段程式碼都附上說明註解,方便初學者快速理解。
1️⃣ 基本單模型呼叫:OpenAI GPT‑4
// 安裝套件:npm install langchain openai
import { ChatOpenAI } from "langchain/chat_models/openai";
// 讀取環境變數(請先在 .env 設定 OPENAI_API_KEY)
const llm = new ChatOpenAI({
modelName: "gpt-4o-mini", // 使用 GPT‑4o Mini,成本較低
temperature: 0.7,
});
async function simpleAsk() {
const response = await llm.invoke("請用繁體中文說明什麼是 LangChain。");
console.log("OpenAI 回應:", response.content);
}
simpleAsk();
要點:
invoke直接回傳AIMessage物件,content為文字回應。
2️⃣ 本地模型呼叫:Ollama (Llama 3)
// 安裝套件:npm install langchain ollama
import { Ollama } from "langchain/llms/ollama";
const ollama = new Ollama({
model: "llama3", // Ollama 內建模型名稱
baseUrl: process.env.OLLAMA_HOST || "http://localhost:11434",
temperature: 0.6,
});
async function localPrompt() {
const result = await ollama.invoke(
"請列出三個適合使用 LLM 的商業案例,並說明其優勢。"
);
console.log("Ollama 回應:", result);
}
localPrompt();
提示:Ollama 需要先在本機安裝並啟動服務,
model必須是已下載的模型名稱。
3️⃣ 串流回傳:Gemini 1.5 Flash
// 安裝套件:npm install @google/generative-ai langchain
import { GoogleGenerativeAI } from "langchain/llms/google";
const gemini = new GoogleGenerativeAI({
modelName: "gemini-1.5-flash",
temperature: 0.5,
});
async function streamAnswer() {
console.log("Gemini 正在思考中…");
for await (const chunk of gemini.stream(
"請用 5 行詩的形式描述 AI 與人類的合作。"
)) {
process.stdout.write(chunk);
}
}
streamAnswer();
說明:
stream會回傳 字串片段,適合在前端即時顯示或建構「打字機」效果。
4️⃣ 多模型混合工作流:先用 Ollama 再用 Claude
// 安裝套件:npm install langchain ollama anthropic
import { Ollama } from "langchain/llms/ollama";
import { ChatAnthropic } from "langchain/chat_models/anthropic";
import { LLMChain } from "langchain/chains";
const localLLM = new Ollama({ model: "llama3", temperature: 0.7 });
const claude = new ChatAnthropic({
modelName: "claude-3-5-sonnet-20240620",
temperature: 0.3,
});
// 第一步:Ollama 產生草稿
const draftChain = new LLMChain({
llm: localLLM,
prompt: (input) => `請根據以下主題寫一段 150 字的說明:${input}`,
});
// 第二步:Claude 精煉
const refineChain = new LLMChain({
llm: claude,
prompt: (draft) => `請把以下文字改寫得更正式且避免任何錯誤:\n${draft}`,
});
async function hybridWorkflow(topic) {
const draft = await draftChain.run(topic);
const refined = await refineChain.run(draft);
console.log("最終結果:", refined);
}
hybridWorkflow("LangChain 在企業內部的知識管理");
關鍵:
LLMChain允許自訂 PromptTemplate,而run會自動把輸入套入模板。透過兩條LLMChain組成 SequentialChain,即可完成「先產生→再精煉」的流程。
5️⃣ 路由選擇模型:根據成本自動切換
// 安裝套件:npm install langchain
import { RouterChain } from "langchain/chains/router";
import { ChatOpenAI } from "langchain/chat_models/openai";
import { Ollama } from "langchain/llms/ollama";
// 兩個模型實例
const gpt = new ChatOpenAI({ modelName: "gpt-4o-mini", temperature: 0.7 });
const local = new Ollama({ model: "llama3", temperature: 0.7 });
// 路由條件:如果輸入長度 > 200 個字,使用本地模型以降低成本
const router = new RouterChain({
routes: [
{
condition: (input) => input.length > 200,
chain: local,
},
{
// 預設路徑
chain: gpt,
},
],
});
async function routedAsk(prompt) {
const answer = await router.run(prompt);
console.log("路由結果:", answer);
}
routedAsk("請幫我寫一段 300 字的技術報告,內容關於 LLM 的安全性與隱私保護。");
說明:
RouterChain讓開發者以 條件函式 動態決定使用哪個 LLM,對於成本控制與延遲優化非常有幫助。
常見陷阱與最佳實踐
| 陷阱 | 說明 | 解決方案 |
|---|---|---|
| API 金鑰外洩 | 把金鑰直接寫在程式碼中,容易被 Git 泄漏。 | 使用 .env 檔案或 Secret Manager,絕不硬編碼。 |
| 模型回應過長導致超時 | 某些模型(尤其是本地模型)在大量文字時回應較慢。 | 設定 maxTokens 或 stop 參數,或使用 串流(stream)降低感知延遲。 |
| 不同模型的輸入/輸出格式不一致 | OpenAI 回傳 AIMessage,Ollama 直接回傳字串。 |
在 LangChain 中使用 BaseMessage 抽象層統一處理,或自行封裝 formatResponse 函式。 |
| 本地模型資源不足 | Ollama、Llama 在 CPU 或 GPU 記憶體不足時會崩潰。 | 先檢查 nvidia-smi 或 htop,必要時縮小模型或使用 量化 (quantization) 版本。 |
| 混合工作流的錯誤傳遞 | 前一步產生的錯誤未被捕獲,導致後續模型收到空字串。 | 使用 try/catch 包裝每個 run,並在失敗時回退至備援模型(如 fallbackLLM)。 |
最佳實踐:
- 統一 Prompt 設計:使用
PromptTemplate,讓所有模型的輸入保持相同結構,方便維護。 - 分層緩存:對於相同的問題,先查
InMemoryCache或 Redis,減少重複呼叫昂貴模型。 - 安全第一:若處理機密文件,優先使用 本地模型(Ollama/Llama)或 Google Gemini 的 VPC 方案。
- 監控與日誌:透過
langchain.callbacks收集 token 使用量、延遲與錯誤,便於成本分析與故障排除。 - 漸進式提升:先用成本低的模型驗證概念,驗證成功後再切換至高階模型,減少不必要的開銷。
實際應用場景
| 場景 | 為何需要多模型 | LangChain 實作要點 |
|---|---|---|
| 客服機器人 | 需要快速回應(Ollama)與高精度解答(OpenAI) | 使用 RouterChain 按問題難度切換模型,並加入 ConversationBufferMemory 保存上下文。 |
| 企業內部文件摘要 | 文件多且保密,不能上傳雲端 | 完全使用 本地 Llama,搭配 RecursiveCharacterTextSplitter 分段,最後用 OpenAI(或 Claude)校正摘要。 |
| 程式碼生成與檢查 | 生成速度與語法正確度同等重要 | 先用 Ollama 產生草稿,使用 Claude 進行安全審核與最佳化。 |
| 多語言翻譯平台 | 部分語言支援度不同,成本需控制 | 使用 Gemini 處理支援度高的語言,對於低支援語言則改用 OpenAI,並利用 LLMChain 結合自訂翻譯提示。 |
| 研究論文寫作助理 | 高精度、引用正確性要求高 | 主體文字使用 Claude,引用與事實驗證交給 OpenAI,最後以 Ollama 產出最終稿的格式化。 |
總結
- LangChain 為 多模型整合 提供了統一的抽象介面與強大的編排工具,讓開發者可以在 成本、速度、隱私 之間自由平衡。
- 本文介紹了 OpenAI、Ollama、Llama、Gemini、Claude 五大主流 LLM,並提供 單模型呼叫、串流、混合工作流、條件路由 四種常見程式碼範例,足以應付大多數實務需求。
- 在實作時,務必注意 金鑰安全、輸出長度控制、資源配置,並善用 PromptTemplate、Cache、Callback 等 LangChain 內建功能,才能打造 可維護、可擴充且成本可控 的 AI 應用。
現在就動手:在你的專案中加入
langchainjs,挑選適合的模型,從最簡單的invoke開始,逐步構建出屬於自己的多模型 AI 工作流吧!祝開發順利 🎉