🦜 為什麼需要框架?
直接呼叫 API 可以做很多事,但當你需要把多個步驟串起來,框架能幫你省下大量開發時間。
💡 一句話理解 LangChain / LlamaIndex = AI 開發的 Express.js / Django。 你可以手寫 HTTP server,但用框架更快更穩。
何時用框架 vs 直接呼叫 API
| 場景 | 建議 |
|---|---|
| 單次對話、簡單問答 | 直接用 API |
| 多步驟 Chain(先分析 → 再摘要 → 再翻譯) | ✅ 用框架 |
| RAG 系統 | ✅ 用框架 |
| AI Agent(使用多種工具) | ✅ 用框架 |
| 對話記憶管理 | ✅ 用框架 |
| 需要最大控制力和最小依賴 | 直接用 API |
🆚 LangChain vs LlamaIndex
| 面向 | LangChain | LlamaIndex |
|---|---|---|
| 定位 | 通用 AI 應用框架 | 資料索引 + RAG 框架 |
| 強項 | Agent、Chain、工具整合 | 資料載入、索引、檢索 |
| 學習曲線 | ⭐⭐⭐(較陡) | ⭐⭐(較平) |
| 彈性 | 極高(什麼都能做) | 高(RAG 場景極強) |
| 社群 | 最大 | 次大 |
| 適合 | 多種 AI 應用 | 專注 RAG 和知識問答 |
💡 簡單選法 做 RAG/知識問答 → LlamaIndex(更簡單、更專注) 做 Agent/複雜工作流 → LangChain / LangGraph(更彈性) 兩者可以混用——LlamaIndex 做索引,LangChain 做 Agent
🔗 LangChain 實戰
安裝
pip install langchain langchain-openai langchain-community
基礎 Chain(串接多個步驟)
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
# 建立 LLM
llm = ChatOpenAI(model="gpt-4o", temperature=0.7)
# 定義 Prompt 模板
prompt = ChatPromptTemplate.from_messages([
("system", "你是一位資深的 {expertise} 專家。用繁體中文回答。"),
("user", "{question}")
])
# 建立 Chain:Prompt → LLM → 解析輸出
chain = prompt | llm | StrOutputParser()
# 執行
result = chain.invoke({
"expertise": "AI 工程",
"question": "RAG 和 Fine-tuning 怎麼選?"
})
print(result)
多步 Chain(先分析 → 再摘要)
# Chain 1:分析文章
analyze_prompt = ChatPromptTemplate.from_template(
"分析以下文章的重點和論述邏輯:\n\n{article}"
)
analyze_chain = analyze_prompt | llm | StrOutputParser()
# Chain 2:根據分析結果生成摘要
summarize_prompt = ChatPromptTemplate.from_template(
"根據以下分析,寫一段 100 字的摘要:\n\n{analysis}"
)
summarize_chain = summarize_prompt | llm | StrOutputParser()
# 串接:分析 → 摘要
full_chain = (
analyze_chain
| (lambda analysis: {"analysis": analysis})
| summarize_chain
)
result = full_chain.invoke({"article": "你的長文章..."})
RAG Chain
from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import Chroma
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_core.runnables import RunnablePassthrough
# 1. 建立向量資料庫
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=500, chunk_overlap=50
)
# 載入文件並切割
docs = text_splitter.split_text(your_document)
vectorstore = Chroma.from_texts(docs, embeddings)
retriever = vectorstore.as_retriever(search_kwargs={"k": 3})
# 2. RAG Prompt
rag_prompt = ChatPromptTemplate.from_template("""
根據以下參考資料回答問題。如果資料中沒有相關資訊,請說「我沒有找到相關資訊」。
參考資料:
{context}
問題:{question}
""")
# 3. 建立 RAG Chain
rag_chain = (
{"context": retriever, "question": RunnablePassthrough()}
| rag_prompt
| llm
| StrOutputParser()
)
# 4. 使用
answer = rag_chain.invoke("怎麼退貨?")
🦙 LlamaIndex 實戰
安裝
pip install llama-index llama-index-llms-openai llama-index-embeddings-openai
最簡 RAG(5 行搞定)
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
# 1. 載入資料夾中的所有文件(PDF、TXT、Markdown…)
documents = SimpleDirectoryReader("./data").load_data()
# 2. 建立索引(自動切割、Embedding、存入向量 DB)
index = VectorStoreIndex.from_documents(documents)
# 3. 開始問答
query_engine = index.as_query_engine()
response = query_engine.query("公司的退貨政策是什麼?")
print(response)
進階:自訂 RAG 參數
from llama_index.core import Settings
from llama_index.llms.openai import OpenAI
from llama_index.embeddings.openai import OpenAIEmbedding
from llama_index.core.node_parser import SentenceSplitter
# 自訂全域設定
Settings.llm = OpenAI(model="gpt-4o", temperature=0)
Settings.embed_model = OpenAIEmbedding(model="text-embedding-3-small")
Settings.node_parser = SentenceSplitter(chunk_size=512, chunk_overlap=50)
# 建立索引
index = VectorStoreIndex.from_documents(documents)
# 自訂查詢(取 top-5 相關段落)
query_engine = index.as_query_engine(similarity_top_k=5)
response = query_engine.query("怎麼退貨?")
# 查看檢索到的段落
for node in response.source_nodes:
print(f"相似度: {node.score:.3f}")
print(f"內容: {node.text[:100]}...")
🤖 LangGraph:建 Agent
LangGraph 是 LangChain 團隊專為 AI Agent 設計的框架。
from langgraph.prebuilt import create_react_agent
from langchain_openai import ChatOpenAI
from langchain_community.tools import TavilySearchResults
from langchain_core.tools import tool
# 自訂工具
@tool
def calculate(expression: str) -> str:
"""計算數學表達式。輸入數學算式,回傳計算結果。"""
try:
return str(eval(expression))
except:
return "計算錯誤"
# 建立 Agent(帶搜尋和計算工具)
agent = create_react_agent(
ChatOpenAI(model="gpt-4o"),
tools=[TavilySearchResults(max_results=3), calculate],
)
# Agent 會自主決定要用哪個工具
result = agent.invoke({
"messages": [{
"role": "user",
"content": "台積電目前股價是多少?如果我買 10 張,要花多少錢?"
}]
})
# Agent 會:1. 搜尋股價 2. 用計算器算出總金額
⚠️ 常見 Anti-Pattern
| Anti-Pattern | 問題 | 正確做法 |
|---|---|---|
| LangChain 包一切 | 簡單任務也用框架,增加複雜度 | 簡單場景直接用 API |
| 不看中間結果 | 鏈很長但不知道哪步出錯 | 加 verbose=True 除錯 |
| 忽略版本差異 | LangChain 更新很快,舊教學可能不適用 | 鎖定版本、看官方文檔 |
| 全用預設設定 | Chunk size、top_k 用預設值 | 用你的資料測試最佳參數 |
❓ FAQ
LangChain 和 LlamaIndex 可以一起用嗎?
可以!常見搭配:LlamaIndex 負責資料載入和索引建構,LangChain 負責 Agent 邏輯和工具整合。兩者有官方整合,可以互相傳遞資料。
LangChain 的學習曲線很陡嗎?
是的,LangChain 的概念較多(Chain, Agent, Tool, Memory, Retriever…)。建議學習順序:1) 先學 API 直接呼叫 2) 再學基礎 Chain 3) 再學 RAG Chain 4) 最後學 Agent。
有比 LangChain 更簡單的替代品嗎?
有。LlamaIndex 更簡單(如果你只做 RAG)。Haystack 也是不錯的替代品。如果只需要 Agent,LangGraph 或 CrewAI 更專注。如果需求很簡單,直接用 API 搭配自己的程式碼可能最好。