回到頂部

🦜 LangChain / LlamaIndex 實戰

AI 應用開發框架完全指南——Chain、Agent、Memory、RAG 一次搞懂。

🦜 為什麼需要框架?

直接呼叫 API 可以做很多事,但當你需要把多個步驟串起來,框架能幫你省下大量開發時間。

💡 一句話理解 LangChain / LlamaIndex = AI 開發的 Express.js / Django。 你可以手寫 HTTP server,但用框架更快更穩。

何時用框架 vs 直接呼叫 API

場景建議
單次對話、簡單問答直接用 API
多步驟 Chain(先分析 → 再摘要 → 再翻譯)✅ 用框架
RAG 系統✅ 用框架
AI Agent(使用多種工具)✅ 用框架
對話記憶管理✅ 用框架
需要最大控制力和最小依賴直接用 API

🆚 LangChain vs LlamaIndex

面向LangChainLlamaIndex
定位通用 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 搭配自己的程式碼可能最好。

📚 延伸閱讀