限時公開

【🧠 LLM智能應用系列 - LangChain 入門】使用Gemini打造客服FAQ AI助手

更新 發佈閱讀 16 分鐘

從 Chain、Memory 到實戰案例,快速上手免費 LLM

我們在「🤖 用 RAG + Multi-Agent + Docker 打造會自己協作的智能文件助理」有說明我們如何用AI框架來實際開發一套AI應用, 但該篇文章屬於比較整合性的專案, 對於需要漸進式學習的朋友來說會比較發散一些, 因此我們這一系列的文章主要是針對每一個元件進行詳細的說明, 並搭配實際案例, 確保您的訂閱是有效的, 這是我們的初衷,也是我們的使命, 就讓我們一起學習這些AI技術框架及架構, 成為軟體領域中的引領者, 跟上科技的浪潮,提升自我的競爭力。

🎯 本篇學習目標

• 理解 LangChain 核心概念:Chain、Memory、Tools。

• 建立第一個「客服 / FAQ 助手」。

• 使用免費 Gemini 作為 LLM 來源。

• 打造更加聰明的LLM, Agent自行推論使用的工具外掛。


❓ 為什麼要用 LangChain + Gemini

• LangChain: AI 應用的組件化設計,能夠把LLM、記憶、工具整合成可執行流程。

• Gemini: 提供免費的LLM,支援中文, 適合個人開發者或者小型專案。

💡 核心概念

raw-image


• LLM: 語言生成模型,負責回應用戶問題, 可設定溫度控制回應創意。

• Chain: 將多步操作組合成流程, 如: 檢索FAQ → 生成問答。

• Memory: 保留上下文, 多輪對話。

• Tools: 外掛, API呼叫、檔案讀取…等。


環境準備

我們會使用python進行練習, 環境上我們也期望用正規的開發方式, 減少您系統上依賴的衝突, 因此我們會建議使用conda + venv的方式來進行開發。

• conda: 建議可以安裝 miniconda

• venv: 主要隔離安裝套件, 避免影響到全域。

• gemini API Key:https://aistudio.google.com/apikey

腳本大致上如下:

# 建立一個名為 chatbot-env 的新 conda 環境,並指定 Python 版本
conda create -n chatbot-env python=3.13.7

# 啟動 conda 環境
conda activate chatbot-env

# 在專案根目錄建立一個名為 .venv 的虛擬環境
python -m venv .venv

# 啟動虛擬環境
# Windows
.venv\Scripts\activate

# macOS/Linux
source .venv/bin/activate

實戰小範例 1:單輪對話客服助手

讓您學會如何記憶LLM的對話,用以模擬FAQ問答。

目錄結構

|- .env.example               # Gemini API Key的環境變數配置
|- main.py # 範例程式碼
|- requirements.txt # 依賴套件

安裝套件(requirements.txt):

langchain==0.3.27
langchain-google-genai==2.1.12
python-dotenv==1.1.1
pip install -r requirements.txt

設定API金鑰

請至「https://aistudio.google.com/apikey」申請API Key金鑰, 並將專案目錄結構底下的 .env.example 改成 .env,試著將「YOUR_API_KEY」替換成申請的金鑰。

# 將 "YOUR_API_KEY" 替換為您真實的 Google API 金鑰
GOOGLE_API_KEY="YOUR_API_KEY"

範例程式

raw-image
import os

from dotenv import load_dotenv
from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.chat_history import InMemoryChatMessageHistory
from langchain_core.runnables import RunnableWithMessageHistory
from langchain_google_genai import ChatGoogleGenerativeAI

# 載入 .env 檔案中的環境變數
load_dotenv()

print('程式已載入環境變數,請取消以下註解並完成您的程式碼。')

# --- 1. 設定模型 ---
# 請確認您已在 .env 檔案中設定您的 GOOGLE_API_KEY
google_api_key = os.environ.get('GOOGLE_API_KEY')
llm = ChatGoogleGenerativeAI(
model='gemini-2.5-flash-lite', google_api_key=google_api_key
)

# --- 2. 建立prompt ---
prompt = ChatPromptTemplate.from_messages(
[
('system', '你是一位客服專員,回答要簡短且禮貌。'),
# 在模板中插入了一個名為 history 的佔位符,
# 這個佔位符將在對話歷史中插入之前的訊息。
MessagesPlaceholder(variable_name='history'),
('human', '{input}'),
]
)

# --- 3. 建立對話記憶,可以有很多user ---
memory_store = {}

def get_memory(session_id: str):
if session_id not in memory_store:
memory_store[session_id] = InMemoryChatMessageHistory()
return memory_store[session_id]

# --- 4. 串接 Prompt + LLM + Memory ---
conversation = RunnableWithMessageHistory(
runnable=prompt | llm,
get_session_history=get_memory,
input_messages_key='input',
history_messages_key='history',
)

# --- 5. 開始對話 ---
print('客服 FAQ AI 助手啟動,輸入 \'exit\' 離開')
session_id = 'user1'
while True:
query = input('客戶問題:')
if query.lower() == 'exit':
break
result = conversation.invoke(
{'input': query}, config={'configurable': {'session_id': session_id}}
)
print('AI 回答:' + result.content)


