2025年5月25日 星期日

LangChain 框架介紹:打造 AI Agent 智慧助理

沒有留言:
 

LangChain 是一個開源框架,讓你可以更方便地構建基於大型語言模型(LLMs)的應用程式,加速建構 AI Agent 的工作流程,那我們就開始吧!



🌐 LangChain 是什麼?


LangChain 是一個開源框架,讓你可以更方便地構建基於大型語言模型(LLMs)的應用程式。

它能幫你整合 prompt 模版、LLM記憶功能、串接外部感知工具、資料檢索與代理人(Agents),讓 LLM 從單純來回回答問題進化為解決任務的智慧系統,也提供非常好用的 Python 套件,方便你快速建構與整合語言模型和資料應用。

透過 LangChain,你也能理解一個「以 LLM 為中心」的應用程式,幫助你調度 LLM 相關的模組與組件,加速建構語言模型的工作流程。



🧩 LangChain 能做什麼?


  • 智慧問答系統(像 ChatGPT 但能讀懂你家的資料):就像幫你公司的資料裝上 ChatGPT,讓它能讀懂內部文件或資料庫後再回答問題。

  • RAG(檢索增強生成):它會在回答問題前,先去查資料再講話,不是自己亂編,讓回答更可信。

  • 自動修改 GitHub 程式碼:你只要告訴它「幫我把這段程式碼改成什麼功能」,它就會去讀懂你的程式碼然後動手修改。

  • 聊天機器人 / 客服系統:可以建立一個像真人一樣的客服,記得客戶之前問過什麼,也會從資料裡找答案來回答。

  • 自動摘要 / 報告工具:幫你把一堆資料濃縮成重點摘要,像是自動幫你寫週報、會議紀錄。



🔧 核心元件一覽


元件說明
PromptTemplate定義輸入模板,提高重用性與一致性。
白話:把你想問的話套進格式,像填空題幫模型理解你的指令
LLM封裝語言模型如 OpenAI、Ollama、Anthropic 等。
白話:大腦負責思考與回應的主體
Chains串連任務步驟(例:輸入 → 推論 → 輸出)。
白話:把好幾個步驟排成一條線,自動按順序執行
Memory對話記憶,保留上下文資訊。
白話:幫模型「記住你剛剛說過什麼」,讓它有對話記憶
Tools可呼叫外部功能,如瀏覽器、資料庫、Python 腳本等。
白話:讓模型能「動手做事」,像上網查資料、跑程式等
Agents能自主判斷任務並選用適合的 Tool 執行。
白話:像一個會自己決定要用什麼工具來完成任務的 AI 經理人
Retrievers用於檢索向量資料庫或文件內容,配合 RAG 模型。
白話:幫模型「翻找資料」的助手,能從文件中找到答案



⚙️ 安裝與快速上手


要開始使用 LangChain,建議安裝以下四個核心套件:

pip install langchain
pip install langchain-core
pip install langchain-openai
pip install langchain-community

這些模組負責不同的核心功能:

  • langchain:主要框架本體

  • langchain-core:核心結構模組

  • langchain-openai:串接 OpenAI 模型用

  • langchain-community:整合其他常見工具與外部服務



延伸閱讀與官方資源:



🤖 LangChain Agent 實例:建立程式碼助理


這個範例展示了 LangChain 如何快速串接 LLM + 工具 + 推理模式,來建立一個「能聽懂任務 → 執行分析 → 回應結果」的簡單 AI Pipeline 資料處理應用。

以下是一個使用 LangChain 架設「程式碼助理」的範例,可以根據輸入自動解釋或修改程式碼:

import os
from langchain.agents import initialize_agent, Tool
from langchain.agents.agent_types import AgentType
from langchain_community.llms import OpenAI

# 設定 API 金鑰
os.environ["OPENAI_API_KEY"] = "你的 API 金鑰"

# 初始化 LLM
llm = OpenAI(temperature=0.3)

# 🔧 定義兩個工具:解釋程式碼、修改程式碼

def explain_code_tool(input_text: str) -> str:
    prompt = f"""
你是一位資深工程師,請用簡單、清楚的方式解釋下面這段程式碼的用途與邏輯。
請盡量用中文、舉例說明,讓初學者也看得懂。

程式碼如下:
{input_text}
"""
    return llm.invoke(prompt)

def modify_code_tool(input_text: str) -> str:
    prompt = f"""
你是一個專業程式開發者,請依照以下修改規格(spec)來修改指定程式碼。
只輸出修改後的程式碼,不要附帶說明。

【修改規格】
- 將 logging level 改為 "error"
- 加入 "debug": false 這個設定

【原始程式碼】
{input_text}
"""
    return llm.invoke(prompt)

# 包裝成 Tool
explain_tool = Tool(
    name="CodeExplainer",
    func=explain_code_tool,
    description="提供簡單易懂的程式碼解釋,支援 Python / JSON / SQL"
)

modify_tool = Tool(
    name="CodeModifier",
    func=modify_code_tool,
    description="依照規格修改程式碼,輸出更新後版本"
)

# ✅ 初始化 Agent
agent = initialize_agent(
    tools=[explain_tool, modify_tool],
    llm=llm,
    agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
    max_iterations=15,
    verbose=True
)

# 🧪 測試輸入
query = """
幫我解釋這段程式碼在做什麼:

def greet(name):
    return f"Hello, {name}!"
"""

