<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>LangChain on YennJ12 Engineering Blog</title><link>https://yennj12.js.org/yennj12_blog_V4/tags/langchain/</link><description>Recent content in LangChain on YennJ12 Engineering Blog</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Tue, 30 Jun 2026 13:30:00 +0800</lastBuildDate><atom:link href="https://yennj12.js.org/yennj12_blog_V4/tags/langchain/feed.xml" rel="self" type="application/rss+xml"/><item><title>RAG 完全指南（三）：進階檢索技術——混合搜尋、HyDE、Multi-Query、Reranker</title><link>https://yennj12.js.org/yennj12_blog_V4/posts/rag-series-part3-advanced-retrieval-zh/</link><pubDate>Mon, 18 May 2026 09:00:00 +0800</pubDate><guid>https://yennj12.js.org/yennj12_blog_V4/posts/rag-series-part3-advanced-retrieval-zh/</guid><description>前言 Naive RAG 的核心問題：搜尋品質決定了答案品質。
一個常見的現象是，明明知識庫裡有答案，但因為使用者的問題措辭跟文件不同，向量搜尋就找不到。或者，找到的 Top-5 結果裡，真正相關的其實排在第 4 位，LLM 因此被無關資訊干擾。
這篇介紹四個能顯著提升搜尋品質的技術。
技術 1：混合搜尋（Hybrid Search） 核心問題 純向量搜尋（Semantic Search）擅長找「語意相近」的內容，但對精確術語、專有名詞、縮寫效果差。
問題：「GPT-4o 的 context window 是多少？」 純向量搜尋找到：「大型語言模型通常有輸入長度限制...」（語意相近但沒答案） BM25 關鍵字搜尋找到：「GPT-4o 支援 128K token 的 context window」（精確命中） 混合搜尋 = 語意搜尋 + 關鍵字搜尋，兩者結果用 RRF 或加權融合。
BM25 簡介 BM25 是 TF-IDF 的改進版，計算關鍵字與文件的相關度：
Score(D, Q) = Σ IDF(qi) * (tf(qi, D) * (k1 + 1)) / (tf(qi, D) + k1 * (1 - b + b * |D| / avgdl)) 不需要理解公式，只需知道：BM25 對精確詞彙匹配非常靈敏。</description></item><item><title>Knowledge Graph 知識圖譜（四）：結合 LLM — GraphRAG 與多跳推理</title><link>https://yennj12.js.org/yennj12_blog_V4/posts/knowledge-graph-part4-llm-graphrag-zh/</link><pubDate>Mon, 29 Jun 2026 12:00:00 +0800</pubDate><guid>https://yennj12.js.org/yennj12_blog_V4/posts/knowledge-graph-part4-llm-graphrag-zh/</guid><description>大多數人遇到 RAG 答不準，第一反應是換更強的 embedding 模型。 正確答案是：多跳問題的瓶頸不在召回相似度，而在缺少「關係結構」。 大多數人以為知識圖譜和 LLM 是兩個世界。 正確答案是：LLM 負責語言理解，知識圖譜負責事實與推理，合起來才完整。
接續前文 Part 3 我們確立了「知識圖譜與向量庫互補」。這一篇把它落地到 LLM 系統：解釋 GraphRAG 為什麼出現、它如何運作、以及用 LangChain + Neo4j 寫出可跑的程式碼。
一、核心問題：純向量 RAG 在哪裡失敗？ 標準 RAG（Retrieval-Augmented Generation）流程是：把文件切塊（chunk）→ 算 embedding → 存向量庫 → 查詢時找最相似的塊 → 塞進 prompt。這對「事實型單跳問題」很有效，但有兩個致命弱點：
弱點一：多跳推理（multi-hop）
問題：「全面啟動的配樂家，還為哪位導演的哪部片配過樂？」
純向量 RAG 的困境： Query embedding ──▶ 找最相似的塊 │ ▼ 只會召回「提到全面啟動配樂」的段落 但「配樂家 → 其他作品 → 那部片的導演」這條關係鏈 分散在不同文件、不同塊裡，相似度檢索串不起來 ✗ 向量檢索本質是「單跳相似」。它無法沿著「實體 A → 關係 → 實體 B → 關係 → 實體 C」的鏈條走，因為這需要的是結構，不是相似度。</description></item><item><title>RAG 完全指南（四）：查詢轉換、Self-RAG 與 Context 壓縮</title><link>https://yennj12.js.org/yennj12_blog_V4/posts/rag-series-part4-optimization-zh/</link><pubDate>Tue, 19 May 2026 09:00:00 +0800</pubDate><guid>https://yennj12.js.org/yennj12_blog_V4/posts/rag-series-part4-optimization-zh/</guid><description>前言 前兩篇解決了「搜尋」的問題。這篇要解決兩個更深層的問題：
問題本身就難以直接搜尋：複雜問題需要先轉換或拆解 Context 品質不夠純粹：塞給 LLM 的資訊裡有太多噪音 這裡介紹三個技術：Step-Back Prompting（退一步提問）、Self-RAG（自我反思 RAG）、Context Compression（上下文壓縮）。
技術 1：查詢轉換（Query Transformation） 問題：複雜問題無法直接搜尋 有些問題不適合直接拿來做向量搜尋：
❌ 直接搜尋困難的問題類型： 「為什麼我們公司的 API 最近變慢了？」 → 問題太具體，知識庫不可能有這個答案 「除了 Redis，還有哪些快取方案？」 → 包含否定條件，搜尋容易找到 Redis 的文章 「比較 PostgreSQL 和 MySQL 的優缺點，然後說明哪個適合我們的場景」 → 多個子問題，一次搜尋無法全部覆蓋 Step-Back Prompting（退一步提問） 核心思想：先把具體問題「退一步」抽象化，搜尋更通用的背景知識，再回答具體問題。
具體問題：「Estrogen 會影響 BRCA1 的 transcription 嗎？」 退一步：「BRCA1 基因的調控機制是什麼？」 → 先搜尋通用知識，再回答具體問題 1import openai 2 3client = openai.OpenAI(api_key=&amp;#34;your-api-key&amp;#34;) 4 5 6def step_back_query(original_query: str) -&amp;gt; str: 7 &amp;#34;&amp;#34;&amp;#34;生成一個比原始問題更抽象的退一步問題&amp;#34;&amp;#34;&amp;#34; 8 prompt = f&amp;#34;&amp;#34;&amp;#34;你是一個搜尋查詢優化助手。 9將以下具體問題「退一步」，改寫成一個更通用、更基本的問題， 10這個更通用的問題可以幫助找到回答原始問題所需的背景知識。 11 12具體問題：{original_query} 13 14更通用的退一步問題（只輸出問題，不要解釋）：&amp;#34;&amp;#34;&amp;#34; 15 16 response = client.</description></item><item><title>Knowledge Graph 知識圖譜（五）：實戰 — 用 LLM 自動建構知識圖譜並做問答</title><link>https://yennj12.js.org/yennj12_blog_V4/posts/knowledge-graph-part5-end-to-end-project-zh/</link><pubDate>Mon, 29 Jun 2026 13:00:00 +0800</pubDate><guid>https://yennj12.js.org/yennj12_blog_V4/posts/knowledge-graph-part5-end-to-end-project-zh/</guid><description>大多數人學完知識圖譜，卡在「我的文件那麼多，難道要手動建圖？」 正確答案是：在 LLM 時代，抽取交給模型，你只需設計好流程與驗收。 大多數 demo 跑得起來，上線就垮。 正確答案是：把建圖、查詢、校驗拆成可演進的三個階段（POC → MVP → Scale）。
這是系列的最後一塊拼圖 前四篇我們學了概念（Part 1）、建構管線（Part 2）、技術比較（Part 3）、與 LLM 結合（Part 4）。這一篇把它們串成一個端到端、可實際執行的專案：
目標：丟進一批純文字文件 → LLM 自動抽成知識圖譜 → 存進 Neo4j → 用自然語言問答。
一、整體架構：四個階段 ┌─────────────┐ ┌──────────────┐ ┌─────────────┐ ┌──────────────┐ │ 1. 文件載入 │─▶│ 2. LLM 抽取 │─▶│ 3. 寫入 Neo4j │─▶│ 4. GraphRAG │ │ 切塊 │ │ 三元組 + 消歧 │ │ MERGE 去重 │ │ 自然語言問答 │ └─────────────┘ └──────────────┘ └─────────────┘ └──────────────┘ Part 2 Part 2+4 Part 2 Part 4 我們會用：Python、LangChain、langchain-experimental 的 LLMGraphTransformer（把文件直接轉成圖文件）、Neo4j。</description></item><item><title>AI 工程從零開始｜Phase 13 Part 2：AI 工作流程編排 — LangChain、LlamaIndex 與生產管線</title><link>https://yennj12.js.org/yennj12_blog_V4/posts/ai-eng-from-scratch-phase13-part2-orchestration-zh/</link><pubDate>Sun, 21 Jun 2026 22:00:00 +0800</pubDate><guid>https://yennj12.js.org/yennj12_blog_V4/posts/ai-eng-from-scratch-phase13-part2-orchestration-zh/</guid><description>大多數人第一次接觸 LLM 應用，寫的是一個 openai.chat() 呼叫。 但到了生產環境，你需要的是：步驟間傳遞上下文、錯誤自動重試、中間結果快取、非同步平行執行。 單次呼叫處理不了這些；你需要的是一條管線，而不是一個函式。 本文從框架比較到生產監控，完整解析 AI 工作流程編排的每一個決策點。
面試情境：你的團隊要上線一個 RAG 客服機器人，需要：查詢改寫 → 向量檢索 → 文件重排序 → 生成答案 → 品質過濾。QA 反映目前有 15% 的查詢因為某一步失敗而整條管線崩潰。架構師問你：如何設計這個管線的錯誤處理策略，以及你會選哪個編排框架？請解釋你的技術決策。
一、核心問題：單次 LLM 呼叫為什麼不夠 1.1 真實 AI 應用的複雜度 想像你在構建一個智慧文件問答系統。用戶問：「上個季度我們在亞太區的收入是多少？」
一個 openai.chat() 能回答嗎？不行。你需要：
查詢理解：識別出「上個季度」和「亞太區」是關鍵限定詞 查詢改寫：展開成「Q3 2025 Asia Pacific revenue」等多個搜尋變體 向量檢索：從數千份財報文件中找出相關段落 重排序：用 Cross-Encoder 重新對候選段落評分 上下文組裝：把最相關的段落和對話歷史組成 Prompt 生成：呼叫 LLM 生成答案 品質驗證：確認答案有引用來源，沒有幻覺 這是 7 個步驟、至少 4 個外部服務呼叫、數個狀態轉換。這就是工作流程編排要解決的問題。
1.2 沒有編排框架時的痛點 痛點 具體表現 影響 錯誤傳播 步驟 3 失敗 → 整條管線崩潰 15–30% 請求失敗率 重複程式碼 每個專案重寫 retry / logging 開發速度 -40% 測試困難 無法對單一步驟做單元測試 Bug 定位時間 3× 無可觀測性 不知道哪個步驟慢 P95 延遲難以優化 狀態管理 中間結果存在記憶體，重啟即失 長任務無法恢復 1.</description></item><item><title>Langfuse 入門 Part 2 — 三行程式碼開始追蹤:SDK 整合與 Tracing 實戰</title><link>https://yennj12.js.org/yennj12_blog_V4/posts/langfuse-intro-part2-tracing-sdk-zh/</link><pubDate>Tue, 30 Jun 2026 13:30:00 +0800</pubDate><guid>https://yennj12.js.org/yennj12_blog_V4/posts/langfuse-intro-part2-tracing-sdk-zh/</guid><description>可觀測性最大的阻力,從來不是「值不值得」,而是「要改多少程式碼」。 Langfuse 的設計哲學是:讓你從「完全沒追蹤」到「完整 trace」,只需要加幾行——甚至一行。 這篇就帶你把第一個 trace 送上儀表板。
一、起手式:安裝與設定 Part 1 講完概念,這篇全是實作。先裝套件、設好金鑰。
1pip install langfuse 到 Langfuse Cloud(免費)或你自架的實例,建一個專案,拿到一組金鑰,放進環境變數:
1LANGFUSE_PUBLIC_KEY=&amp;#34;pk-lf-...&amp;#34; 2LANGFUSE_SECRET_KEY=&amp;#34;sk-lf-...&amp;#34; 3LANGFUSE_BASE_URL=&amp;#34;https://cloud.langfuse.com&amp;#34; # 自架的話填你的網址 SDK 會自動讀這些環境變數,所以程式裡通常不必硬寫金鑰。接下來有三種接法,由淺入深。
二、接法一:@observe 裝飾器(最省力) 最快的方式:在你想追蹤的函式上加一個 @observe() 裝飾器。它會自動把這個函式變成一個 observation,捕捉輸入、輸出、執行時間。
1from langfuse import observe, get_client 2 3@observe() 4def retrieve_docs(query: str) -&amp;gt; list[str]: 5 # 你的檢索邏輯 6 return [&amp;#34;doc1&amp;#34;, &amp;#34;doc2&amp;#34;] 7 8@observe() 9def generate_answer(query: str, docs: list[str]) -&amp;gt; str: 10 # 你的生成邏輯 11 return &amp;#34;答案...&amp;#34; 12 13@observe() # 最外層 → 這會是一個 Trace 14def handle_request(query: str) -&amp;gt; str: 15 docs = retrieve_docs(query) # 巢狀的 Observation 16 answer = generate_answer(query, docs) 17 return answer 18 19handle_request(&amp;#34;分析這份財報的風險&amp;#34;) 關鍵在於:巢狀的函式呼叫會自動形成巢狀的 observation 樹。 你不需要手動串接 parent/child——handle_request 成為 trace,裡面的 retrieve_docs 和 generate_answer 自動成為它的子 observation。這正是 Part 1 講的那棵樹,而你只加了三個裝飾器。</description></item><item><title>LangGraph + AI 後端實戰：構建智能客服工單處理系統</title><link>https://yennj12.js.org/yennj12_blog_V4/posts/langgraph-ai-customer-ticket-system-zh/</link><pubDate>Sat, 11 Apr 2026 10:00:00 +0800</pubDate><guid>https://yennj12.js.org/yennj12_blog_V4/posts/langgraph-ai-customer-ticket-system-zh/</guid><description>詳細講解如何使用 LangGraph 和 AI 構建生產級的智能客服工單處理系統，涵蓋架構設計、Agent 定義、狀態管理、錯誤處理和實際案例，幫助你快速上線 AI 驅動的客服系統。</description></item><item><title>LangGraph + LangChain 完全入門指南：從基礎到生產</title><link>https://yennj12.js.org/yennj12_blog_V4/posts/langgraph-langchain-intro-zh/</link><pubDate>Sat, 11 Apr 2026 10:00:00 +0800</pubDate><guid>https://yennj12.js.org/yennj12_blog_V4/posts/langgraph-langchain-intro-zh/</guid><description>全面介紹 LangChain 和 LangGraph 的核心概念、架構和實戰應用，涵蓋從簡單的 Chain 到複雜的多 Agent 工作流，幫助開發者快速掌握現代 AI 應用開發框架。</description></item><item><title>Building Multi-Agent Orchestration Systems with Claude Code</title><link>https://yennj12.js.org/yennj12_blog_V4/posts/orchestration-agents-claude-code-comprehensive-guide/</link><pubDate>Sun, 21 Dec 2025 10:00:00 +0000</pubDate><guid>https://yennj12.js.org/yennj12_blog_V4/posts/orchestration-agents-claude-code-comprehensive-guide/</guid><description>Comprehensive guide to building multi-agent orchestration systems with Claude Code - learn to coordinate specialized AI agents for complex software development workflows, from architecture design to implementation.</description></item></channel></rss>