這邊我們實際對話之後可以發現我們打造的AI客服已經具備基礎的記憶功能了!

raw-image


實戰小範例 2:FAQ 文件檢索助手(簡單Tools補充外部知識)

讓您學會如何使用額外工具擴充LLM知識。

目錄結構

|- .env.example               # Gemini API Key的環境變數配置
|- main.py # 範例程式碼
|- requirements.txt # 依賴套件
|- faq.txt # FAQ知識庫


🔹 FAQ 文件範例 (faq.txt)

客服時間:週一至週五 09:00-18:00
退貨方式:7天內聯絡客服並提供訂單號碼
配送區域:僅限台灣本島

範例程式

raw-image
import os

from dotenv import load_dotenv
from langchain_core.chat_history import InMemoryChatMessageHistory
from langchain_core.messages import HumanMessage
from langchain_core.tools import tool
from langchain_google_genai import ChatGoogleGenerativeAI

# 載入 .env 檔案中的環境變數
load_dotenv()

print('程式已載入環境變數,請取消以下註解並完成您的程式碼。')

# ========== 步驟 1: 建立工具(Tool)==========
# 使用 @tool 裝飾器,將普通函數變成 LLM 可以呼叫的工具
@tool
def search_faq(query: str) -> str:
"""搜尋公司 FAQ 資料庫。當客戶詢問客服時間、退貨、配送等問題時使用。

Args:
query: 客戶的問題

Returns:
FAQ 資料庫內容
"""
faq_path = os.path.join(os.path.dirname(__file__), 'faq.txt')
with open(faq_path, 'r', encoding='utf-8') as f:
return f.read()

# ========== 步驟 2: 設定 LLM ==========
google_api_key = os.environ.get('GOOGLE_API_KEY')
llm = ChatGoogleGenerativeAI(
model='gemini-2.5-flash-lite', google_api_key=google_api_key
)

# ========== 步驟 3: 綁定工具到 LLM ==========
# 直接把工具綁定到 LLM,不需要 Agent!
tools = [search_faq]
llm_with_tools = llm.bind_tools(tools)

# ========== 步驟 4: 建立記憶功能 ==========
memory_store = {}

def get_memory(session_id: str):
"""取得或建立使用者的對話記憶"""
if session_id not in memory_store:
memory_store[session_id] = InMemoryChatMessageHistory()
return memory_store[session_id]

# ========== 步驟 5: 開始對話 ==========
print('客服 FAQ AI 助手啟動,輸入 "exit" 離開')
print('註:使用 bind_tools 方式,LLM 會決定是否呼叫工具\n')

session_id = 'user1'
memory = get_memory(session_id)

while True:
query = input('客戶問題:')
if query.lower() == 'exit':
break

# 建立包含歷史對話的訊息列表
messages = list(memory.messages) + [HumanMessage(content=query)]

# 第一次呼叫:LLM 決定是否需要工具
response = llm_with_tools.invoke(messages)

# 檢查 LLM 是否想呼叫工具
if response.tool_calls:
print(f'\n[LLM 決定呼叫工具: {response.tool_calls[0]["name"]}]')

# 手動執行工具
tool_result = search_faq.invoke(response.tool_calls[0]['args'])
print(f'[工具回傳內容長度: {len(tool_result)} 字元]\n')

# 第二次呼叫:簡化方式,直接用工具結果回答
final_prompt = (
f'你是客服專員。根據以下 FAQ 資料,用簡短禮貌的方式回答客戶的問題。\n\n'
f'FAQ 資料:\n{tool_result}\n\n'
f'客戶問題:{query}\n\n'
f'請用繁體中文簡短回答:'
)
final_response = llm.invoke(final_prompt)
print('AI 回答:' + final_response.content)

# 儲存對話到記憶
memory.add_user_message(query)
memory.add_ai_message(final_response.content)
else:
# LLM 認為不需要工具,直接回答
print('AI 回答:' + response.content)

# 儲存對話到記憶
memory.add_user_message(query)
memory.add_ai_message(response.content)

這邊我們來實際對話, 除了既有的記憶功能之外, 當我們詢問到「退貨」時, LLM精確的根據我們提供的faq.txt問答題目來進行回答。

raw-image

📌 小結

• 案例一:單輪客服 FAQ,專注 LangChain 核心操作。

• 案例二:加入 Tools 查 FAQ 文件,體驗實戰應用。

• 系列文章後續可進一步做 RAG、多 Agent、外部知識整合。

透過這兩個案例, 讓我們學習到LangChain的Chain、Memory、Tools, 也讓我們對於市面上LLM Agent系統具備基礎的認識了,雖然仍無法很智能完成我們的複雜業務場景任務, 不過沒關係,下一個章節我們會帶您打造更加智能的AI助手, 讓我們更深入的掌握LangChain的重要功能吧!


留言
avatar-img
留言分享你的想法!
avatar-img
阿Han的沙龍
143會員
309內容數
哈囉,我是阿Han,是一位 👩‍💻 軟體研發工程師,喜歡閱讀、學習、撰寫文章及教學,擅長以圖代文,化繁為簡,除了幫助自己釐清思路之外,也希望藉由圖解的方式幫助大家共同學習,甚至手把手帶您設計出高品質的軟體產品。