# 🧠 執行 Agent
result = agent.run(query)
print("\n🧠 解釋結果:\n", result)



🌍 使用自定義 OpenAI Base URL


若你是使用代理服務(如自架的 API 或 LM Studio / LocalAI),可以這樣指定 base URL:

from langchain.chat_models import ChatOpenAI
from langchain.prompts import ChatPromptTemplate
from langchain.chains import LLMChain

# 設定你自定義的 OpenAI 服務 base url 和 key
OPENAI_API_KEY = "你的 API 金鑰"
OPENAI_API_BASE = "https://你的-base-url.com/v1"

# 初始化 ChatOpenAI 模型,指定 base url
llm = ChatOpenAI(
    temperature=0.7,
    openai_api_key=OPENAI_API_KEY,
    openai_api_base=OPENAI_API_BASE,
    model_name="gpt-3.5-turbo",  # 替換成你服務支援的模型名稱
)

# 設計 prompt template
prompt = ChatPromptTemplate.from_template("請用繁體中文回覆:你對 {topic} 有什麼看法?")

# 建立 Chain
chain = LLMChain(llm=llm, prompt=prompt)

# 測試輸入
response = chain.run("程式開發與日常生活的關聯")

print(response)

📌 注意:

  • openai_api_base 請加上 /v1

  • model_name 請對應你的自訂服務支援的模型名稱

  • 若用非 Chat 模型(如 text-davinci-003),請改用 langchain.llms.OpenAI



🔍 檢索增強生成(RAG)範例

from langchain.document_loaders import PyPDFLoader
from langchain.vectorstores import FAISS
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.chains import RetrievalQA

loader = PyPDFLoader("你的文件.pdf")
docs = loader.load()

vector_db = FAISS.from_documents(docs, OpenAIEmbeddings())
retriever = vector_db.as_retriever()

qa = RetrievalQA.from_chain_type(llm=llm, retriever=retriever)
qa.run("這份文件的主要內容是什麼?")



🤖 OpenAI 原生 SDK vs LangChain:差異比較


LangChain 並不是模型執行引擎,而是「語言模型調度與工作流框架」,會呼叫模型執行引擎 package 的接口。以下是它與 OpenAI 原生 SDK 在開發體驗與功能支援上的比較:

📌 建議:

  • 想快速測試 LLM 回應 → 用 OpenAI 原生 SDK 較簡單

  • 想構建具規模的 AI 應用或複雜工作流程 → 用 LangChain 更有效率

項目OpenAI 原生 SDK (openai package)LangChain 框架
用途定位直接存取 OpenAI API,低階控制高階框架,幫你整合 prompt、記憶體、檢索與工具
語法風格精簡直接,自己控制所有流程模組化、可組合性強,適合建構複雜應用
Prompt 處理你需自行組字串提供 PromptTemplate 等管理機制
多步驟任務手動串接使用 Chain 自動串接處理流程
外部工具自行串接 API 或函式可透過 ToolsAgents 自動整合使用
記憶體與上下文需自己處理上下文儲存與回傳Memory 模組自動維護對話歷史
適合場景簡單 LLM 呼叫、寫小工具、debug構建長流程、複雜交互任務、智慧代理系統



⚠️ LangChain 的常見缺點與開發者反饋


在使用 LangChain 的時候,可以根據應用程式的需求與開發階段,衡量它是否適合你目前遇到的場景。

下面是一些大家開發上遇到 LangChain 常見的缺點:

  1. 限制靈活性,難以實現複雜需求
    當你需要實作更動態的 AI 代理人架構(例如:動態調整工具、管理多代理互動),LangChain 的高層抽象有時反而會卡手,必須繞過框架才能完成。

  2. 性能開銷與依賴繁多
    它的模組化設計雖然靈活,但也會引入額外的性能負擔,加上外部套件繁多,有時系統變得複雜又難維護。

  3. 不適合所有應用場景
    如果你只是要做一個簡單的 LLM 呼叫或小工具,直接用 openai SDK、httpx 或其他輕量方案可能反而更省力。


[用心去感覺] vibe coding 治百病?

  1. LangChain 在你初次導入 LLM 的時候非常棒!它像是一張地圖,它會帶你理解 prompt、memory、retriever、agent 等每個重要模組的角色與組合方式。

  2. 當然,就像用傳統 STL pipeline 一樣,即使用 vide coding 寫 LangChain,一樣有時候會卡到,一樣很煩人 ... 🫖



結語:找到適合的場景打造 AI Agent 吧!


LangChain 是一個專為構建 AI 工作流與應用而設計的工具框架,不只是「用 LLM 回答問題」,而是幫助你搭起完整的 AI 系統。

你可以從簡單的任務開始,比如解釋或修改程式碼,也可以整合公司內部的 PDF、資料庫、Markdown、Notion 等各種資料,打造出屬於你的智慧問答系統。

若你要處理更複雜的流程,LangChain 也能與 n8n 等自動化工具結合,讓 AI 不只思考,還能「動起來」自動執行任務——像是從 Notion 擷取資訊 → 整理 → 傳送到 Slack,全流程都能自動化。

無論你是工程師、分析師,或只是想讓工作更聰明地自動完成,LangChain 提供了靈活且強大的架構,大家一起來發揮吧!keep going 🚀



沒有留言:

張貼留言

技術提供:Blogger.