本文 AI 產出,尚未審核

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) 的概念

在實務上,我們常會 「先用成本低的模型」 產生草稿,再交給 「高品質模型」 進行精煉。例如:

  1. 使用 Ollama(本地模型)快速生成初稿。
  2. 把草稿送至 OpenAI GPT‑4 進行語法與事實校正。

LangChain 的 LLMChainSequentialChainRouterChain 等組件,使這類工作流程的撰寫如同搭積木般簡潔。

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,絕不硬編碼。
模型回應過長導致超時 某些模型(尤其是本地模型)在大量文字時回應較慢。 設定 maxTokensstop 參數,或使用 串流stream)降低感知延遲。
不同模型的輸入/輸出格式不一致 OpenAI 回傳 AIMessage,Ollama 直接回傳字串。 在 LangChain 中使用 BaseMessage 抽象層統一處理,或自行封裝 formatResponse 函式。
本地模型資源不足 Ollama、Llama 在 CPU 或 GPU 記憶體不足時會崩潰。 先檢查 nvidia-smihtop,必要時縮小模型或使用 量化 (quantization) 版本。
混合工作流的錯誤傳遞 前一步產生的錯誤未被捕獲,導致後續模型收到空字串。 使用 try/catch 包裝每個 run,並在失敗時回退至備援模型(如 fallbackLLM)。

最佳實踐

  1. 統一 Prompt 設計:使用 PromptTemplate,讓所有模型的輸入保持相同結構,方便維護。
  2. 分層緩存:對於相同的問題,先查 InMemoryCache 或 Redis,減少重複呼叫昂貴模型。
  3. 安全第一:若處理機密文件,優先使用 本地模型(Ollama/Llama)或 Google Gemini 的 VPC 方案。
  4. 監控與日誌:透過 langchain.callbacks 收集 token 使用量、延遲與錯誤,便於成本分析與故障排除。
  5. 漸進式提升:先用成本低的模型驗證概念,驗證成功後再切換至高階模型,減少不必要的開銷。

實際應用場景

場景 為何需要多模型 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 工作流吧!祝開發順利 🎉