[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"article-build-code-aware-rag-pipeline-langchain-zh":3,"article-related-build-code-aware-rag-pipeline-langchain-zh":31,"series-ai-agent-b8b8e12b-0e01-4204-bc59-eddef030606d":80},{"id":4,"slug":5,"title":6,"content":7,"summary":8,"source":9,"source_url":10,"author":11,"image_url":12,"cover_image":12,"category":13,"language":14,"translated_content":11,"related_article_id":15,"keywords":16,"key_takeaways":23,"views":27,"created_at":28,"published_at":29,"topic_cluster_id":30},"b8b8e12b-0e01-4204-bc59-eddef030606d","build-code-aware-rag-pipeline-langchain-zh","建立具程式感知的 RAG 管線","\u003Cp data-speakable=\"summary\">這篇教你用 \u003Ca href=\"\u002Ftag\u002Flangchain\">LangChain\u003C\u002Fa> 建立能讀取 Python 與 Markdown 檔案的程式感知 \u003Ca href=\"\u002Ftag\u002Frag\">RAG\u003C\u002Fa> 管線，完成分段、向量索引與檢索問答。\u003C\u002Fp>\u003Cp>這篇給想把專案文件、程式碼與說明文件一起做檢索問答的開發者。你照著做完，會得到一條可運作的 LangChain RAG 流程，能載入檔案、依 \u003Ca href=\"\u002Ftag\u002Ftoken\">token\u003C\u002Fa> 切塊、建立向量索引，並用你的文件回答問題。\u003C\u002Fp>\u003Cp>如果你手上有 \u003Ca href=\"\u002Ftag\u002Fapi\">API\u003C\u002Fa> key、一些 .py 與 .md 檔案，這份操作指南可以\u003Ca href=\"\u002Fnews\u002Febay-mcp-ai-assistants-ebay-sell-apis-zh\">直接\u003C\u002Fa>照做到底。每一步都會產出一個具名成果，方便你逐段驗收，不會只停在概念說明。\u003C\u002Fp>\u003Ch2>開始之前\u003C\u002Fh2>\u003Cul>\u003Cli>Python 3.10+\u003C\u002Fli>\u003Cli>LangChain 套件可安裝的開發環境\u003C\u002Fli>\u003Cli>OpenAI、Anthropic 或其他相容的 LLM API key\u003C\u002Fli>\u003Cli>同一供應商的 embeddings API key，或本機 embeddings 模型\u003C\u002Fli>\u003Cli>一組包含 .py 與 .md 的測試文件\u003C\u002Fli>\u003Cli>Git 已安裝，可用來抓取範例專案或自己的文件庫\u003C\u002Fli>\u003C\u002Ful>\u003Ch2>Step 1: 安裝 LangChain 套件\u003C\u002Fh2>\u003Cp>目的：先把專案\u003Ca href=\"\u002Fnews\u002Fblackwell-wins-agentic-ai-infrastructure-benchmark-zh\">需要\u003C\u002Fa>的核心套件裝好，讓後續能載入檔案、切塊、做向量化與檢索。\u003C\u002Fp>\n\u003Cfigure class=\"my-6\">\u003Cimg src=\"https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1781811179856-7o5s.png\" alt=\"建立具程式感知的 RAG 管線\" class=\"rounded-xl w-full\" loading=\"lazy\" \u002F>\u003C\u002Ffigure>\n\u003Cpre>\u003Ccode>pip install langchain langchain-community langchain-text-splitters langchain-openai faiss-cpu tiktoken\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>具名產出：\u003Cstrong>LangChain \u003Ca href=\"\u002Fnews\u002Fclaude-corps-ai-training-into-jobs-zh\">工作\u003C\u002Fa>環境\u003C\u002Fstrong>。驗收時，你應該看到安裝完成且沒有錯誤，執行 \u003Ccode>python -c \"import langchain\"\u003C\u002Fcode> 也能正常通過。\u003C\u002Fp>\u003Ch2>Step 2: 載入 Python 與 Markdown 檔案\u003C\u002Fh2>\u003Cp>目的：把原始文件轉成 LangChain 可處理的文件物件，讓程式碼與說明文字都能進入檢索流程。\u003C\u002Fp>\n\u003Cfigure class=\"my-6\">\u003Cimg src=\"https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1781811178834-96z6.png\" alt=\"建立具程式感知的 RAG 管線\" class=\"rounded-xl w-full\" loading=\"lazy\" \u002F>\u003C\u002Ffigure>\n\u003Cpre>\u003Ccode>from langchain_community.document_loaders import DirectoryLoader, TextLoader\u003C\u002Fcode>\u003C\u002Fpre>\u003Cpre>\u003Ccode>py_loader = DirectoryLoader(\".\u002Fdocs\", glob=\"**\u002F*.py\", loader_cls=TextLoader)\nmd_loader = DirectoryLoader(\".\u002Fdocs\", glob=\"**\u002F*.md\", loader_cls=TextLoader)\n\npython_docs = py_loader.load()\nmarkdown_docs = md_loader.load()\nall_docs = python_docs + markdown_docs\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>具名產出：\u003Cstrong>原始文件清單\u003C\u002Fstrong>。你應該看到非空的文件陣列，而且每個文件都帶有來自原始檔案的內容。\u003C\u002Fp>\u003Ch2>Step 3: 依 token 切分文件\u003C\u002Fh2>\u003Cp>目的：用 token 感知的方式切塊，避免把函式、段落或設定說明切得太碎，讓模型更容易理解上下文。\u003C\u002Fp>\u003Cpre>\u003Ccode>from langchain_text_splitters import RecursiveCharacterTextSplitter\n\nsplitter = RecursiveCharacterTextSplitter.from_tiktoken_encoder(\n    chunk_size=800,\n    chunk_overlap=120,\n)\nchunks = splitter.split_documents(all_docs)\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>具名產出：\u003Cstrong>Token 切塊集合\u003C\u002Fstrong>。你應該看到切塊數量多於原始檔案數，而且每塊大小接近你的 token 目標，不會在函式中段或段落中段亂斷。\u003C\u002Fp>\u003Ch2>Step 4: 建立向量索引\u003C\u002Fh2>\u003Cp>目的：把切塊轉成 embeddings，存進可檢索的向量資料庫，讓語意搜尋可以找到最相關的內容。\u003C\u002Fp>\u003Cpre>\u003Ccode>from langchain_openai import OpenAIEmbeddings\nfrom langchain_community.vectorstores import FAISS\n\nembeddings = OpenAIEmbeddings()\nvectorstore = FAISS.from_documents(chunks, embeddings)\nretriever = vectorstore.as_retriever(search_kwargs={\"k\": 4})\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>具名產出：\u003Cstrong>FAISS 向量索引\u003C\u002Fstrong>。驗收時，你應該看到索引建立成功，並且對一個測試查詢呼叫 retriever 時，能回傳前幾個最相關的切塊。\u003C\u002Fp>\u003Ch2>Step 5: 接上檢索問答鏈\u003C\u002Fh2>\u003Cp>目的：把檢索結果交給模型生成答案，讓回答盡量引用你自己的文件，而不是只給泛泛而談的內容。\u003C\u002Fp>\u003Cpre>\u003Ccode>from langchain_openai import ChatOpenAI\nfrom langchain.chains import RetrievalQA\n\nllm = ChatOpenAI(model=\"gpt-4o-mini\", temperature=0)\nqa = RetrievalQA.from_chain_type(llm=llm, retriever=retriever)\n\nresult = qa.invoke({\"query\": \"這個程式庫主要做什麼？\"})\nprint(result[\"result\"])\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>具名產出：\u003Cstrong>RAG 問答鏈\u003C\u002Fstrong>。你應該看到答案明確參照你的文件內容，而不是只有通用型回覆，且檢索到的上下文要和問題對得上。\u003C\u002Fp>\u003Ch2>Step 6: 驗證切塊品質與檢索結果\u003C\u002Fh2>\u003Cp>目的：確認程式感知切分與 token 切塊，真的有提升程式碼問題的回答品質。\u003C\u002Fp>\u003Cp>請用幾個有針對性的提問測試，例如函式名稱、安裝步驟、架構說明，然後比對檢索到的切塊和最後答案。如果模型漏掉重點，就把 chunk size 調小、把 overlap 調大，或加入檔案類型與路徑的 metadata 篩選。\u003C\u002Fp>\u003Cp>具名產出：\u003Cstrong>檢索品質報告\u003C\u002Fstrong>。你應該看到程式碼與文件問題的答案更精準，碎片化片段變少，排進前幾名的內容也更相關。\u003C\u002Fp>\u003Ctable>\u003Cthead>\u003Ctr>\u003Cth>指標\u003C\u002Fth>\u003Cth>基準／優化前\u003C\u002Fth>\u003Cth>結果／優化後\u003C\u002Fth>\u003C\u002Ftr>\u003C\u002Fthead>\u003Ctbody>\u003Ctr>\u003Ctd>切分方式\u003C\u002Ftd>\u003Ctd>以字元為主\u003C\u002Ftd>\u003Ctd>以 token 為主\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>程式碼完整性\u003C\u002Ftd>\u003Ctd>函式與區塊可能被切斷\u003C\u002Ftd>\u003Ctd>切分更接近語法邊界\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>檢索品質\u003C\u002Ftd>\u003Ctd>上下文較雜\u003C\u002Ftd>\u003Ctd>前幾個切塊更相關\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>答案依據性\u003C\u002Ftd>\u003Ctd>較容易出現泛化回答\u003C\u002Ftd>\u003Ctd>更常回到文件內容\u003C\u002Ftd>\u003C\u002Ftr>\u003C\u002Ftbody>\u003C\u002Ftable>\u003Ch2>常見錯誤\u003C\u002Fh2>\u003Cul>\u003Cli>拿字元切分直接處理程式碼。修法：改用 token 感知切分器，並依函式長度調整 chunk size。\u003C\u002Fli>\u003Cli>單一切塊塞太多內容。修法：降低 chunk size，並增加 overlap，讓檢索回來的上下文更聚焦。\u003C\u002Fli>\u003Cli>沒有先檢查檢索來源。修法：先印出 top-k 切塊，再讓模型生成答案，確認上下文真的對題。\u003C\u002Fli>\u003C\u002Ful>\u003Ch2>接下來可以看什麼\u003C\u002Fh2>\u003Cp>這條管線跑通後，下一步可以加上 metadata 篩選、來源引用、向量庫持久化與評估測試，讓你的文件量變大時，仍能持續量化檢索品質。\u003C\u002Fp>","這篇教你用 LangChain 建立能讀取 Python 與 Markdown 檔案的程式感知 RAG 管線，完成分段、向量索引與檢索問答。","www.datacamp.com","https:\u002F\u002Fwww.datacamp.com\u002Fcourses\u002Fretrieval-augmented-generation-rag-with-langchain",null,"https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1781811179856-7o5s.png","ai-agent","zh","e7be4c51-f2a0-44fb-b829-c5f2c0edb102",[17,18,19,20,21,22],"LangChain","RAG","FAISS","Python","向量索引","token 切分",[24,25,26],"先把文件轉成可檢索的文件物件，再做 token 感知切塊。","用 FAISS 建立向量索引後，先驗證檢索結果再接生成模型。","加入 metadata 與切塊調參，可以明顯改善程式碼類問題的回答品質。",0,"2026-06-18T19:32:32.253731+00:00","2026-06-18T19:32:32.248+00:00","e3b68196-9e64-4c18-a3b6-a73e73bfb367",{"tags":32,"relatedLang":39,"relatedPosts":43},[33,35,37],{"name":20,"slug":34},"python",{"name":18,"slug":36},"rag",{"name":17,"slug":38},"langchain",{"id":15,"slug":40,"title":41,"language":42},"build-code-aware-rag-pipeline-langchain-en","Build a code-aware RAG pipeline with LangChain","en",[44,50,56,62,68,74],{"id":45,"slug":46,"title":47,"cover_image":48,"image_url":48,"created_at":49,"category":13},"9fc5b17b-77e0-442f-b40d-6c5d0c74a980","glm-5-vibe-coding-agentic-engineering-zh","GLM-5 把 vibe coding 變工程","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1781853513619-0z11.png","2026-06-19T07:18:09.421228+00:00",{"id":51,"slug":52,"title":53,"cover_image":54,"image_url":54,"created_at":55,"category":13},"61971c57-482e-4e7f-a79b-c3b304239065","kimi-k2-6-turns-agents-into-a-swarm-zh","Kimi K2.6 把 agent 變成群體","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1781824691370-pud4.png","2026-06-18T23:17:47.818057+00:00",{"id":57,"slug":58,"title":59,"cover_image":60,"image_url":60,"created_at":61,"category":13},"4a0bdcd2-abcf-48a6-8cbb-38b6df8edf2d","lightrag-simple-defaults-beat-rag-complexity-zh","LightRAG 證明圖譜 RAG 需要更簡單的預設，而不是更複雜","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1781812063993-vynr.png","2026-06-18T19:47:20.378166+00:00",{"id":63,"slug":64,"title":65,"cover_image":66,"image_url":66,"created_at":67,"category":13},"d27aa04b-7cd2-4a94-a7fd-1c1ce6874728","ebay-mcp-ai-assistants-ebay-sell-apis-zh","ebay-mcp 讓 AI 直接操控 eBay Sell API","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1781809379605-oslg.png","2026-06-18T19:02:33.226473+00:00",{"id":69,"slug":70,"title":71,"cover_image":72,"image_url":72,"created_at":73,"category":13},"becd8e42-53b8-4250-8989-d3c8f60ea909","github-last30days-skill-ai-research-model-zh","GitHub 的 last30days skill 才是 AI 研究的正確模型","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1781752672625-a8f4.png","2026-06-18T03:17:22.68358+00:00",{"id":75,"slug":76,"title":77,"cover_image":78,"image_url":78,"created_at":79,"category":13},"1459a665-b180-487b-b15b-65c046c6392c","tcs-anthropic-enterprise-ai-partnership-zh","TCS 和 Anthropic 企業 AI 合作成形","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1781713081888-ob2e.png","2026-06-17T16:17:35.294583+00:00",[81,86,91,96,101,106,111,116,121,126],{"id":82,"slug":83,"title":84,"created_at":85},"4ae1e197-1d3d-4233-8733-eafe9cb6438b","claude-now-uses-your-pc-to-finish-tasks-zh","Claude 開始幫你操作電腦","2026-03-26T07:20:48.457387+00:00",{"id":87,"slug":88,"title":89,"created_at":90},"5bede67f-e21c-413d-9ab8-54a3c3d26227","googles-2026-ai-agent-report-decoded-zh","Google 2026 AI Agent 報告解讀","2026-03-26T11:15:22.651956+00:00",{"id":92,"slug":93,"title":94,"created_at":95},"2987d097-563f-46c7-b76f-b558d8ef7c2b","kimi-k25-review-stronger-still-not-legend-zh","Kimi K2.5 評測：更強，但還不是神作","2026-03-27T07:15:55.277513+00:00",{"id":97,"slug":98,"title":99,"created_at":100},"95c9053b-e3f4-4cb5-aace-5c54f4c9e044","claude-code-controls-mac-desktop-zh","Claude Code 也能操控 Mac 了","2026-03-28T03:01:58.58121+00:00",{"id":102,"slug":103,"title":104,"created_at":105},"dc58e153-e3a8-4c06-9b96-1aa64eabbf5f","cloudflare-100x-faster-ai-agent-sandbox-zh","Cloudflare 的 AI 沙箱跑超快","2026-03-28T03:09:44.142236+00:00",{"id":107,"slug":108,"title":109,"created_at":110},"1c8afc56-253f-47a2-979f-1065ff072f2a","openai-backs-isara-agent-swarm-bet-zh","OpenAI 挺 Isara 的 agent swarm …","2026-03-28T03:15:27.513155+00:00",{"id":112,"slug":113,"title":114,"created_at":115},"7379b422-576e-45df-ad5a-d57a0d9dd467","openai-plan-automated-ai-researcher-zh","OpenAI 想做自動化 AI 研究員","2026-03-28T03:17:42.090548+00:00",{"id":117,"slug":118,"title":119,"created_at":120},"48c9889e-86df-450b-a356-e4a4b7c83c5b","harness-engineering-ai-agent-reliability-2026-zh","駕馭工程：從「馬具」到「作業系統」，AI Agent 可靠性的終極密碼","2026-03-31T06:42:53.556721+00:00",{"id":122,"slug":123,"title":124,"created_at":125},"96d8e8c8-1edd-475d-9145-b1e7a1b02b65","mcp-explained-from-prompts-to-production-zh","MCP 怎麼把提示詞變工作流","2026-04-01T09:24:39.321274+00:00",{"id":127,"slug":128,"title":129,"created_at":130},"f2ca7720-b471-4ce5-9336-2a9ac2a876fd","amazon-bedrock-agents-multi-agent-workflows-zh","Amazon Bedrock Agents 進入多代理工作流","2026-04-01T09:30:29.945429+00:00"]