AI Agent 開發特訓營:短期實現智能自動化
在企業追求數位轉型的當下,智能 Agent 已成為提升營運效率的關鍵技術。本次特訓營專注於 AI Agent 開發,迅速帶您掌握從 LLM 到自動化 Agent 的完整技術,幫助企業打造真正能解決實際
內容簡介
作者介紹
適合人群
你將會學到什麼
購買須知
-
第一章節 LLM背後的架構 -transformer
介紹transformer歷史與架構
-
課程大綱
生成式AI實戰精修班:從理論到企業級應用 為什麼應該要學 LLM based AI Agent Application? 🚀 為什麼你應該學 LLM-Based AI Agent?— 迎接 AI 變革時代! 隨著 GPT-4、Claude 3、Gemini 1.5 等大語言模型(LLM)的快速發展,AI Agent(智能代理) 已經不只是個概念,而是正在顛覆 商業應用、軟體開發、知識管理、決策支持 等領域。 你是否還停留在傳統的 AI 思維? 👉 傳統 AI 主要透過 規則、特定演算法、固定流程 來解決問題,但這樣的系統通常很難靈活適應新的環境。 👉 LLM-Based AI Agent 則能夠自主學習、適應不同場景,並且透過「類人思維」來執行複雜任務,成為真正的 智能助手。 🔍 那麼,為什麼你應該學習 LLM-Based AI Agent 建構? 讓我們從幾個核心優勢來分析: 1️⃣ LLM-Based AI Agent vs. 傳統 AI:優勢在哪裡? 傳統 AI 🏛 LLM-Based AI Agent 🚀 學習成本 需要大量標註數據、特定演算法訓練 LLM 已經訓練好,可以直接透過 Prompt Engineering 和微調來適應不同任務 適應能力 只能解決特定問題,變化時需重新開發 可根據不同情境快速調整,能夠處理多種任務 推理能力 依賴明確規則與結構化數據 可透過 Chain-of-Thought、Tree-of-Thoughts 進行類人推理 時間成本 需要花費大量時間設計特定規則 能夠快速迭代、優化任務執行策略 迭代速度 每次修改都需要重新訓練模型 透過 Prompt 設計或 API 調整,即時變更行為 應用場景 主要用於特定領域(如影像辨識、推薦系統) 廣泛應用於客服、數據分析、軟體開發、決策支持等領域 開發工具 需使用 TensorFlow、PyTorch 等框架 可直接使用 LangChain、LlamaIndex、AutoGPT、LangGraph 等工具 總結來說,LLM-Based AI Agent 提供了更靈活、更智慧、更高效的解決方案,並且能夠幫助開發者 大幅降低 AI 系統開發成本。 2️⃣ 為什麼現在就是學習 AI Agent 最好的時機? ✅ 市場需求爆炸式增長:企業正大規模採用 AI 來提升生產力,AI Agent 需求激增。 ✅ 技術門檻下降:過去你可能需要懂深度學習,但現在透過 LangChain、LlamaIndex、AutoGPT,你已經可以輕鬆建構 AI Agent。 ✅ 超強個人生產力提升:你可以訓練一個 AI 代理人來幫你處理日常任務,如自動回覆郵件、寫程式、分析數據等。 ✅ 開放生態系統發展迅速:Hugging Face、OpenAI API、Anthropic API 等提供現成的 LLM,可以直接用來開發 AI Agent。 如果你現在開始學習,你將站在這場 AI 革命的最前線! 3️⃣ 你需要掌握哪些工具來建構 AI Agent? 🔹 LangChain - 最流行的 AI Agent 框架,幫助 LLM 連接不同數據來源、記憶、決策。 🔹 LlamaIndex - 最適合用來做 RAG(檢索增強生成),提升 AI 的查詢與回應能力。 🔹 AutoGPT / BabyAGI - 讓 AI 自己決定接下來要做什麼,打造完全自主的 AI Agent。 🔹 LangGraph - 用於構建多代理系統(Multi-Agent),能夠讓多個 AI 協作完成複雜任務。 🔹 FastAPI + OpenAI API - 如果你要把 AI Agent 部署成 Web 服務,這是最簡單的方式。 🔹 Vector Databases(如 Qdrant, Pinecone, Weaviate) - 幫助 AI 記住長期資訊,提升回應準確性。 這些工具的結合,將讓你 快速開發、測試、部署 AI Agent,並將它應用到 真實世界的問題中。 4️⃣ LLM-Based AI Agent 的核心應用場景 🔹 智慧客服:建立 AI 客服,24/7 回答客戶問題,減少人力成本。 🔹 AI 自動化工作流:讓 AI 代理人幫助你處理數據分析、文件整理、報告生成等工作。 🔹 AI 研究助手:讓 AI 幫你總結論文、提取關鍵資訊,提高研究效率。 🔹 金融分析 & 投資決策:讓 AI 幫你分析市場趨勢、推薦投資機會。 🔹 軟體開發 & 代碼生成:透過 AI 幫助撰寫、優化程式碼,大幅提升開發效率。 🔹 AI 自主決策系統:如 AI 交易系統、AI 招聘助手、AI 產品推薦引擎。 這些應用正在快速滲透各個行業,早學習早受益! 🚀 如何開始你的 AI Agent 學習之旅? 1️⃣ 掌握 LLM 基礎(學習 Prompt Engineering, OpenAI API, Hugging Face) 2️⃣ 學習 AI Agent 框架(LangChain、LlamaIndex、AutoGPT、LangGraph) 3️⃣ 動手實作 AI Agent(從簡單的聊天機器人開始,再進階到 RAG 或多代理系統) 4️⃣ 應用到真實專案(搭建一個幫助你提高生產力的 AI 助理,或優化企業流程) 5️⃣ 持續關注技術發展(AI 進步極快,時刻學習新技術,保持競爭力!) 📢 結論:現在開始學習,未來就是你的! 🌟 LLM-Based AI Agent 是人工智慧領域最具變革性的技術之一,它正在徹底改變我們與 AI 的互動方式。 🌟 現在學習這項技術,將讓你在未來的 AI 就業市場中立於不敗之地! 🌟 不管是提升個人生產力,還是打造智能企業解決方案,AI Agent 都是未來趨勢,你不能錯過! 👉 立即開始學習!讓 AI 代理人成為你的超級助理,讓你在這場 AI 革命中領先一步! 🚀 預計30小時密集課程,打造您的AI技術核心競爭力 課程大綱 Day 1:LLM基礎與RAG入門 Hour 1: LLM基礎架構與原理 LLM發展史 Transformer架構詳解 模型評估與優化 Hour 2: Prompt Engineering進階技術 基礎提示技術 Chain-of-Thought設計 提示優化技巧 Hour 3: RAG基礎與實作 RAG基礎概念 文檔處理與索引 基礎檢索策略 Day 2:RAG進階技術實戰 Hour 4: 進階檢索技術 HyDE技術詳解 Fusion檢索策略 自適應檢索 Hour 5: 上下文優化與壓縮 上下文增強技術 壓縮技術 分塊策略優化 Hour 6: 可靠性與可解釋性 可靠性增強 重排序機制 可解釋性分析 Day 3:AI Agent系統開發 Hour 7: 基礎Agent架構與開發 Agent基礎框架 記憶增強機制 自我提升機制 Hour 8: 專業領域Agent開發 學術任務Agent 客服支援Agent 數據分析Agent Hour 9: 多Agent協作系統 協作系統架構 團隊協作案例 特殊應用場景 Day 4:自動化數據獲取與處理 Hour 10: FireCrawl爬蟲框架 FireCrawl基礎架構 高級爬蟲策略 數據存儲優化 Hour 11: 智能數據處理 Jina框架整合 LlamaIndex集成 重排序機制 Hour 12: 特殊數據源處理 YouTube數據獲取 電商數據處理 自動化搜索系統 Day 5:企業級應用整合 Hour 13: 企業級智能助理系統 災害管理系統 智能商業助手 內容智能 Hour 14: 創意內容生成 智能寫作系統 視覺創意生成 播客內容製作 Hour 15: 企業應用整合 項目管理系統 銷售分析系統 系統監控與分析 課程亮點總結:為什麼選擇這門課? 🚀 從0到企業級應用的完整旅程 5天密集課程,從LLM基礎到企業級應用的全方位培訓 每個概念都配備實戰代碼,確保學以致用 完整項目實戰,建立個人作品集 💡 最新技術棧整合 整合RAG、Agent、爬蟲等熱門技術 使用業界領先框架:LangGraph、LlamaIndex、Jina 實戰企業級應用開發 🛠️ 實用性極強的技能培養 15個真實場景應用開發 50+實戰練習和案例分析 完整的代碼庫和開發文檔 🌟 差異化競爭優勢 獨特的多Agent協作系統開發經驗 企業級應用架構設計能力 自動化數據處理完整解決方案 📈 職業發展加速器 掌握AI領域最搶手的技能組合 建立個人技術競爭力 對接企業實際需求 💪 強大的學習支持 詳細的課程講義和代碼示例 實戰項目指導 技術問題解答 🎯 適合人群 想要轉型AI開發的工程師 需要提升技術棧的AI從業者 希望掌握企業級AI應用開發的技術主管 立即加入我們,開啟您的AI技術進階之旅!在這個AI快速發展的時代,讓我們一起構建下一代智能應用,創造無限可能!
-
LLM基礎架構與原理-Transformer架構
深入探討大型語言模型(LLM):解碼AI語言的未來 在人工智慧(AI)領域,大型語言模型(Large Language Models,LLM)正引領著一場語言理解與生成的革命。這些模型透過深度學習技術,特別是基於Transformer架構的神經網路,展現了前所未有的語言處理能力。本文將深入探討LLM的核心技術、發展歷程、應用場景,以及面臨的挑戰。 什麼是大型語言模型(LLM)? 大型語言模型是透過在海量文本資料上訓練而成的深度學習模型,旨在理解、生成和推理人類語言。它們能夠自動產生連貫且有意義的文本,回答問題,進行機器翻譯,甚至創作詩歌和故事。這些能力使得LLM在自然語言處理(NLP)領域中扮演著關鍵角色。 LLM的關鍵技術:Transformer架構 Transformer架構是LLM的核心技術之一。由Vaswani等人在2017年提出的Transformer模型,透過自注意力機制(Self-Attention Mechanism),有效地捕捉文本中不同詞彙之間的關聯性。這使得模型能夠理解長距離的語境依賴,並提高訓練效率。 代表性的大型語言模型 GPT系列(Generative Pre-trained Transformer) 由OpenAI開發的GPT系列模型,特別是GPT-3,以其強大的文本生成能力而聞名。GPT-3擁有1750億個參數,能夠在少量範例甚至無範例的情況下完成各種語言任務,如寫作、問答和程式碼生成。 Reference :https://baijiahao.baidu.com/s?id=1784331347640868625 說到多少個參數就想提到一點(補充): “”“ 是的,現在許多 80B(80 billion parameters)級別的模型 在性能上都超越了 GPT-3(175B)。這主要是因為模型架構、訓練數據、推理優化、激活稀疏性等技術的進步,使得較小的模型能夠達到甚至超越更大模型的表現。 為什麼 80B 級別模型能比 GPT-3(175B)強? 1. 更高品質的數據: • 訓練數據的過濾、去重與清理,使模型能夠在相對較小的參數規模下學習到更有效的知識。 • 混合專家模型(MoE, Mixture of Experts) 技術能夠讓模型專注於不同的領域,提高推理效率。 2. 更好的架構設計: • 例如 DeepMind 的 Chinchilla(70B)和 Google DeepMind 的 Gemini 1.5 Pro(80B MoE),在設計上優於 GPT-3,實現更好的效能。 • SFT(Supervised Fine-Tuning)與 RLHF(Reinforcement Learning from Human Feedback) 的改進,使得新一代 80B 級別模型在對話、推理和專業知識方面更強。 3. 計算優化: • 更高效的注意力機制(FlashAttention、Grouped Query Attention) 使得 80B 級別模型能夠在計算資源相對有限的情況下達到更好的推理效能。 • 例如 Mistral 7B 和 Mixtral 8x7B(MoE, 80B 激活 12B) 在某些 NLP 任務上已經比 GPT-3 更強。 4. 更好的對齊(Alignment): • GPT-4、Claude 3、Gemini 1.5、Mistral 系列 等模型都採用了更強的對齊技術,使得他們在推理、長文本處理和常識問答上遠超 GPT-3。 目前比 GPT-3(175B)更強的 80B 級別模型 模型名稱參數量特點與優勢Claude 3 Opus約 >100B(未知)在大多數基準測試上超越 GPT-4Gemini 1.5 Pro80B MoE(激活 16B)超強的長上下文能力(>1M tokens)Mistral 8x7B80B(激活 12B)主要用於高效推理,優化對話性能DeepSeek V267B訓練數據更廣泛,在多語言和編程任務上表現出色GPT-4 Turbo?(未公開)效能優化,推理速度比 GPT-4 更快且強 總結 「大 ≠ 強」,GPT-3 雖然參數多達 175B,但訓練技術相對落後。而現今的 80B 級別 模型透過 更優的架構、更好的數據、更強的計算優化,在推理、對話、寫作、程式碼等任務上已經全面超越 GPT-3。 未來的趨勢很可能是: • 小而精的模型(如 7B、13B、30B) 透過 MoE 或知識壓縮,達到與 GPT-3 同等甚至更強的表現。 • 大而強的模型(如 Claude 3、GPT-5、Gemini 2) 持續提升推理能力,進入 AGI 階段。 所以 一個「精調過的 80B」已經能打敗 GPT-3(175B),而現今的 GPT-4、Claude 3 這些「超大模型」更是遠遠超越 GPT-3! ”“” BERT系列(Bidirectional Encoder Representations from Transformers) Google推出的BERT模型專注於語言理解任務。與GPT不同,BERT採用雙向訓練方式,同時考慮上下文資訊,對於問答系統和文本分類等任務表現出色。 此處應插入BERT模型架構圖,強調其雙向編碼器和遮罩語言模型的訓練方式。 BERT 的關鍵技術 遮罩語言模型(Masked Language Model, MLM) 訓練時隨機遮罩(Mask)部分單詞,讓模型學會根據上下文預測被遮擋的詞。 下一句預測(Next Sentence Prediction, NSP) 訓練時提供兩個句子,讓模型判斷它們是否相鄰,幫助學習句子間的關聯。 這些技術使 BERT 在 問答系統、文本分類、命名實體識別(NER)等 NLP 任務 上表現卓越。 BERT 架構圖示意圖 T5模型(Text-To-Text Transfer Transformer) T5是Google提出的統一文本到文本框架,將所有NLP任務轉化為文本生成問題。例如,翻譯任務被表述為「將英文翻譯成中文」。這種統一的視角使得T5在多任務學習中表現優異。 T5:統一的文本到文本框架 T5(Text-To-Text Transfer Transformer)是 Google 提出的 統一 NLP 框架,將所有 NLP 任務視為「文本到文本」的問題。例如: 翻譯:「將英文翻譯成中文:Hello, world! → 你好,世界!」 摘要:「對以下內容生成摘要:...」 問答:「問題:世界上最高的山是什麼? 文章:珠穆朗瑪峰是世界上海拔最高的山。 答案:珠穆朗瑪峰」 這種統一的方法讓 T5 在 多任務學習、文本生成、知識遷移 等領域展現極強的泛化能力。 LLM的應用場景 大型語言模型在各個領域都有廣泛的應用,包括: 對話系統與聊天機器人:如ChatGPT,能夠與使用者進行自然且連貫的對話。 機器翻譯:自動將一種語言翻譯成另一種語言,提升跨語言交流效率。 內容生成:自動撰寫文章、報告,甚至詩歌和故事,輔助內容創作者。 問答系統:根據使用者的問題,從資料庫中檢索並生成準確的答案。 文本摘要:從長篇文章中提取關鍵資訊,生成簡短摘要,方便快速了解內容。 程式碼生成: 代表 - Copilot, Codium. LLM面臨的挑戰 儘管LLM展現了強大的能力,但仍面臨以下挑戰: 高昂的計算資源需求:訓練和部署LLM需要大量的計算資源,對硬體設施要求高。 資料偏見:模型可能從訓練資料中學習到偏見,導致生成的內容存在偏見或歧視。 缺乏解釋性:由於模型結構複雜,其決策過程難以解釋,影響在關鍵領域的應用。 結語 大型語言模型正以前所未有的速度推動著人工智慧的發展。隨著技術的不斷進步,LLM將在更多領域展現其價值,為人類生活帶來深遠的影響。然而,我們也需要正視其面臨的挑戰,確保這項技術以負責任且公平的方式發展。
-
LLM架構與原理完整進階探討
在人工智慧的浩瀚星空中,Transformer架構如同一顆璀璨的新星,為大型語言模型(LLM)的發展帶來了革命性的突破。然而,這顆新星是否真的是驅動LLM進化的核心力量?還是其他因素在背後默默支撐?讓我們一起踏上這段探索之旅,揭開Transformer背後的神秘面紗。 Transformer的魅力與挑戰 Transformer架構自問世以來,憑藉其獨特的注意力機制,讓模型能夠捕捉詞彙之間的複雜關聯,深入理解語言的精髓。這種能力使其在機器翻譯、文本摘要等任務中大放異彩。然而,正如每顆明星都有其陰影面,Transformer也面臨著自身的挑戰。 優勢: 並行計算:不同於傳統的循環神經網路(RNN),Transformer能同時處理序列中的所有詞彙,大幅提升訓練速度。 長程依賴:其注意力機制能有效捕捉長距離詞彙間的關聯,讓模型對長文本的理解更加透徹。 靈活性:透過調整架構和訓練數據,Transformer能適應多種自然語言處理任務。 挑戰: 資源需求:龐大的參數量使得訓練Transformer需要大量的計算資源,這對許多研究機構和企業而言是一大門檻。 解釋性不足:模型的決策過程如同黑箱,難以解釋其內部運作,影響在關鍵領域的應用。 數據依賴:對大量高品質數據的需求,可能導致模型產生偏見或泛化能力不足的問題。 LLM的進化之路:不止於Transformer 雖然Transformer為LLM的發展鋪平了道路,但單靠它並不足以支撐整個架構。模型的性能還取決於訓練數據的質量、參數的調整,以及優化策略的應用。此外,其他技術如高效的編碼器-解碼器架構、知識增強技術等,也在提升LLM的性能和應用範圍中扮演著重要角色。 未來展望:尋找新的可能性 隨著科技的日新月異,研究者們開始探索超越Transformer的替代技術。卷積神經網路(CNN)的改良、圖神經網路(GNN)的應用,以及記憶網路(Memory Networks)的進化,都是潛在的方向。這些新興技術可能帶來更精簡的模型架構,降低訓練成本,同時提升模型的泛化能力。 Transformer如同AI世界中的璀璨明星,為LLM的發展帶來了前所未有的突破。然而,真正的力量源泉在於多種技術的協同作用。未來,我們需要持續探索新的技術,並將其與現有架構相結合,才能推動LLM邁向更高的巔峰。 1. 簡介 (Introduction) 想像有一位博覽群書、懂各種領域的「AI 大師」坐在你面前,無論是中文、英文、法文,或是任何一種語言的疑難雜症,它都能在短短幾秒內為你給出答案。這聽起來是不是很神奇? 其實,這就是所謂的 大型語言模型(LLM, Large Language Model) 的概念。 LLM 通常預先在大量文本上進行訓練,例如 Common Crawl、Wikipedia 等等。它可以用來做文本的摘要、翻譯、生成等任務,也能對多種語言進行處理。它所依託的核心技術包括: 1. Transformer 模型架構:由編碼器(Encoder)與解碼器(Decoder)組成,掌握文字序列與上下文關係。 2. Attention 機制:讓模型能夠捕捉文本中遠距離的依存關係。 3. 自回歸式(Autoregressive)文字生成:模型依據先前產生的詞彙,一步一步生成後續的文字。 有名的 LLM 例子包括:OpenAI 的 GPT-3、GPT-4、Meta 的 LLaMA 2,以及 Google 的 Gemini。這些超強大模型正在顛覆搜索引擎、自然語言處理、醫療、機器人以及程式碼生成等各行各業。 來源: [klu.ai] 1.1 LLM 是如何構 建與訓練的? (How are LLMs built and trained?) 構建和訓練 LLM 是一個繁複的過程,基本流程如下: 1. 資料蒐集:從書籍、網路、社群媒體等取得大量文本資料,並做初步的清洗和格式化。 2. 模型架構:通常採用深度神經網路(Transformer、GPT、BERT…)並配備數十億參數。 3. 訓練:使用強大的運算資源(如 GPU、TPU),透過優化演算法讓模型在大量語料中學習如何「預測下一個字」。 4. 擴充:擴大資料、參數量及運算能力,讓模型逼近人類在語言理解和生成上的表現。 LLMOps 則專注在 部署、監控、維運 LLM,包括模型的版本控制、水平擴充與效能調校等等。 來源: [klu.ai] 1.2 背景:Transformer 之前的世界 (The Pre-Transformer Era) 在 Transformer 橫空出世前,學界常用的主流方法是 RNN(Recurrent Neural Network)以及 CNN(Convolutional Neural Network)。儘管它們在處理序列資料上取得相當成就,卻仍有一些限制性,使得大部分人開始尋覓新的解決方案。 1.2.1 多層感知器 (MLPs) —— 早期深度學習的代表 概述 多層感知器(MLPs, Multi-Layer Perceptrons)是深度學習最基本的模型之一,也是最早期成功的人工神經網路(ANN)架構。MLP 由多個全連接層(Fully Connected Layers)組成,每層神經元透過加權輸入、激活函數(Activation Function)進行變換,最後通過輸出層進行預測。這種架構在圖像分類、語音識別、基本的自然語言處理(NLP)等早期應用中發揮了重要作用。 架構 MLPs 的主要組成部分包括: • 輸入層(Input Layer):接受原始數據輸入(如圖像像素值、文本特徵向量等)。 • 隱藏層(Hidden Layers):通常由多個全連接層組成,每層神經元使用激活函數(如 ReLU、Sigmoid、Tanh)進行非線性變換。 • 輸出層(Output Layer):負責最終的分類或回歸結果輸出。 特性與優勢 1. 強大的非線性建模能力:MLP 透過多層隱藏層與非線性激活函數,能夠學習複雜的映射函數,比單純的線性模型更具表達能力。 2. 適用於結構化數據:MLP 在處理數字特徵、表格數據(tabular data)等結構化數據時表現良好。 3. 普遍適用的基本模型:MLP 是神經網路的基礎架構,可作為許多複雜深度學習模型(如 CNN、RNN、Transformer)的組成部分。 限制與挑戰 儘管 MLP 在許多領域中有不錯的表現,但它存在以下幾個主要問題: 1. 參數量龐大,容易過擬合 • MLP 需要對每一層的所有神經元進行全連接,因此當網路層數增多時,參數量會迅速增長,導致訓練成本提高,並且容易出現過擬合(Overfitting)。 2. 無法有效捕捉序列資訊 • MLP 在每一層中都是獨立的全連接運算,無法保留序列資訊。例如,在自然語言處理(NLP)或時序數據分析(如股市預測)中,MLP 無法學習數據的時間依賴性,這使得它難以處理長序列數據。相比之下,循環神經網路(RNN)或 Transformer 更適合這類任務。 3. 無法有效利用空間結構資訊 • MLP 的全連接層使得其難以直接利用圖像、語音等數據的空間結構。例如,在計算機視覺中,卷積神經網路(CNN)透過局部感受野(Receptive Field)來捕捉局部特徵,而 MLP 則無法直接做到這一點。 MLP 在現代深度學習中的角色 儘管傳統的 MLP 受到上述限制,但近年來一些新的研究重新探索了 MLP 架構的潛力,例如: • MLP-Mixer(2021):利用 MLP 來取代傳統的卷積操作,在某些視覺任務上達到了接近 CNN 和 Transformer 的效果。 • gMLP(2021):透過門控機制(Gated MLP)來增強 MLP 的表達能力,使其能夠在一定程度上捕捉序列資訊。 • FFN(Feed-Forward Network)在 Transformer 中的應用:現代 Transformer(如 GPT-4、BERT)中仍然包含 MLP 結構,作為前饋神經網路(Feed-Forward Network, FFN)的一部分。 結論 MLP 是深度學習發展的基礎,雖然其原始形式在許多應用場景下已被 CNN、RNN、Transformer 取代,但它仍然是許多現代架構的一部分,特別是在處理結構化數據時仍然具有競爭力。此外,近年的研究如 MLP-Mixer 和 gMLP 也讓 MLP 在深度學習領域重新受到關注。 [Credits: deeprevision] 1.2.2 循環神經網路 (RNNs) RNN 則能透過「循環機制」把先前狀態的資訊帶到下一個時間步,理論上可以捕捉長序列依存關係。 [插圖:Credits: experfy] 然而,一旦序列過長,梯度消失 或 梯度爆炸 問題就會變得嚴重。再加上 RNN 需要逐步處理資料,無法同時並行運算,導致在大型資料集上的訓練速度往往緩慢。 1.2.3 長短期記憶單元 (LSTM) LSTM 加入了「記憶體單元(Cell state)」與「門(Gate)」機制,用「選擇性記住或忘記」的方式來改良 RNN 的長序列依存問題。雖然 LSTM 解決了一部分問題,但若序列更長、或需要更高級特徵,依舊會出現 效能不彰的情形。 補充: 長短期記憶網路(LSTM, Long Short-Term Memory)詳解 上面這張圖顯示了一個 LSTM(Long Short-Term Memory) 單元的內部結構,它是一種 改進版的循環神經網絡(RNN),能夠有效解決 長期依賴問題(Long-Term Dependency Problem),在處理序列數據(如語言建模、語音識別、時間序列預測)時表現出色。 1. 為什麼需要 LSTM? 傳統 RNN 的問題: • RNN 主要依賴隱藏狀態(hidden state)來存儲過去的信息,但當序列過長時,舊信息會因 梯度消失(vanishing gradient)或梯度爆炸(exploding gradient) 而逐漸遺失,導致難以學習長距離依賴關係。 LSTM 的解決方案: • LSTM 引入了 記憶單元(Cell State, ) 和 門控機制(Gate Mechanism),透過這些設計來選擇性保留或丟棄信息,使得神經網絡能夠更有效地學習長期依賴。 2. LSTM 的核心結構 LSTM 的核心由以下三個「門」組成: (1) 忘記門(Forget Gate, ) • 負責決定 應該丟棄多少舊資訊,確保不必要的信息不會影響後續學習。 • 公式:(課程就不說那麼複雜) • (Sigmoid 函數):將輸出壓縮到 ,1 表示完全保留,0 表示完全丟棄。 • 和 是學習參數。 (2) 輸入門(Input Gate, ) • 負責決定 應該更新多少新資訊,讓新的輸入資訊影響記憶單元。 • 公式:(課程就不說那麼複雜) • 控制新訊息 如何影響記憶單元。 • 候選記憶資訊: • 是新的候選資訊,範圍在 ,可以存儲新的信息。 (3) 輸出門(Output Gate, ) • 負責決定 該輸出多少資訊到下一個時間步,也就是 當前時間步的隱藏狀態()。 • 公式:(課程就不說那麼複雜) • 決定 記憶單元 的哪些部分要輸出。 • 記憶單元的資訊經過 激活函數處理: • 作為當前時間步的輸出,並傳遞到下一個 LSTM 單元。 3. LSTM 記憶更新流程 (1) 忘記舊資訊 • 會決定是否保留之前時間步的資訊: (2) 記憶新資訊 • 候選記憶資訊 透過輸入門 決定要加進多少新資訊。 (3) 決定輸出 • 由輸出門 控制當前時間步的輸出資訊。 4. LSTM vs. 傳統 RNN 記憶能力 只保留短期記憶 能保留長期記憶 梯度消失問題 嚴重 改善 適用於長序列 否 是 結構 單純的 遞迴 引入 和門控機制 RNN 記憶能力:只保留短期記憶, 改善 適用於長序列:否, 結構:遞迴 LSTM 記憶能力 :能保留長期記憶, 改善 適用於長序列:是, 結構:引入 和門控機制 5. LSTM 的應用 LSTM 目前在許多 序列數據相關應用 中被廣泛使用,包括: • 自然語言處理(NLP): • 文字生成(如 ChatGPT 的基礎模型) • 機器翻譯(Google Translate 早期版本) • 語音識別(Siri、Google Assistant) • 時間序列分析: • 股票市場預測 • 氣象預測 • 音樂生成、影片分析: • 音樂旋律生成 • 影片中物體追蹤 6. 總結 LSTM 是 RNN 的改進版本,透過「忘記門、輸入門、輸出門」來控制信息流動,使其能夠有效地記住長序列的資訊,解決了 RNN 中的梯度消失問題。在 NLP、語音識別、時間序列分析等領域發揮了巨大作用。 🔹 關鍵點回顧: • LSTM 透過 記憶單元 保留長期資訊。 • 三個 門控機制(忘記門、輸入門、輸出門) 控制資訊流動。 • 相較於 RNN,LSTM 解決了梯度消失問題,更適合長序列任務。 這就是 LSTM 的完整解析!🎯 1.2.4 注意力機制 (Attention Mechanism) 在 RNN/LSTM 中引入 注意力機制(Attention),可以讓模型在翻譯或生成時,特別關注(focus)句子中的某些位置。然而,這依舊受制於必須逐字(或逐時間步)處理的限制,平行化程度不佳。 Attention Mechanism補充: 簡單易懂的 RNN/LSTM + 注意力機制解釋 在 RNN 或 LSTM 中,我們希望模型能夠處理 一整段句子或一連串時間序列數據,例如翻譯一段話或根據過去的股市走勢預測未來價格。但 RNN/LSTM 有兩個主要問題: 1. 逐步處理(Sequential Processing):模型必須一個接一個地讀取單詞或數據點,無法一次處理所有資訊,導致訓練與推理速度較慢,難以平行運算(parallelization)。 2. 長距離依賴問題(Long-term Dependency):當輸入的句子很長時,前面的資訊可能會被逐漸遺忘或影響變小,導致模型難以記住重要的內容。 為什麼需要「注意力機制(Attention)」? 想像你在閱讀一篇文章,當你讀到一個句子時,你不會只記住最後一個單詞,而是會根據句子的內容,把重點放在 「對當前理解最有幫助的單詞」 上。例如: 🔹 句子:「貓跳到屋頂上,然後優雅地跳下來。」 🔹 問題:「貓最後在哪裡?」 🔹 如果只記住最後幾個單詞:你可能記得「跳下來」,但不知道「從哪裡跳下來」。 🔹 如果使用注意力機制:模型會特別關注「屋頂」這個詞,因為這與「跳下來」的目標位置有關。 如何在 RNN/LSTM 中使用「注意力機制」? 注意力機制的核心思想是: 👉 在每個時間步(Time Step),讓模型「動態地選擇」哪些過去的單詞/資訊是最重要的,而不是只依賴最後的隱藏狀態。 💡 步驟簡單解釋: 1. 計算關鍵性(Attention Score):對當前輸出來說,過去每個時間步的重要性不同,因此計算「現在這一刻該關注哪些時間步」。 2. 加權求和(Weighted Sum):將重要的資訊加權平均,讓模型能夠更精確地獲取有價值的資訊。 3. 用於預測下一個單詞(或輸出):讓模型能夠根據「最相關的資訊」來做出更準確的決策。 仍然存在的問題: 即使加入了注意力機制,RNN/LSTM 還是必須逐步處理序列(例如翻譯一整段句子時,模型仍需「一個單詞一個單詞地生成」),這導致計算無法完全平行化,處理長句子時仍然會比較慢。 這也是為什麼後來 Transformer(如 GPT、BERT)取代了 RNN/LSTM —— 因為它完全依賴「自注意力機制(Self-Attention)」,可以一次性處理整個序列並且支持高度平行化運算,大幅提升了效率! 🚀 總結 ✅ RNN/LSTM 的問題: • 逐步處理,無法平行化 • 長序列可能會忘記重要信息 ✅ 注意力機制的解決方案: • 讓模型學習「關注」哪些部分比較重要,而不是只依賴最後的隱藏狀態 ✅ 仍然有的問題: • 仍然需要逐步運算,效率不如 Transformer 這也是為什麼 Transformer 取代了 RNN/LSTM,成為現在主流的深度學習架構! 💡 說到那麼多的記憶力機制加上注意力機制,又讓我想要延伸議題思考!! 那現在最火紅的Agent他又是怎麼記憶的?跟LSTM或Transformer的注意力機制好像聽起來有著微妙的關聯?又說不上哪裡有關聯是嗎? 沒關係我來寫一篇延伸思考跟大家討論一下...: 注意力機制(Attention) 與 AI 代理人(Agent) 的長短期記憶確實有關聯,尤其是在當前 AI 自主代理(Autonomous Agents) 越來越受關注的背景下。這不僅是一個技術性的話題,還能夠連結到 如何讓 AI 代理人具備更強的記憶能力與決策能力。如果要寫一個「延伸思考(Extended Thinking)」的部分,這會是一個很棒的方向。 🔍 延伸思考:從注意力機制到 AI 代理人的記憶設計 現代 AI 代理人,如 AutoGPT、BabyAGI、LangGraph Agents,通常需要: 1. 短期記憶(Short-term Memory):即時處理當前的任務,例如對話機器人回應當前的問題。 2. 長期記憶(Long-term Memory):記住過去的交互與經驗,以便未來決策能夠基於先前學習的資訊。 這與 注意力機制在 RNN/LSTM 中的角色相似: • 在 LSTM 中,記憶單元(Cell State, )決定長期資訊的保留與更新,類似於代理人的「長期知識庫」。 • 注意力機制(Attention)則負責動態選擇當前時刻最重要的資訊,類似於代理人每次決策時所「提取」的關鍵知識。 📌 1. AI 代理人的「注意力」:如何選擇關鍵資訊 在 AI 代理人架構中,關鍵問題之一是 如何從大量的記憶中檢索最相關的資訊,這與注意力機制的核心概念一致: • 在 LSTM 內部,注意力機制允許模型「關注」最重要的時間步,而不是僅依賴最終隱藏狀態(h_t ))。 • 在 AI 代理人中,我們希望它能從過去記憶中檢索出最相關的資訊來輔助決策(這與 RAG(檢索增強生成)技術息息相關)。 • 現代 AI 代理人的記憶系統(如 LangGraph)通常結合 向量數據庫(Vector Database) 來檢索過去的對話或行為,類似於 注意力機制在 Transformer 中的 Query-Key-Value 計算。 📌 2. 記憶的「動態更新」:如何平衡長短期記憶 在 LSTM 中,透過「忘記門(Forget Gate)」,模型能夠決定哪些資訊要遺忘,哪些要保留。這與 AI 代理人需要的「記憶管理」非常相似: • 如果 AI 代理人無法遺忘無關資訊,記憶會變得臃腫,影響檢索效率。 • 如果 AI 代理人遺忘太快,它就無法累積知識,影響長期規劃能力。 • 目前的解決方案包括: • 設計「記憶管理策略」,類似 LSTM 的門控機制(例如,LangGraph 讓代理人動態決定何時保留/遺忘某些知識)。 • 使用「檢索增強生成(RAG)」技術,讓代理人能夠檢索最相關的歷史記錄,而非存儲所有資訊。 這使得 AI 代理人能夠像人類一樣: ✅ 記住重要資訊,遺忘不必要細節 ✅ 動態選擇最適合當前決策的知識點 📌 3. 注意力機制與 AI 代理人的「專注力」 另一個有趣的關聯點是:如何讓 AI 代理人「專注於當前的關鍵任務」,而不被過多的記憶干擾? 在 Transformer 架構中,自注意力(Self-Attention) 能夠根據當前的上下文動態調整權重,確保模型不會被無關的資訊干擾。 同樣地,AI 代理人也可以: • 透過動態記憶檢索,確保每次行動都只使用最相關的知識,而不被大量過去資訊影響決策。 • 類似人類的「專注力」,確保 AI 代理人不會因為長期記憶太多而影響短期決策。 這讓 AI 代理人在長期任務(例如自動化研究、持續學習)時更加智能,並能夠根據當前的需求快速適應不同的場景。 📝 結論:從 RNN/LSTM 到 AI 代理人的記憶架構 🔹 LSTM 的記憶單元(Cell State)→ AI 代理人的長期記憶(Knowledge Base) 🔹 注意力機制(Attention)→ AI 代理人的知識檢索(RAG, Vector DB) 🔹 忘記門(Forget Gate)→ AI 代理人的記憶管理策略(Memory Pruning) 🔹 自注意力(Self-Attention)→ AI 代理人的專注力(Focused Task Execution) 👉 AI 代理人的長短期記憶機制,與 LSTM+Attention 有相似的設計哲學,只是應用場景不同。 👉 現代 AI 代理人透過 RAG、LangGraph、記憶管理技術,正在進化成更強大的「具備長短期記憶能力」的自主智能體! 這樣的探討可以作為你文章的 「延伸思考」,讓讀者理解從 RNN/LSTM 到 AI 代理人的技術演進。🔥 1.2.5 卷積神經網路 (CNNs) CNN 可以並行計算,且對區域性資訊敏感,但處理太長的序列(要關注到句子遠端的詞彙)時,仍顯得力不從心。 這時候,Transformer 便應運而生。 1.3 走進 Transformer (Introducing Transformers) Transformer 主打兩個重點: 1. 放棄了 RNN/CNN 的序列性運算,改用 自注意力(Self-Attention)。 2. 訓練可並行化,速度顯著提升。 讓我們先回顧三篇重要的先驅論文: 1. Sequence to Sequence Learning with Neural Networks 2. Neural Machine Translation by Jointly Learning to Align and Translate 3. Attention is All You Need 1.4 為什麼「Attention is All You Need」? (Why “Attention is All You Need”?) 1. 用自注意力取代 LSTM:使得訓練可並行化,大幅加快模型訓練速度。 2. 穩定的架構:加入多頭注意力(Multi-Head Attention)、位置編碼(Positional Encoding)等元素,使模型能不斷擴充。 3. 穩定的超參數:原始 Transformer 以 6 層編碼器及 6 層解碼器在多種 NLP 任務上都極具穩定性,使得後續研究廣泛沿用。 2. Transformer 架構 (Transformer Architecture) Transformer 的核心概念:給定一段文字(Prompt),模型預測下一個最有可能的詞彙。它可同時捕捉近距與遠距的相依關係。 Transformer 採用 「編碼器-解碼器」(Encoder-Decoder) 模式。編碼器負責將輸入序列壓縮成含上下文資訊的向量表示,解碼器根據這些表示一步步生成新的序列(譬如翻譯成另一種語言)。 2.1 嵌入 編碼器是 Transformer 架構的基本組成部分。編碼器的主要功能是將輸入的標記轉換為上下文表示。與早期獨立處理 token 的模型不同,Transformer 編碼器會捕捉相對於整個序列的每個 token 的上下文。 其結構組成如下: 文字輸入被分成更小的單位,稱為標記,可以是單字或子單字。這些標記被轉換成稱為嵌入的數字向量,用於捕捉單字的語義。 2.1.1 輸入嵌入 假設您想使用 Transformer 模型產生文字。您可以新增以下提示:“Data visualization empowers users to”。此輸入需要轉換成模型可以理解和處理的格式。這就是嵌入的作用所在:它將文字轉換為模型可以使用的數字表示形式。要將提示轉換為嵌入,我們需要 對輸入進行標記, 取得 token 嵌入, 添加位置信息,最後 將標記和位置編碼相加以獲得最終的嵌入。 讓我們看看每個步驟是如何完成的。 擴展嵌入層視圖,顯示輸入提示如何轉換為向量表示。該過程涉及(1)標記化,(2)標記嵌入,(3)位置編碼,以及(4)最終嵌入。 嵌入僅發生在最底部的編碼器。編碼器首先使用嵌入層將輸入標記(單字或子單字)轉換為向量。這些嵌入捕獲標記的語義含義並將其轉換為數字向量。 所有編碼器都會收到一個向量列表,每個向量的大小為 512(固定大小)。在底部編碼器中,這將是詞嵌入,但在其他編碼器中,這將是位於它們正下方的編碼器的輸出。 步驟 3:位置編碼 編碼器的工作流程。位置編碼 |圖片來源:Datacamp 圖片來源:Vaclar Kosar 自注意力機制最好的部分是它能夠根據特定詞語所使用的上下文產生動態上下文嵌入。此外,自註意力機制的一個主要優點是它允許並行計算所有上下文嵌入,從而可以快速處理大型文件。然而,這種並行處理有一個明顯的缺點:自注意力模組無法捕捉句子中單字的順序。例如,考慮以下兩句話: 拉維殺死了獅子。 獅子殺死了拉維。 如果您將這兩個句子都經過自我注意力模組,它將無法區分它們,因為它沒有捕捉到單字的順序。 這種限制可能會導致意義上的誤解,因為該模組將包含不同順序的相同單字的句子視為相同的句子。為了解決這個問題,Transformer 架構中引入了位置編碼。位置編碼提供有關句子中單字順序的信息,確保模型理解該序列並保持正確的上下文。 驟 4:最終嵌入 最後,我們將標記和位置編碼相加以獲得最終的嵌入表示。這種組合表示既捕獲了標記的語義含義,也捕獲了它們在輸入序列中的位置。 2.2 編碼器 編碼器層堆疊 編碼器的工作流程。編碼器層堆疊 |圖片來源:Datacamp Transformer 編碼器由一堆相同的層組成(原始 Transformer 模型中為 6 個)。這個數字是透過實驗獲得的,可以為各種任務提供最佳結果。 編碼器層用於將所有輸入序列轉換為連續的、抽象的表示,並封裝從整個序列中學習到的資訊。此層包含兩個子模組: 多頭注意力機制。 一個完全連接的網路。 但是這些區塊如何協同工作呢?編碼器區塊的實際架構包括附加元件,例如添加層和範數層以及殘差連接。這些確保資訊流在通過每個區塊時保持順暢。 輸入資料(通常是一批句子)進入第一個編碼器區塊,經過處理,然後輸出移動到下一個編碼器區塊。這個過程在所有六個編碼器區塊中持續進行,最終輸出被傳遞給解碼器。每個區塊以類似的方式處理數據,使得整個架構高度高效且結構化。 簡而言之,它結合了每個子層周圍的殘差連接,然後進行層規範化。 2.2.1 多頭自註意力 自註意力機制使模型能夠專注於輸入序列的相關部分,從而能夠捕捉資料中的複雜關係和依賴關係。讓我們看看如何一步一步計算這種自我注意力。 查詢、鍵和值矩陣 每個 token 的 embedding 向量轉換成三個向量:Query (Q)、Key (K)、 Value (V)。這些向量是透過將輸入嵌入矩陣與 Q、K 和 V 的學習權重矩陣相乘而得出的。 查詢(Q)是您在搜尋引擎欄中輸入的搜尋文字。這是您想要“查找更多資訊”的令牌。 鍵(K)是搜尋結果視窗中每個網頁的標題。它表示查詢可以關注的可能的標記。 價值(V)是網頁所顯示的實際內容。一旦我們將適當的搜尋字詞(查詢)與相關結果(鍵)匹配,我們就想要得到最相關頁面的內容(值)。 透過使用這些 QKV 值,模型可以計算注意力分數,這決定了每個標記在產生預測時應該獲得多少關注。 第一個自註意力模組使模型能夠從整個序列中捕獲上下文資訊。查詢、鍵和值不是執行單一的注意函數,而是線性投影 h 次。在每個查詢、鍵和值的投影版本上,注意機制並行執行,產生 h 維輸出值。 詳細架構如下: 矩陣乘法 (MatMul) — 查詢與鍵的點積 一旦查詢、鍵和值向量通過線性層,就會在查詢和鍵之間執行點積矩陣乘法,從而建立分數矩陣。 分數矩陣決定了每個單字對其他單字的強調程度。因此,每個單字都會根據同一時間步長內的其他單字被分配一個分數。分數越高,表示關注度越高。 該程序有效地將查詢映射到其對應的鍵。 編碼器的工作流程。注意機制——矩陣乘法。 降低注意力分數的大小 然後透過將分數除以查詢和鍵向量的維度的平方根來縮小分數。實施此步驟是為了確保梯度更穩定,因為值的乘積可能會導致過大的影響。 編碼器的工作流程。降低注意力分數。 |圖片來源:Datacamp 將 Softmax 應用於調整後的分數 隨後,將softmax函數應用於調整後的分數以獲得注意力權重。這會導致機率值的範圍從 0 到 1。 編碼器的工作流程。 Softmax 調整分數。 將 Softmax 結果與值向量結合 注意力機制的下一步是將來自softmax函數的權重與值向量相乘,得到輸出向量。 在這個過程中,只有那些呈現高softmax分數的單字才會被保留。最後,此輸出向量輸入到線性層進行進一步處理。 編碼器的工作流程。將 Softmax 結果與值向量結合。 |圖片來源:Datacamp 最後我們就得到了Attention機制的輸出! 那麼,你可能想知道為什麼它被稱為多頭注意力? 請記住,在整個過程開始之前,我們會將查詢、鍵和值分解 h 次。這個過程被稱為自我注意力,在每個較小的階段或「頭部」中分別發生。每個頭部都獨立發揮其魔力,產生一個輸出向量。 這個集合經過最後的線性層,很像一個微調其集體性能的過濾器。這裡的美妙之處在於每個頭部學習的多樣性,透過強大而多方面的理解豐富了編碼器模型。 2.2.2 歸一化和殘差連接 編碼器的工作流程。多頭注意力機制 (Multi-Head Attention) 後的歸一化與殘差連結。 |圖片來源:Datacamp 編碼器層中的每個子層後面都有一個標準化步驟。此外,每個子層輸出都添加到其輸入(殘差連接)中,以幫助緩解梯度消失問題,從而允許更深的模型。前饋神經網路之後也將重複這個過程。 2.2.3 前饋神經網絡 編碼器的工作流程。前饋神經網路子層。 歸一化殘差輸出的旅程繼續進行,因為它會透過逐點前饋網絡,這是進一步細化的關鍵階段。 將此網路想像為兩個線性層,其中 ReLU 激活層位於它們之間,充當橋樑。一旦經過處理,輸出就會踏上一條熟悉的路徑:它會循環回來並與逐點前饋網路的輸入合併。 這次重聚之後,又將進行新一輪的正常化,確保一切都調整好,為下一步行動同步進行。 2.2.4 編碼器的輸出 最後的編碼器層的輸出是一組向量,每個向量都以豐富的上下文理解來表示輸入序列。然後將此輸出用作 Transformer 模型中解碼器的輸入。 這種仔細的編碼為解碼器鋪平了道路,引導它在解碼時注意輸入中的正確單字。 想像建造一座塔,你可以在其中堆疊 N 個編碼器層。此堆疊中的每一層都有機會探索和學習注意力的不同方面,就像知識層一樣。這不僅使理解多樣化,而且可以顯著增強變壓器網路的預測能力。 2.3 解碼器 解碼器的作用在於製作文字序列。與編碼器類似,解碼器配備了一組類似的子層。它擁有兩個多頭注意層、一個逐點前饋層,並在每個子層之後結合了殘差連接和層規範化。 編碼器的全域結構。 |圖片來源:Datacamp 這些組件的功能類似於編碼器的層,但有一個不同之處:解碼器中的每個多頭注意層都有其獨特的使命。 解碼器過程的最後涉及一個線性層,作為分類器,頂部有一個softmax函數來計算不同單字的機率。 Transformer 解碼器具有專門設計的結構,透過逐步解碼編碼資訊來產生此輸出。 值得注意的是,解碼器以自回歸的方式運行,並以起始標記啟動其進程。它巧妙地使用先前生成的輸出列表作為其輸入,並與來自編碼器的富含初始輸入的注意力資訊的輸出相結合。 這種連續的解碼過程持續到解碼器到達一個關鍵時刻:產生一個標記,標誌著其輸出創建結束。 2.3.1 輸出嵌入 在解碼器的起始行,該過程與編碼器的過程相同。在這裡,輸入首先經過一個嵌入層 2.3.2 位置編碼 嵌入之後,就像解碼器一樣,輸入經過位置編碼層。該序列旨在產生位置嵌入。 然後,這些位置嵌入被引導到解碼器的第一個多頭注意層,在那裡精確計算特定於解碼器輸入的注意分數。 2.3.3 解碼器層的堆疊 解碼器由一組相同的層組成(原始 Transformer 模型中為 6 個)。每層都有三個主要子組件: 1. 掩蔽自註意力機制 這類似於編碼器中的自註意力機制,但有一個關鍵的區別:它防止位置關注後續位置,這意味著序列中的每個單字不受未來標記的影響。 例如,在計算單字「are」的注意力分數時,重要的是「are」不會被序列中的後續單字「you」所影響。 解碼器的工作流程。第一個多頭注意力遮罩。 這種掩蔽確保特定位置的預測只能依賴該位置之前已知的輸出。 2. 編碼器-解碼器多頭注意力或交叉注意力 在解碼器的第二個多頭注意層中,我們看到編碼器和解碼器元件之間的獨特相互作用。在這裡,編碼器的輸出既充當查詢又充當鍵的角色,而解碼器的第一個多頭注意層的輸出則充當值。 這種設定有效地將編碼器的輸入與解碼器的輸入對齊,使解碼器能夠識別並強調編碼器輸入中最相關的部分。 隨後,第二層多頭注意力的輸出將透過逐點前饋層進行細化,從而進一步增強處理。 解碼器的工作流程。編碼器-解碼器注意力機制。 在這個子層中,查詢來自前一個解碼器層,而鍵和值來自編碼器的輸出。這使得解碼器中的每個位置都能專注於輸入序列中的所有位置,從而有效地將來自編碼器的信息與解碼器中的信息整合在一起。 3.前饋神經網絡 與編碼器類似,每個解碼器層都包含一個完全連接的前饋網絡,分別且相同地應用於每個位置。 2.3.4 線性分類器和 Softmax 產生輸出機率 資料通過變換器模型的旅程最終會通過最後的線性層,該層起到分類器的作用。 這個分類器的大小與所涉及的類別的總數(詞彙表中包含的單字數)相對應。例如,在有 1000 個不同類別代表 1000 個不同單字的場景中,分類器的輸出將是一個包含 1000 個元素的陣列。 然後將該輸出引入到 softmax 層,將其轉換為一系列機率分數,每個分數介於 0 和 1 之間。 解碼器的工作流程。 Transformer 的最終輸出。 2.3.5 規範化和殘差連接 每個子層(掩蔽自註意力、編碼器-解碼器注意力、前饋網路)後面都有一個標準化步驟,每個子層還包括一個周圍的殘差連接。 2.3.6 解碼器的輸出 最後一層的輸出被轉換成預測序列,通常透過線性層然後是softmax來產生詞彙的機率。 解碼器在其操作流程中,將新產生的輸出合併到其不斷增長的輸入清單中,然後繼續解碼過程。這個循環重複進行,直到模型預測出一個特定的標記,表示完成。 預測機率最高的標記被指定為結論類,通常由結束標記表示。 再次記住,解碼器不僅限於單層。它可以由 N 層構成,每一層都基於從編碼器及其前一層接收的輸入來建構。這種分層架構允許模型分散其焦點並在其註意力頭中提取不同的注意力模式。 這種多層次的方法可以顯著增強模型的預測能力,因為它對不同的注意力組合有了更細緻的理解。 最終的架構與此類似(來自原始論文) Transformers 的原始結構。 3. LLM 架構 機器學習 (ML) 中的架構是指模型的神經元和層的排列。它就像一個藍圖,概述了模型如何從數據中學習。不同的架構捕捉資料中的不同關係,在訓練期間強調特定的組件。因此,架構會影響模型所擅長的任務及其所產生的輸出的品質。 3.1 Seq-2-Seq 模型(編碼器-解碼器) 圖片來源:Abhinav Kimothi 編碼器-解碼器由兩個元件組成: 編碼器-接受輸入資料並將其轉換為抽象的連續表示,以捕獲輸入的主要特徵。 解碼器-在吸收先前的輸出的同時,將連續表示轉換成可理解的輸出。 編碼和解碼過程使得模型能夠透過更有效的資料表示來處理複雜的語言任務,從而幫助模型做出連貫的回應。 這種雙過程架構在機器翻譯(將同一句話從一種語言轉換為另一種語言)和文字摘要(總結文字中的相同關鍵點)等生成任務中表現出色,在這些任務中,在生成輸出之前理解整個輸入至關重要。但是,由於需要先處理整體輸入,因此推理速度可能會較慢。 LLM 範例: 谷歌的 — T5、Flan-UL2和Flan-T5。 Meta 的BART。 3.2 自動編碼模型(僅限編碼器) 圖片來源:Abhinav Kimothi 流行的 BERT(“用於語言理解的深度雙向變壓器的預訓練”,2018)和 RoBERTa(“一種穩健優化的 BERT 預訓練方法”,2018)等模型使用僅編碼器架構將輸入轉換為豐富的、情境化的表示,而無需直接生成新序列。 例如,BERT 使用兩種創新方法在大量文字語料庫上進行預訓練:掩蔽語言建模 (MLM) 和下一句預測。 MLM 的工作原理是隱藏句子中的隨機標記,並訓練模型根據上下文預測這些標記。透過這種方式,模型可以理解左右上下文中單字之間的關係。這種「雙向」理解對於需要強大語言理解能力的任務至關重要,例如句子分類(例如情緒分析)或填補缺失的單字。 但與可以解釋和產生文字的編碼器-解碼器模型不同,它們本身無法產生長文字序列。他們更注重解釋輸入。 LLM 範例: Google 的BERT和ALBERT。 Meta 的RoBERTa。 微軟的DeBERTa。 3.3 自回歸模型(僅限解碼器) 圖片來源:Abhinav Kimothi 僅解碼器架構根據先前的上下文產生輸入序列的下一部分。與基於編碼器的模型不同,它們無法理解整個輸入,但擅長產生下一個可能的單字。因此,僅解碼器模型在輸出上更加“有創意”和“開放”。 這種逐個標記的輸出生成對於文字生成任務(如創意寫作、對話生成和故事完成)非常有效。 LLM 範例: Open AI 的GPT-4和GPT-3系列。 Google 的PaLM和Bard。 Meta 的LLaMA和OPT。 3.4 專家混合(MoE) Mistral 8x7B 等模型所採用的 MoE 與傳統的 Transformer 模型不同,它建立在這樣一個觀察基礎之上:單一整體語言模型可以分解為更小的、專門的子模型。在模型之間分配任務(例如切換輸入標記)的門控網路協調這些子模型,這些子模型專注於輸入資料的各個方面。 這種方法可以實現擴展(高效計算和資源分配)和多樣化技能,使 MoE 能夠出色地處理具有不同要求的複雜任務。該架構的整個目的是提高 LLM 參數的數量,而不會相應增加計算費用。 那麼,Mistral 8x7B 算是 LLM 嗎?儘管其架構與 transformer 模型存在差異,但由於以下幾個原因,它仍然有資格成為 LLM: 模型大小:其龐大的規模和參數數量(1870 億個參數)使其在複雜性和容量方面可與其他 LLM 相媲美。 預訓練:與其他 LLM 一樣,Mistral 8x7B 透過無監督學習技術在綜合資料集上進行預訓練,從而能夠理解和模仿類似人類的語言模式。 多才多藝:它展現了完成各種任務的熟練程度,展現了法學碩士的廣泛能力。 適應性:與其他 LLM 一樣,Mistral 8x7B 也可以針對特定任務進行微調,從而提高效能。 4. 推理 現在我們已經介紹了 Transformer 的架構並詳細了解了其元件,現在是時候討論如何實際執行推理了。我們已經訓練了我們的變換器模型,現在,在預測階段,架構的行為與訓練期間略有不同。 訓練和推理之間的主要區別: 訓練:訓練 Transformer 模型以學習輸入資料中的模式和關係(例如語言建模、翻譯等)。 推理:使用訓練好的 Transformer 模型進行預測,例如生成文本、翻譯語言或對文本進行分類。 在推理過程中,主要的差異發生在解碼器中。與訓練不同,在訓練中我們已經知道整個輸出句子,並且可以一次將所有標記傳遞給解碼器,使其以非自回歸的方式運行,而在推理過程中,我們沒有完整的輸出句子。因此,解碼器必須以自回歸的方式一次一個單字地產生翻譯。它使用每個先前預測的單字來幫助預測序列中的下一個單字。這個過程持續直到模型產生整個翻譯的句子。 圖片來源:Umar Jamil 推理過程中的資料流是: 輸入序列被轉換為嵌入(帶有位置編碼)並輸入到編碼器。 編碼器堆疊對此進行處理並產生輸入序列的編碼表示。 我們不使用目標序列,而是使用僅帶有句首標記的空序列。這被轉換成嵌入(帶有位置編碼)並輸入到解碼器。 解碼器堆疊將其與編碼器堆疊的編碼表示一起處理,以產生目標序列的編碼表示。 輸出層將其轉換為單字機率並產生輸出序列。 我們將輸出序列的最後一個字作為預測詞。該單字現在被填充到我們的解碼器輸入序列的第二個位置,該序列現在包含一個句子起始標記和第一個單字。 返回步驟#3。和以前一樣,將新的解碼器序列輸入模型。然後取出輸出的第二個字並將其附加到解碼器序列。重複此動作直到預測句子結束的標記。請注意,由於編碼器序列在每次迭代中都不會改變,因此我們不必每次都重複步驟 #1 和 #2 推理流程,在第一個時間步之後。圖片來源:Ketan Doshi 4.1 推理技術 Transformer 可用來推理,方法是每次輸入標記序列。編碼器用於處理輸入序列並產生嵌入序列。解碼器用於每次產生一個標記的輸出序列。解碼器使用編碼器輸出和先前產生的標記來產生下一個標記。 Transformer 可以使用不同的策略進行推理,例如貪婪搜尋和束搜尋。 4.1.1 貪婪搜索 貪婪搜尋是一種簡單的推理策略。在每個時間步驟中,解碼器根據其模型產生具有最高機率的標記。重複此過程直到解碼器產生序列結束標記。貪婪搜尋速度很快,但容易陷入局部最優。 貪婪搜索,來源:d2l.ai 4.1.2 集束搜索 集束搜尋是一種更複雜的推理策略。在每個時間步驟中,解碼器都會產生一束標記,其中束大小是一個超參數。然後,解碼器從光束中選擇前 k 個標記,並繼續從每個標記中產生標記。重複此過程直到解碼器產生序列結束標記。集束搜尋比貪婪搜尋慢,但可以產生更多樣化和準確的輸出。 束搜尋的過程(束大小=2;輸出序列的最大長度=3)。候選輸出序列為A、C、AB、CE、ABD、CED。來源:d2l.ai 還有其他可與 Transformer 一起使用的推理策略,例如採樣和核採樣。這些策略可用於產生更具創造性和多樣化的產出。 5. Transformer 推理優化 Transformer 模型以其自註意力機製而聞名,對於 NLP 和電腦視覺等任務至關重要。推理,即這些模型根據未知資料產生預測的階段,需要大量的計算資源。 影響 transformer 推理的一個關鍵因素是浮點運算 (FLOP) 的數量。每一層都涉及矩陣乘法,對於像 GPT-3 這樣的大型模型,每個 token 的 FLOP 可能高達數萬億。為了減少計算開銷,使用了鍵值(KV)緩存,允許模型重用先前計算的注意向量,從而加快自回歸解碼。 記憶體使用是另一個限制因素,GPT-3 等模型需要超過 200 GB 的記憶體。量化和並行等技術有助於更有效地管理這些資源,但變壓器推理通常仍然受到記憶體的限制,其中記憶體頻寬限制了計算速度。 5.1 Transformer 架構與推理流程 Transformer 的核心架構是基於自註意力機制和一系列堆疊層,每個層包含注意力和前饋網路。在推理過程中,Transformer 應用預先訓練的參數進行預測,通常在 GPT 等自迴歸模型中逐一標記地進行。 推理涉及幾個矩陣運算,特別是每個注意層中的矩陣向量乘法。對於每個新標記,模型透過將輸入嵌入與學習到的權重矩陣相乘來計算查詢(Q)、鍵(K)和值(V)向量。 注意力機制透過將查詢與轉置的鍵矩陣相乘、將結果縮放至維度大小的平方根並應用 softmax 函數來計算相關性分數。這個過程使得模型能夠衡量序列中每個標記的重要性。雖然這些矩陣乘法非常有效,但它們的計算成本很高,特別是在像 GPT-3 或 LLaMA 這樣的大型模型中,其中每個注意力頭每個 token 執行數十億次 FLOP。 5.2 Transformer 推理的階段:預填和解碼 Transformer 推理分為兩個關鍵階段:預先填入和解碼。這些階段決定了模型如何處理輸入標記並產生輸出標記,每個階段對效能有不同的影響。 1. 預填階段:在預填階段,模型並行處理整個輸入序列,將標記轉換為鍵值對。此階段計算密集但高度可並行,從而實現高效的 GPU 利用率。運算主要涉及矩陣-矩陣乘法,從而允許 GPU 同時處理多個標記。 Prefill 在批次方面表現出色,可以同時處理大量數據,從而最大限度地減少延遲。 2. 解碼階段:解碼階段較受記憶體限制且具有順序性,會逐一產生標記。每個新標記都依賴先前產生的標記,需要矩陣向量乘法,與預填充階段的平行特性相比,這會未充分利用 GPU。順序過程引入了延遲瓶頸,使得該階段的速度明顯變慢,尤其是在 GPT-3 這樣的大型模型中。 鍵值快取機制的說明,展示如何儲存先前計算的鍵和值以避免在推理過程中進行重複計算 |圖片來源:PremAI 鍵值(KV)快取是解碼階段的關鍵最佳化。透過儲存先前計算的鍵值矩陣,該模型避免了重新計算,從而將複雜性從二次降低到線性。 鍵值快取機制的圖示,展示了快取值如何減少解碼階段的運算負載 6. Transformer 推理中的挑戰 大型 Transformer 模型,尤其是像 GPT-3 這樣的大型語言模型 (LLM),由於其大小和計算要求,在推理過程中帶來了許多挑戰。這些挑戰圍繞著記憶體限制、延遲以及記憶體限制和計算限制操作之間的平衡。 1. 記憶體和運算需求:推理期間儲存模型權重和鍵值 (KV) 快取需要大量記憶體。像 GPT-3 這樣的大型模型具有 1750 億個參數,通常需要超過 200 GB 的記憶體。此外,KV 快取大小隨著序列長度和批次大小線性增長,進一步增加了記憶體負擔。例如,具有 70 億個參數和 4096 序列長度的 LLaMA 模型僅為 KV 快取就會消耗約 2 GB 的記憶體。 2. 順序令牌產生中的延遲:延遲是一個關鍵問題,特別是在解碼階段,其中令牌一次產生一個。每個新標記都依賴前一個標記,這會導致順序操作無法充分利用 GPU 的運算能力。即使高度最佳化的模型也會受到記憶體頻寬瓶頸的影響,並且隨著序列長度的增加,這種瓶頸問題會變得更加明顯。 3. 平衡批次大小和效能:更大的批次大小可以提高 GPU 利用率,尤其是在預填階段,但它們受到記憶體容量的限制。增加批次大小有助於最大化吞吐量,但僅限於系統受到記憶體限制的程度。除此之外,系統可能會遇到收益遞減的情況,因為記憶體頻寬開始限制進一步的效能提升。 4. 記憶體受限與計算受限操作的權衡: Transformer 推理在記憶體受限操作和計算受限操作之間交替進行。在解碼階段,矩陣向量乘法通常受記憶體限制,而預填矩陣-矩陣運算往往受計算限制。有效優化批次大小、KV 快取管理和精確度(例如 FP16、INT8)對於減少延遲和確保高效的 GPU 使用至關重要。 7. 更快推理的最佳化技術 隨著 GPT-3、LLaMA 和其他大型語言模型 (LLM) 等轉換器模型不斷擴展,最佳化技術對於管理與推理相關的增加的記憶體、計算負載和延遲變得至關重要。透過應用量化、鍵值 (KV) 快取、推測解碼、批次和平行等技術,開發人員可以顯著提高推理效能。 7.1 量化 量化前後的值的分佈,說明了從浮點數到 INT8 的轉換過程中的捨入和異常值剪切過程。 量化降低了模型權重和激活的精度,從而實現了更快的計算和更低的記憶體使用量。模型可以使用 8 位元(INT8)甚至更低的精度,而不是依賴 32 位元或 16 位元浮點精度,從而減少記憶體頻寬並允許模型更有效地處理更大的批次或更長的序列。 記憶體頻寬利用率 (MBU) 公式顯示記憶體頻寬如何限制效能,其中參數數量、每個參數的位元組數和每秒令牌數都會影響推理速度 例如,將 INT8 量化應用於 GPT-3 可以將記憶體需求減少高達 50%,直接導致推理過程中的延遲更低、吞吐量更高。量化對於面臨頻寬限制的記憶體受限模型特別有用。 將模型權重從 FP16 量化為 INT8 可以減少記憶體使用量,並透過降低記憶體頻寬需求來提高推理效能。 7.2 鍵值(KV)緩存 在自迴歸模型中,每個新的標記產生都需要存取所有先前的標記。隨著序列長度的增加,這會導致計算量呈現二次方增加。 KV 快取透過儲存先前標記的鍵和值張量來緩解這種情況,從而允許模型重複使用它們而無需重新計算。 KV 快取的大小隨著 token、layers 和 Attention Heads 的數量線性增長。例如,在 LLaMA 7B 模型中,4096 個標記的序列長度將需要大約 2 GB 的記憶體用於 KV 快取。這種優化顯著減少了解碼階段的計算負荷,提高了速度和記憶體效率。 7.3 推測解碼 推測解碼是一種高級優化技術,透過並行化令牌生成來減少延遲。推測解碼不是等待每個標記按順序處理,而是使用較小的草稿模型來預測前面的幾個標記,並使用主模型驗證預測。如果預測準確,則接受;如果不是,則將其丟棄。 這種方法允許並行執行,從而減少了產生令牌所需的整體時間,同時保持了準確性。它對於即時應用程式(例如聊天機器人)特別有用,因為快速回應時間至關重要。 7.4 批次 批次處理是一種優化變壓器推理的簡單但強大的技術。透過同時處理多個輸入,批次處理可以提高 GPU 的使用率,因為模型權重的記憶體成本在多個請求之間共享。然而,批次受到可用記憶體的限制,特別是在具有長序列的模型中。 傳統批次處理的一個挑戰是,批次內的不同請求可能會產生不同數量的輸出令牌。這可能會導致效率低下,因為所有請求都必須等待運行時間最長的請求完成。為了解決這個問題,正在進行的批次允許系統立即從批次中逐出已完成的請求,從而釋放資源以用於新請求。 7.5 硬體優化:並行性 硬體優化,特別是張量並行和管道並行,對於擴展大型模型至關重要。這些方法將計算負載分配到多個 GPU 上,使得系統能夠處理超出單一 GPU 記憶體容量的模型。 · 張量並行:此技術將模型的參數分散到多個 GPU 上,使它們能夠並行處理相同輸入的不同部分。張量並行對於注意層特別有效,其中不同的注意頭可以獨立計算。 · 管道並行:這種方法將模型分成連續的區塊,每個區塊由不同的 GPU 處理。管道並行減少了每個 GPU 的記憶體佔用,使更大的模型能夠有效運作。但是,在等待來自前幾個階段的資料時,它會在 GPU 之間引入一些空閒時間。 這兩種平行形式對於管理 GPT-3 和 LLaMA 等大型模型都至關重要,因為這些模型的記憶體和運算需求通常超出單一 GPU 的能力。 7.6 FlashAttention 和記憶體效率 另一個關鍵的進步是 FlashAttention,它透過減少資料載入和儲存在記憶體中的次數來優化記憶體存取模式。 FlashAttention 利用 GPU 記憶體層次結構更有效率地執行運算、融合操作並最大限度地減少資料移動。該技術可以減少記憶體浪費並實現更大的批量大小,從而顯著提高速度,尤其是在序列長度較大的模型中。 8. 推理效能基準測試 GPT-3 和 LLaMA 的基準測試說明了這些最佳化的影響。對於 GPT-3,與未優化的模型相比,KV 快取和量化的組合已被證明可以將推理時間減少多達 60%,吞吐量達到每秒數百個代幣。在 LLaMA 中,平行技術的使用確保即使是最大的模型(如 LLaMA 65B)也能保持高吞吐量,同時控制延遲。 這些優化使兩種模型能夠有效擴展,確保它們能夠處理現實世界的應用,從長上下文生成到即時回應,同時顯著減少計算和記憶體需求。 8.1 Transformer 推理的趨勢 隨著 Transformer 模型的規模和複雜性不斷增長,最佳化推理對於滿足實際應用的需求至關重要。下一波創新的重點是有效擴展變壓器模型、改善記憶體管理和利用先進的硬體功能。以下是影響變壓器推理未來的一些最具影響力的趨勢。 8.1.1 使用分頁和 FlashAttention 進行記憶體優化 一個關鍵趨勢是透過 PagedAttention 和 FlashAttention 等技術優化記憶體使用。在目前的推理過程中,模型通常會過度配置記憶體來處理最大可能的序列長度,從而導致效率低下。PagedAttention透過僅在需要時分配記憶體來解決這個問題,將鍵值 (KV) 快取分成更小的區塊並根據需要取得。 FlashAttention透過優化計算順序並減少記憶體和計算單元之間的資料移動進一步提高了記憶體效率。透過融合操作和利用 GPU 記憶體層次結構,FlashAttention 可以顯著減少記憶體浪費並實現更大的批次大小和更快的處理速度。這些進步對於擴展大型模型同時保持高效能至關重要。 8.1.2 多查詢和分組查詢注意 優化注意力機製本身是另一個重要趨勢。多重查詢注意力(MQA)和分組查詢注意力(GQA)是兩種在保持模型效能的同時減少記憶體佔用的變體。在 MQA 中,所有頭共享相同的鍵值對,這樣在保持準確性的同時減少了 KV 快取的大小。 分組查詢注意力 (GQA) 在 MQA 和傳統多頭注意力之間取得平衡,它對分組頭使用共享鍵值對。這種方法在保持高效能的同時進一步減少了記憶體使用量,使其對於像 LLaMA 2 70B 這樣的長上下文模型特別有用。 8.1.3 並行性:張量與序列 並行性仍然是擴展大型模型的核心策略。張量並行將模型層劃分為獨立的區塊,可跨多個 GPU 進行處理,從而減輕單一裝置的記憶體負擔。此方法對於注意力頭和前饋層非常有效,其中並行處理可以顯著提高效率。 vSequence 並行透過在序列維度上拆分 LayerNorm 和 Dropout 等操作進一步提高了記憶體效率。這減少了記憶體開銷,特別是對於長序列任務,並允許模型更有效地擴展。 8.1.4.即時應用的推測推理 對於即時應用,推測推理提供了一種減少延遲的創新方法。透過使用較小的草稿模型來預測未來的多個標記,推測推理可以實現並行執行。然後,主模型會驗證草稿令牌,然後決定接受或丟棄它們。 9.處理大型資料集 在大型資料集上訓練 Transformer 面臨獨特的挑戰,需要採取謹慎的策略: 9.1 高效率的資料載入與預處理 並行資料載入:利用 TensorFlowtf.data或 PyTorch等DataLoader多執行緒框架可以加快資料預處理速度。 混洗和批次:適當的混洗可以防止過度擬合任何特定的資料順序,而批次可以確保高效的 GPU 利用率。 9.2 分散式訓練 資料並行:模型在多個 GPU 上複製,每個 GPU 處理不同的小批量數據,並聚合梯度。 模型並行:模型本身分佈在多個 GPU 上,對於無法放入單一裝置記憶體的大型模型很有用。 9.3 混合精度訓練 利用 16 位元(半精度)浮點運算而不是 32 位元浮點運算可以顯著減少記憶體使用量並加快計算速度,而不會對準確度產生重大影響。 9.4 梯度累積 適用於批次大小受 GPU 記憶體限制的場景。在執行優化器步驟之前,梯度會在多個較小的批次中累積。 9.5 檢查點和恢復 在訓練期間定期保存模型狀態有助於在發生故障時從最後一個檢查點恢復,也可用於提前停止和微調的目的。 9.6 數據增強和採樣 資料增強技術增加了資料的可變性,有助於泛化。 智慧採樣策略確保模型不會過度擬合常見模式,而忽略罕見但重要的模式。 10. 結論 本學習文章深入探討大型語言模型 (LLM) 的開發和最佳化,首先概述其建構和訓練方法。它追溯了從 Transformer 之前模型到 Transformer 的變革性引入的演變,強調了關鍵的「注意力就是你所需要的一切」概念。 這篇的核心剖析了 Transformer 架構,詳細介紹了其嵌入層、編碼器-解碼器互動和自註意力機制等元件。它探索了各種 LLM 架構,包括 Seq-2-Seq、AutoEncoding 和 AutoRegressive 模型,闡明了它們獨特的功能。 對於實際部署,該學習文章研究了推理策略、最佳化技術(如量化、KV 快取、推測解碼和硬體並行性),並提供了 GPT-3 和 LLaMA 等真實範例。效能基準、記憶體最佳化和平行技術凸顯了高效 Transformer 推理的趨勢。 最後,文章討論如何處理大型資料集,討論了高效的資料處理、分散式訓練、混合精度技術和資料增強策略。本綜合指南將深入介紹如何有效地建置、最佳化和部署 LLM。
-
Promting 進階技巧整理
以下是我整理的一些promting 技巧, 上課前請各位去下載, 上課會直接講此投影片 以下是我對prompt coding+API調用的整理,放在我自己的教學Repo裏面。大家可以去fork https://github.com/kevin801221/prompt-eng-interactive-tutorial.git https://docs.google.com/presentation/d/1zCDJ33O4w7zT2053PojH1e7je7PrLQ0A501fidzO8RM/edit#slide=id.g31c41eee603_0_0
-
🚀 從零開始打造 RAG:深入理解 LlamaIndex 組件用llamaindex框架深入探討
這是一篇針對 LlamaIndex 的 RAG(檢索增強生成) 教學,將深入探討如何從零開始構建 RAG,並理解其內部機制。這份指南將著重於低層次的實作,避免直接使用高階封裝的函式,幫助你更好地理解 RAG 的每個核心組件,並自由組合來適應不同需求。 Optional:llamaindex 和 Langchain ?? 可參考我的medium有寫一篇簡單概述的https://kilong31442.medium.com/langchain-v-s-llamaindex-2fcfcbb36a47 🚀 從零開始打造 RAG:深入理解 LlamaIndex 組件 📌 介紹 這篇文章將指引你如何 從零開始構建 RAG(Retrieval-Augmented Generation),完全不依賴高階封裝的方法,而是透過最基礎的 LLM、嵌入模型、提示詞(prompt)與向量索引(vector store) 來打造一個可擴展的 RAG 系統。 我們將逐步構建 RAG 的核心組件,包括: 資料攝取(Ingestion) 向量檢索(Vector Retrieval) 回應合成(Response Synthesis) 混合搜尋(Hybrid Search) 問答與評估(QA & Evaluation) 高級檢索技術(Fusion Retrieval, Router) 結構化數據查詢(Text-to-SQL, Text-to-Pandas) 這些內容來自 LlamaIndex 的官方指南,你可以隨時參考完整文件:👉 官方文件 1️⃣ 構建資料攝取管道(Ingestion Pipeline) 📌 Ingestion from Scratch 資料攝取是 RAG 的第一步,我們需要將非結構化數據轉換為可檢索的向量格式,並存入向量數據庫。本節將示範如何 手動處理數據並建立索引,不使用 VectorStoreIndex.from_documents 等高階函式。 2️⃣ 構建向量檢索(Vector Retrieval) 📌 Vector Retrieval from Scratch 在這一部分,我們將學習如何 查詢向量數據庫,並建立自己的檢索系統,不依賴 VectorStoreIndex.as_retriever()。我們將探討: 如何計算相似度(Cosine / dot-product) 如何篩選與排序檢索結果 3️⃣ 使用開源技術構建 RAG(Open-Source Components) 📌 Open Source RAG 想要完全不依賴 OpenAI API,打造 本地端的 RAG 系統?這一部分將展示如何使用 開源 LLM、開源嵌入模型(如 sentence-transformers)、以及本地向量數據庫(如 FAISS 或 Qdrant)。 4️⃣ 從零開始構建簡易向量數據庫(Vector Store) 📌 Vector Store from Scratch 本節展示如何從基礎開始構建向量數據庫,使其具備 密集搜索(Dense Search)與元數據篩選(Metadata Filtering) 的能力。這對於想要理解向量數據庫的內部機制的工程師特別有幫助! 5️⃣ 構建回應合成(Response Synthesis) 📌 Response Synthesis from Scratch 當檢索到相關資訊後,LLM 需要根據這些內容生成回答。本節將探討: 如何有效利用檢索到的內容 如何處理 上下文溢出(Context Overflow) 如何 提供來源引用(Source Citation) 如何 進行非同步調用(Async Calls) 來提升效率 6️⃣ 建立 LLM 生成內容的評估機制(Evaluation) 📌 Evaluation from Scratch 這一部分將教你如何評估 RAG 系統的回應,確保其: 準確性(Correctness) 忠實度(Faithfulness) 我們將探討如何使用 LLM 建立 自定義評估模組,以確保系統輸出的可靠性。 7️⃣ 進階 RAG 技術(Advanced RAG) 📌 Building Advanced RAG from Scratch 如果你想進一步提升 RAG 的性能,這一部分將探討進階技術,包括: 混合搜尋(Hybrid Search) 查詢重寫(Query Rewriting) 檢索融合(Fusion Retrieval) 多步檢索(Multi-Step Retrieval) 8️⃣ 混合檢索(Hybrid Search) 📌 Building Hybrid Search from Scratch 混合檢索結合了 稀疏檢索(Sparse Retrieval, 如 BM25)與密集檢索(Dense Retrieval, 如 FAISS 向量搜索),能夠提升查詢結果的相關性。本節將示範如何構建自己的 Hybrid Search 模組。 9️⃣ 構建智慧路由(Router) 📌 Router from Scratch 除了基本的 RAG,LLM 也可以用來進行 決策與路由。這一部分展示如何構建 智能查詢路由器,自動決定: 是否要檢索數據 應該使用哪種類型的檢索 如何處理不同類型的問題 🔟 構建融合檢索(Fusion Retrieval) 📌 Fusion Retrieval from Scratch 本節將展示如何構建 進階檢索技術,包括: 查詢重寫(Query Rewriting) 動態檢索(Dynamic Retrieval) 檢索結果集成(Ensemble Retrieval) 這對於需要 更靈活檢索策略 的企業應用特別有幫助。 1️⃣1️⃣ 在結構化數據上進行問答(QA over Structured Data) 📌 Text-to-SQL from Scratch📌 Text-to-Pandas from Scratch 除了非結構化文本,LlamaIndex 也支援 結構化與半結構化數據(如 SQL 資料庫與 Pandas DataFrame)。這一部分將示範: 如何從零開始構建 Text-to-SQL 如何將 LLM 與 Pandas 整合,進行數據查詢 🎯 結論 這篇指南幫助你理解如何 從底層開始構建 RAG,讓你不再只是使用封裝好的高階函式,而是能夠 深入理解 RAG 的每個核心組件,並根據需求打造自己的 AI 工作流。 如果你對這些內容感興趣,歡迎深入閱讀 LlamaIndex 官方文件**,或關注更多的 **RAG 技術發展! 🚀 你的 RAG 之旅,現在開始! 🚀
-
🚀RAG深入探討組件(1)~(3)
這篇教學將指引你如何 從零開始構建數據攝取(Data Ingestion)流程,將文檔處理為向量並存入向量數據庫。我們不使用 LlamaIndex 的高階封裝,而是直接構建數據處理管道,幫助你了解內部細節。 完整教學的 官方文件:👉 LlamaIndex 官方文件 🚀 1.從零開始構建數據攝取管道(Data Ingestion) 📌 目標 在這篇教學中,我們將學習如何構建 數據攝取管道,將文本轉換為向量嵌入,並存入 Pinecone 向量數據庫。 主要步驟: 載入文檔 拆分文本 構建節點(Nodes) 提取元數據(Metadata, 選擇性) 生成嵌入向量 插入向量數據庫 查詢向量數據庫 1️⃣ 環境準備 我們需要安裝以下 Python 套件: pip install llama-index-embeddings-openai pip install llama-index-vector-stores-pinecone pip install llama-index-llms-openai pip install llama-index pip install python-dotenv pinecone-client pymupdf 🔑 設定 API Keys 你需要: Pinecone API Key(申請免費帳號) OpenAI API Key(取得 API 金鑰) 建立一個 .env 檔案來儲存 API Key: import os from dotenv import load_dotenv dotenv_path = "env" with open(dotenv_path, "w") as f: f.write('PINECONE_API_KEY="<your_api_key>"\n') f.write('OPENAI_API_KEY="<your_api_key>"\n') load_dotenv(dotenv_path=dotenv_path) 2️⃣ 建立 Pinecone 向量數據庫 我們將使用 Pinecone 作為向量儲存庫。 from pinecone import Pinecone, Index, ServerlessSpec api_key = os.environ["PINECONE_API_KEY"] pc = Pinecone(api_key=api_key) index_name = "llamaindex-rag-fs" # 創建索引(如不存在) if index_name not in pc.list_indexes().names(): pc.create_index( index_name, dimension=1536, # text-embedding-ada-002 的維度 metric="euclidean", spec=ServerlessSpec(cloud="aws", region="us-east-1"), ) pinecone_index = pc.Index(index_name) # 清除索引(可選) pinecone_index.delete(deleteAll=True) 🌟 建立 LlamaIndex 的 VectorStore from llama_index.vector_stores.pinecone import PineconeVectorStore vector_store = PineconeVectorStore(pinecone_index=pinecone_index) 3️⃣ 載入文檔 下載 LLaMA2 論文 PDF,並解析文本: import fitz file_path = "./data/llama2.pdf" doc = fitz.open(file_path) 4️⃣ 使用文本拆分器 我們使用 LlamaIndex 內建的 SentenceSplitter,將長文本拆分為小段落: from llama_index.core.node_parser import SentenceSplitter text_parser = SentenceSplitter(chunk_size=1024) text_chunks = [] doc_idxs = [] for doc_idx, page in enumerate(doc): page_text = page.get_text("text") cur_text_chunks = text_parser.split_text(page_text) text_chunks.extend(cur_text_chunks) doc_idxs.extend([doc_idx] * len(cur_text_chunks)) 5️⃣ 手動構建節點 LlamaIndex 的 TextNode 是一種低階數據抽象,我們手動創建節點並添加元數據: from llama_index.core.schema import TextNode nodes = [] for idx, text_chunk in enumerate(text_chunks): node = TextNode(text=text_chunk) nodes.append(node) # 測試:印出第一個節點內容 print(nodes[0].get_content(metadata_mode="all")) 6️⃣ (可選)提取元數據 如果想要提取 標題與關鍵問題,我們可以使用 LlamaIndex 的 MetadataExtractor: from llama_index.core.extractors import ( QuestionsAnsweredExtractor, TitleExtractor, ) from llama_index.core.ingestion import IngestionPipeline from llama_index.llms.openai import OpenAI llm = OpenAI(model="gpt-3.5-turbo") extractors = [ TitleExtractor(nodes=5, llm=llm), QuestionsAnsweredExtractor(questions=3, llm=llm), ] pipeline = IngestionPipeline(transformations=extractors) nodes = await pipeline.arun(nodes=nodes, in_place=False) # 測試:印出第一個節點的元數據 print(nodes[0].metadata) 7️⃣ 生成嵌入向量 我們使用 OpenAI 的 text-embedding-ada-002 模型來生成向量: from llama_index.embeddings.openai import OpenAIEmbedding embed_model = OpenAIEmbedding() for node in nodes: node_embedding = embed_model.get_text_embedding( node.get_content(metadata_mode="all") ) node.embedding = node_embedding 8️⃣ 將節點插入向量數據庫 vector_store.add(nodes) 9️⃣ 查詢向量數據庫 數據攝取完成後,我們可以開始查詢: from llama_index.core import VectorStoreIndex, StorageContext index = VectorStoreIndex.from_vector_store(vector_store) query_engine = index.as_query_engine() query_str = "Can you tell me about the key concepts for safety finetuning?" response = query_engine.query(query_str) print(str(response)) 🎯 總結 這篇教學展示了 從零開始構建數據攝取管道 的完整流程,幫助你: 載入文檔(PDF) 拆分文本(Sentence Splitter) 建立節點(TextNode) 提取元數據(TitleExtractor, QuestionsExtractor) 生成向量嵌入(OpenAI Embeddings) 插入向量數據庫(Pinecone) 執行查詢(VectorStoreIndex) 🚀 現在,你已經可以獨立構建 RAG 系統的數據攝取模組了! 🚀 這篇教學將指引你 從零開始構建檢索(Retrieval)系統,我們將不依賴高階封裝的檢索方法,而是逐步實作: 建立向量數據庫(Pinecone) 載入文檔並將其轉換為向量 手動生成查詢嵌入 查詢向量數據庫 解析結果 封裝成自訂檢索器(Retriever) 整合檢索器與查詢引擎 完整教學的 官方文件:👉 LlamaIndex 官方文件 🚀 2.從零開始構建檢索系統(Retrieval) 📌 目標 本教程將展示如何手動構建一個檢索系統,並將其整合到 LlamaIndex 的查詢引擎中。我們將使用 Pinecone 作為向量存儲庫,並學習如何: 生成查詢嵌入(Query Embeddings) 執行不同檢索模式(密集、稀疏、混合) 解析檢索結果 封裝為自訂檢索器(Retriever) 1️⃣ 環境準備 安裝所需的 Python 套件: pip install llama-index-readers-file pymupdf pip install llama-index-vector-stores-pinecone pip install llama-index-embeddings-openai pip install llama-index 🔑 設定 API Keys 你需要: Pinecone API Key(申請免費帳號) OpenAI API Key(取得 API 金鑰) import os from dotenv import load_dotenv dotenv_path = "env" with open(dotenv_path, "w") as f: f.write('PINECONE_API_KEY="<your_api_key>"\n') f.write('OPENAI_API_KEY="<your_api_key>"\n') load_dotenv(dotenv_path=dotenv_path) 2️⃣ 建立 Pinecone 向量數據庫 from pinecone import Pinecone, Index, ServerlessSpec api_key = os.environ["PINECONE_API_KEY"] pc = Pinecone(api_key=api_key) dataset_name = "quickstart" # 創建索引(如不存在) if dataset_name not in pc.list_indexes().names(): pc.create_index( dataset_name, dimension=1536, # text-embedding-ada-002 的維度 metric="euclidean", spec=ServerlessSpec(cloud="aws", region="us-east-1"), ) pinecone_index = pc.Index(dataset_name) # 清除索引(可選) pinecone_index.delete(deleteAll=True) 🌟 建立 LlamaIndex 的 VectorStore from llama_index.vector_stores.pinecone import PineconeVectorStore vector_store = PineconeVectorStore(pinecone_index=pinecone_index) 3️⃣ 載入文檔並轉換為向量 下載 LLaMA2 論文 PDF,並解析文本: !mkdir data !wget --user-agent "Mozilla" "https://arxiv.org/pdf/2307.09288.pdf" -O "data/llama2.pdf" from pathlib import Path from llama_index.readers.file import PyMuPDFReader loader = PyMuPDFReader() documents = loader.load(file_path="./data/llama2.pdf") 📌 載入文檔至向量存儲 我們使用 高階方法 VectorStoreIndex.from_documents 來加速載入數據: from llama_index.core import VectorStoreIndex from llama_index.core.node_parser import SentenceSplitter from llama_index.core import StorageContext splitter = SentenceSplitter(chunk_size=1024) storage_context = StorageContext.from_defaults(vector_store=vector_store) index = VectorStoreIndex.from_documents( documents, transformations=[splitter], storage_context=storage_context ) 4️⃣ 生成查詢嵌入 from llama_index.embeddings.openai import OpenAIEmbedding embed_model = OpenAIEmbedding() query_str = "Can you tell me about the key concepts for safety finetuning?" query_embedding = embed_model.get_query_embedding(query_str) 5️⃣ 查詢向量數據庫 我們支援 不同檢索模式: default(密集檢索 Dense) sparse(稀疏檢索 Sparse) hybrid(混合檢索 Hybrid) from llama_index.core.vector_stores import VectorStoreQuery query_mode = "default" # 可切換成 "sparse" 或 "hybrid" vector_store_query = VectorStoreQuery( query_embedding=query_embedding, similarity_top_k=2, mode=query_mode ) query_result = vector_store.query(vector_store_query) print(query_result) 6️⃣ 解析檢索結果 我們將結果封裝成 **NodeWithScore**,包含檢索到的內容與分數: from llama_index.core.schema import NodeWithScore from typing import Optional nodes_with_scores = [] for index, node in enumerate(query_result.nodes): score: Optional[float] = None if query_result.similarities is not None: score = query_result.similarities[index] nodes_with_scores.append(NodeWithScore(node=node, score=score)) 輸出檢索到的內容: from llama_index.core.response.notebook_utils import display_source_node for node in nodes_with_scores: display_source_node(node, source_length=1000) 7️⃣ 封裝成自訂檢索器(Retriever) from llama_index.core import QueryBundle from llama_index.core.retrievers import BaseRetriever from typing import Any, List class PineconeRetriever(BaseRetriever): """自訂檢索器,對 Pinecone 向量數據庫進行查詢""" def __init__( self, vector_store: PineconeVectorStore, embed_model: Any, query_mode: str = "default", similarity_top_k: int = 2, ) -> None: """初始化參數""" self._vector_store = vector_store self._embed_model = embed_model self._query_mode = query_mode self._similarity_top_k = similarity_top_k super().__init__() def _retrieve(self, query_bundle: QueryBundle) -> List[NodeWithScore]: """檢索處理""" if query_bundle.embedding is None: query_embedding = self._embed_model.get_query_embedding(query_bundle.query_str) else: query_embedding = query_bundle.embedding vector_store_query = VectorStoreQuery( query_embedding=query_embedding, similarity_top_k=self._similarity_top_k, mode=self._query_mode, ) query_result = self._vector_store.query(vector_store_query) nodes_with_scores = [] for index, node in enumerate(query_result.nodes): score: Optional[float] = None if query_result.similarities is not None: score = query_result.similarities[index] nodes_with_scores.append(NodeWithScore(node=node, score=score)) return nodes_with_scores 初始化檢索器: retriever = PineconeRetriever(vector_store, embed_model, query_mode="default", similarity_top_k=2) retrieved_nodes = retriever.retrieve(query_str) for node in retrieved_nodes: display_source_node(node, source_length=1000) 8️⃣ 整合查詢引擎 from llama_index.core.query_engine import RetrieverQueryEngine query_engine = RetrieverQueryEngine.from_args(retriever) response = query_engine.query(query_str) print(str(response)) 🎯 總結 這篇指南展示了 如何從零開始構建檢索系統,幫助你掌握: 生成查詢嵌入 執行不同模式的向量檢索 解析檢索結果 封裝為自訂檢索器 整合查詢引擎 🚀 現在,你已經可以獨立打造 RAG 系統的檢索模組! 🚀 好的,我會根據你的需求撰寫一篇完整的 「完全開源的 RAG 系統」 部落格文章,並在適當位置加入 Optional 章節,幫助讀者更深入理解 RAG 的運作機制,並提供額外的優化技巧。 這篇文章不僅涵蓋 LlamaIndex 官方指南的內容,還會補充: 可選的進階技巧(Optional Sections) 最佳實踐建議 額外的擴展選項 🚀 3.從零開始構建 完全開源 RAG 系統 📌 介紹 大多數 RAG(Retrieval-Augmented Generation)系統依賴 OpenAI API 或 雲端向量數據庫,這雖然方便,但在某些應用場景下,我們可能需要 完全開源的替代方案,例如: 隱私要求高的應用(如醫療或法律) 離線運行(On-Premise) 降低 API 成本 對 LLM、向量存儲和檢索技術有更深理解的需求 在這篇文章中,我們將使用 完全開源的技術堆疊 來構建 RAG 系統: 嵌入模型:Sentence Transformers 向量存儲:PostgreSQL + pgvector LLM(大型語言模型):Llama 2(透過 llama.cpp) 這篇教學將涵蓋: 數據攝取(Data Ingestion) 向量存儲(Vector Storage) 檢索管道(Retrieval Pipeline) 查詢處理(Query Processing) 1️⃣ 環境準備 🛠️ 安裝必要套件: pip install llama-index-readers-file pymupdf pip install llama-index-vector-stores-postgres pip install llama-index-embeddings-huggingface pip install llama-index-llms-llama-cpp pip install psycopg2-binary pgvector asyncpg "sqlalchemy[asyncio]" greenlet 🔑 設定 PostgreSQL 安裝 PostgreSQL & pgvector Linux / Mac:brew install postgresql brew services start postgresql **安裝 pgvector**:psql -d postgres -c "CREATE EXTENSION IF NOT EXISTS vector;" 建立用戶與資料庫:CREATE ROLE my_user WITH LOGIN PASSWORD 'my_password'; ALTER ROLE my_user SUPERUSER; CREATE DATABASE vector_db; 2️⃣ 嵌入模型(Embedding Model) 我們將使用 Hugging Face 的 BAAI/bge-small-en 模型來計算文本嵌入: from llama_index.embeddings.huggingface import HuggingFaceEmbedding embed_model = HuggingFaceEmbedding(model_name="BAAI/bge-small-en") ✅ Optional: 為何選擇 bge-small-en? 訓練良好,適合向量檢索 相較於 text-embedding-ada-002,它是 完全開源 的 若需更高性能,可以嘗試 BAAI/bge-large-en 3️⃣ 載入 Llama 2 作為 LLM 我們使用 llama.cpp 來載入 Llama 2-13B: from llama_index.llms.llama_cpp import LlamaCPP model_url = "https://huggingface.co/TheBloke/Llama-2-13B-chat-GGUF/resolve/main/llama-2-13b-chat.Q4_0.gguf" llm = LlamaCPP( model_url=model_url, model_path=None, temperature=0.1, max_new_tokens=256, context_window=3900, model_kwargs={"n_gpu_layers": 1}, verbose=True, ) ✅ Optional: 可以使用哪些開源 LLM? Llama 3(即將推出) Mistral 7B Falcon 40B ChatGLM 3 4️⃣ 建立 PostgreSQL 向量存儲 import psycopg2 from llama_index.vector_stores.postgres import PGVectorStore db_name = "vector_db" host = "localhost" password = "my_password" port = "5432" user = "my_user" conn = psycopg2.connect( dbname="postgres", host=host, password=password, port=port, user=user, ) conn.autocommit = True with conn.cursor() as c: c.execute(f"DROP DATABASE IF EXISTS {db_name}") c.execute(f"CREATE DATABASE {db_name}") vector_store = PGVectorStore.from_params( database=db_name, host=host, password=password, port=port, user=user, table_name="llama2_paper", embed_dim=384, ) ✅ Optional: 其他開源向量存儲 Chroma Weaviate Qdrant 5️⃣ 數據攝取管道 1. 載入文檔 from llama_index.readers.file import PyMuPDFReader loader = PyMuPDFReader() documents = loader.load(file_path="./data/llama2.pdf") 2. 拆分文本 from llama_index.core.node_parser import SentenceSplitter text_parser = SentenceSplitter(chunk_size=1024) text_chunks = [] doc_idxs = [] for doc_idx, doc in enumerate(documents): cur_text_chunks = text_parser.split_text(doc.text) text_chunks.extend(cur_text_chunks) doc_idxs.extend([doc_idx] * len(cur_text_chunks)) 3. 轉換為節點 from llama_index.core.schema import TextNode nodes = [] for idx, text_chunk in enumerate(text_chunks): node = TextNode(text=text_chunk) nodes.append(node) 4. 生成嵌入 for node in nodes: node.embedding = embed_model.get_text_embedding(node.get_content(metadata_mode="all")) 5. 插入向量存儲 vector_store.add(nodes) 6️⃣ 檢索管道 1. 生成查詢嵌入 query_str = "How does Llama 2 compare to other models?" query_embedding = embed_model.get_query_embedding(query_str) 2. 執行向量檢索 from llama_index.core.vector_stores import VectorStoreQuery vector_store_query = VectorStoreQuery( query_embedding=query_embedding, similarity_top_k=2, mode="default" ) query_result = vector_store.query(vector_store_query) 3. 解析結果 from llama_index.core.schema import NodeWithScore nodes_with_scores = [ NodeWithScore(node=node, score=query_result.similarities[i]) for i, node in enumerate(query_result.nodes) ] 7️⃣ 整合查詢引擎 from llama_index.core.query_engine import RetrieverQueryEngine retriever = VectorDBRetriever(vector_store, embed_model) query_engine = RetrieverQueryEngine.from_args(retriever, llm=llm) response = query_engine.query(query_str) print(str(response)) ✅ Optional: 如何提升檢索性能? 使用 Hybrid Search(混合檢索) 結合 BM25 作關鍵字匹配 嘗試 Query Expansion(查詢擴展) 🎯 結論 我們構建了一個 完全開源 的 RAG 系統,無需依賴 OpenAI 或商業 API,適合:✅ 高隱私場景✅ 離線應用✅ 客製化需求 🚀 現在,你可以打造自己的開源 RAG 系統了! 🚀 這是一個 關鍵的 Optional 章節,我會將它納入前面「完全開源的 RAG 系統」部落格中的 Optional 部分,作為「進階檢索技術 - 簡易 Hybrid Search」。這樣讀者在學完基本的向量檢索後,可以更進一步學習如何將 向量檢索(Semantic Search)與關鍵字檢索(Keyword Lookup) 結合,提高檢索的準確度與靈活性。 ✅ Optional: 進階檢索技術 - 簡易 Hybrid Search 在標準的 RAG 流程中,我們通常使用 向量檢索(Vector Retrieval),即: 對 Query 進行嵌入(Embedding) 從向量存儲中檢索 Top-K 相似結果 傳遞給 LLM 進行回答生成 這種方法的優勢是: 能夠理解語意相似性 可以檢索到未必完全匹配關鍵字的內容 但它也有一些問題: 無法處理 精確匹配(Exact Match) 可能忽略關鍵字的重要性 在數據量少時,語意相似度可能不準確 🚀 解決方案:Hybrid Search Hybrid Search(混合檢索) 結合了: 向量檢索(Semantic Search) 關鍵字檢索(Keyword Lookup) 這樣我們可以在查詢時: 若關鍵字命中(Keyword Match),則優先返回完全匹配的內容 若關鍵字沒有命中,則回退至語意檢索(Vector Retrieval) 可使用「AND」與「OR」條件 來調整查詢模式 這種方式特別適合:✅ 企業內部知識庫(Enterprise KB)✅ FAQ 檢索系統✅ 結構化數據的 RAG 應用 🛠 1️⃣ Hybrid Search 的基本架構 這裡我們使用 LlamaIndex 來建立 兩種不同的索引: 向量索引(VectorStoreIndex) - 用來進行語意檢索 關鍵字索引(SimpleKeywordTableIndex) - 用來進行關鍵字匹配 from llama_index.core import SimpleDirectoryReader, StorageContext from llama_index.core import SimpleKeywordTableIndex, VectorStoreIndex # 讀取文檔 documents = SimpleDirectoryReader("./data/paul_graham").load_data() # 轉換為節點 nodes = Settings.node_parser.get_nodes_from_documents(documents) # 建立存儲上下文 storage_context = StorageContext.from_defaults() storage_context.docstore.add_documents(nodes) # 建立向量索引 & 關鍵字索引 vector_index = VectorStoreIndex(nodes, storage_context=storage_context) keyword_index = SimpleKeywordTableIndex(nodes, storage_context=storage_context) 🔍 2️⃣ 自訂 Hybrid Search 檢索器 我們自訂一個 CustomRetriever: 先使用向量檢索 再使用關鍵字檢索 使用 AND 或 OR 模式來決定如何合併結果 from llama_index.core import QueryBundle from llama_index.core.schema import NodeWithScore from llama_index.core.retrievers import ( BaseRetriever, VectorIndexRetriever, KeywordTableSimpleRetriever, ) from typing import List class CustomRetriever(BaseRetriever): """自訂混合檢索 Retriever""" def __init__( self, vector_retriever: VectorIndexRetriever, keyword_retriever: KeywordTableSimpleRetriever, mode: str = "AND", # 可選 "AND" 或 "OR" ) -> None: """初始化參數""" self._vector_retriever = vector_retriever self._keyword_retriever = keyword_retriever if mode not in ("AND", "OR"): raise ValueError("Invalid mode.") self._mode = mode super().__init__() def _retrieve(self, query_bundle: QueryBundle) -> List[NodeWithScore]: """執行檢索""" vector_nodes = self._vector_retriever.retrieve(query_bundle) keyword_nodes = self._keyword_retriever.retrieve(query_bundle) vector_ids = {n.node.node_id for n in vector_nodes} keyword_ids = {n.node.node_id for n in keyword_nodes} combined_dict = {n.node.node_id: n for n in vector_nodes} combined_dict.update({n.node.node_id: n for n in keyword_nodes}) if self._mode == "AND": retrieve_ids = vector_ids.intersection(keyword_ids) else: retrieve_ids = vector_ids.union(keyword_ids) retrieve_nodes = [combined_dict[rid] for rid in retrieve_ids] return retrieve_nodes ⚙️ 3️⃣ 建立 Hybrid Query Engine 我們將檢索器嵌入 RetrieverQueryEngine,並測試查詢: from llama_index.core import get_response_synthesizer from llama_index.core.query_engine import RetrieverQueryEngine # 建立向量檢索器 vector_retriever = VectorIndexRetriever(index=vector_index, similarity_top_k=2) # 建立關鍵字檢索器 keyword_retriever = KeywordTableSimpleRetriever(index=keyword_index) # 設定自訂混合檢索 custom_retriever = CustomRetriever(vector_retriever, keyword_retriever, mode="AND") # 定義 LLM 回應處理 response_synthesizer = get_response_synthesizer() # 建立查詢引擎 custom_query_engine = RetrieverQueryEngine( retriever=custom_retriever, response_synthesizer=response_synthesizer, ) 📝 4️⃣ 測試 Hybrid Search ✅ 測試 1:檢索與 YC 相關的內容 response = custom_query_engine.query("What did the author do during his time at YC?") print(response) 📌 結果 During his time at YC, the author worked on various projects, including writing essays and working on YC itself... ✅ 測試 2:關鍵字不匹配時的效果 response = custom_query_engine.query("What did the author do during his time at Yale?") print(response) 📌 結果 Empty Response 📢 Hybrid Search 能夠避免不相關的檢索結果! ✅ 測試 3:純向量檢索 vector_response = vector_query_engine.query("What did the author do during his time at Yale?") print(vector_response) 📌 結果 The context information does not provide any information about the author's time at Yale. 📢 向量檢索可能會產生與內容無關的回應,但 Hybrid Search 可避免這種情況! 🎯 結論 在這個 Optional 章節中,我們學習了: Hybrid Search 的必要性(解決語意檢索的精確匹配問題) 如何結合關鍵字索引與向量索引 如何自訂 Retriever 如何測試 Hybrid Search 📌 適用場景 內部文件檢索 FAQ 知識庫 法規與政策文件查詢 完整教學文件:👉 LlamaIndex 官方文件 🚀 現在,你的 RAG 系統已經支援 Hybrid Search 了! 🚀
-
🚀RAG 組件(4)~final
✅ Optional: 進階技術 - 從零開始打造向量存儲(Vector Store) 在 RAG 系統中,向量存儲庫(Vector Store)是檢索模組的 核心組件,負責存儲文件的向量嵌入,並在查詢時返回相似內容。在這個章節中,我們將: 手寫一個簡易的向量存儲 實作語意檢索(Semantic Search) 加入 Metadata Filtering 測試向量檢索與 Metadata 過濾 思考如何優化檢索性能 這將幫助你深入理解 向量數據庫的底層運作原理,並為你開發自己的向量檢索系統打下堅實基礎。 1️⃣ 環境準備 首先,我們需要安裝一些 必要的 Python 套件: pip install llama-index-readers-file pymupdf pip install llama-index-embeddings-openai 我們也需要下載測試數據: mkdir data wget --user-agent "Mozilla" "https://arxiv.org/pdf/2307.09288.pdf" -O "data/llama2.pdf" 2️⃣ 載入 PDF 文檔 我們使用 llama-index 來讀取 PDF 文檔,並將其解析為文本: from pathlib import Path from llama_index.readers.file import PyMuPDFReader loader = PyMuPDFReader() documents = loader.load(file_path="./data/llama2.pdf") 3️⃣ 將文檔轉換為節點(Nodes) 在 RAG 系統中,為了提高檢索的效果,我們通常會 將文本拆分成小塊,這樣可以讓向量檢索更準確: from llama_index.core.node_parser import SentenceSplitter node_parser = SentenceSplitter(chunk_size=256) nodes = node_parser.get_nodes_from_documents(documents) 4️⃣ 為每個節點生成嵌入向量 現在,我們使用 OpenAI 的 text-embedding-ada-002 來生成向量: from llama_index.embeddings.openai import OpenAIEmbedding embed_model = OpenAIEmbedding() for node in nodes: node_embedding = embed_model.get_text_embedding( node.get_content(metadata_mode="all") ) node.embedding = node_embedding 5️⃣ 建立一個簡單的 In-Memory 向量存儲 我們來 手寫一個 Python 版的 Vector Store,它可以: 新增(add) 節點 獲取(get) 節點 刪除(delete) 節點 查詢(query) 節點 📌 5.1 定義 Vector Store 基本架構 from typing import List, Dict, Any from llama_index.core.schema import BaseNode, TextNode class SimpleVectorStore: """一個簡單的 In-Memory 向量存儲""" def __init__(self): self.node_dict: Dict[str, BaseNode] = {} def add(self, nodes: List[BaseNode]) -> None: """新增節點""" for node in nodes: self.node_dict[node.node_id] = node def get(self, node_id: str) -> BaseNode: """獲取節點""" return self.node_dict.get(node_id, None) def delete(self, node_id: str) -> None: """刪除節點""" if node_id in self.node_dict: del self.node_dict[node_id] 📌 5.2 測試 Vector Store test_node1 = TextNode(id_="1", text="Hello, this is a test node.") test_node2 = TextNode(id_="2", text="This is another node for testing.") vector_store = SimpleVectorStore() vector_store.add([test_node1, test_node2]) print(vector_store.get("1")) # 測試獲取 vector_store.delete("2") print(vector_store.get("2")) # 測試刪除,應該輸出 None 6️⃣ 加入語意檢索(Semantic Search) 現在我們要讓這個向量存儲庫支援 語意檢索,即: 計算查詢向量與所有文件的相似度 取前 K 個最相似的文件 我們用 餘弦相似度(Cosine Similarity) 來計算向量之間的距離: import numpy as np from typing import Tuple def get_top_k_embeddings( query_embedding: List[float], doc_embeddings: List[List[float]], doc_ids: List[str], similarity_top_k: int = 5, ) -> Tuple[List[float], List]: """計算餘弦相似度,返回 Top-K 結果""" qembed_np = np.array(query_embedding) dembed_np = np.array(doc_embeddings) cos_sim = np.dot(dembed_np, qembed_np) / (np.linalg.norm(qembed_np) * np.linalg.norm(dembed_np, axis=1)) sorted_indices = np.argsort(cos_sim)[::-1][:similarity_top_k] sorted_similarities = cos_sim[sorted_indices] sorted_ids = [doc_ids[i] for i in sorted_indices] return sorted_similarities, sorted_ids 7️⃣ 加入 Metadata Filtering 有時候我們需要根據 Metadata(元數據) 來篩選文件: from llama_index.core.vector_stores import MetadataFilters def filter_nodes(nodes: List[BaseNode], filters: MetadataFilters) -> List[BaseNode]: """根據 Metadata 過濾節點""" filtered_nodes = [] for node in nodes: matches = True for f in filters.filters: if f.key not in node.metadata: matches = False continue if f.value != node.metadata[f.key]: matches = False continue if matches: filtered_nodes.append(node) return filtered_nodes 8️⃣ 測試查詢 現在我們來測試 向量檢索 + Metadata 過濾: vector_store = SimpleVectorStore() vector_store.add(nodes) # 加入節點 # 測試語意檢索 query_str = "Can you tell me about the key concepts for safety finetuning" query_embedding = embed_model.get_query_embedding(query_str) query_result = get_top_k_embeddings(query_embedding, [n.embedding for n in nodes], [n.node_id for n in nodes], similarity_top_k=2) for similarity, node_id in zip(query_result[0], query_result[1]): print(f"[Node ID {node_id}] Similarity: {similarity}\n") print(vector_store.get(node_id).get_content(metadata_mode="all")) print("\n----------------\n") 🎯 總結 在這個 Optional 章節中,我們: 從零開始構建了一個簡單的 In-Memory 向量存儲 實作了語意檢索(Semantic Search) 加入了 Metadata Filtering 測試了查詢效果 思考了如何優化檢索性能(FAISS, HNSW, Annoy) 📌 完整教學文件:👉 LlamaIndex 官方文件 從零開始構建回應合成:RAG 教學 簡介 檢索增強生成(RAG)管道是一種強大的方法,透過檢索相關文件來增強 LLM 的表現。其中,回應合成(Response Synthesis)是 RAG 系統的關鍵組件之一,負責將檢索到的節點(nodes)組合成最終答案。然而,當檢索的上下文超出模型的 token 限制時,有效的合成策略變得至關重要。 本教學將探討多種回應合成策略,並使用 LlamaIndex 與 OpenAI LLM 來實作。 你將學到的內容 使用簡單提示詞(prompt)進行回應合成 如何使用 建立與改進(Create and Refine) 策略處理上下文溢出 階層式摘要(Hierarchical Summarization) 的實作方法 使用非同步方式提升合成效率 將所有技術整合到簡單的查詢引擎中 [Optional] 如何優化回應合成效能 前置準備 請確保已安裝所需的 Python 套件: %pip install llama-index-readers-file pymupdf %pip install llama-index-vector-stores-pinecone %pip install llama-index-llms-openai %pip install llama-index 步驟 1:設置環境 我們將建立一個 Pinecone 向量存儲(vector store)並準備 LlamaIndex 組件。 載入數據 我們將下載範例 PDF 文件並使用 PyMuPDFReader 讀取它。 !mkdir data !wget --user-agent "Mozilla" "https://arxiv.org/pdf/2307.09288.pdf" -O "data/llama2.pdf" from pathlib import Path from llama_index.readers.file import PyMuPDFReader loader = PyMuPDFReader() documents = loader.load(file_path="./data/llama2.pdf") 建立 Pinecone 索引與檢索器 初始化 Pinecone 並創建一個向量存儲,設定 chunk 大小為 1024。 import pinecone import os api_key = os.environ["PINECONE_API_KEY"] pinecone.init(api_key=api_key, environment="us-west1-gcp") pinecone.create_index("quickstart", dimension=1536, metric="euclidean", pod_type="p1") pinecone_index = pinecone.Index("quickstart") pinecone_index.delete(deleteAll=True) from llama_index.vector_stores.pinecone import PineconeVectorStore from llama_index.core import VectorStoreIndex from llama_index.core.node_parser import SentenceSplitter from llama_index.core import StorageContext vector_store = PineconeVectorStore(pinecone_index=pinecone_index) splitter = SentenceSplitter(chunk_size=1024) storage_context = StorageContext.from_defaults(vector_store=vector_store) index = VectorStoreIndex.from_documents(documents, transformations=[splitter], storage_context=storage_context) retriever = index.as_retriever() 步驟 2:實作回應合成 基礎回應合成 我們從最基本的方法開始,將檢索到的節點全部放入單一提示詞中。 from llama_index.llms.openai import OpenAI from llama_index.core import PromptTemplate llm = OpenAI(model="text-davinci-003") qa_prompt = PromptTemplate( """ 以下是上下文資訊: --------------------- {context_str} --------------------- 根據上述上下文資訊,請回答問題。 問題: {query_str} 答案: """ ) 處理上下文溢出:建立與改進策略 若檢索的上下文過長,我們可以透過逐步改進來處理。 refine_prompt = PromptTemplate( """ 原始問題如下: {query_str} 我們已提供一個初步答案: {existing_answer} 我們可以利用以下新的上下文來改進這個答案(若需要)。 ------------ {context_str} ------------ 根據新的上下文,請改進原始答案。 若無需修改,請返回原始答案。 改進後的答案: """ ) 階層式摘要策略 透過遞歸方式將檢索的節點進行逐步合併。 def combine_results(texts, query_str, qa_prompt, llm, num_children=5): new_texts = [] for idx in range(0, len(texts), num_children): text_batch = texts[idx : idx + num_children] context_str = "\n\n".join([t for t in text_batch]) fmt_qa_prompt = qa_prompt.format(context_str=context_str, query_str=query_str) combined_response = llm.complete(fmt_qa_prompt) new_texts.append(str(combined_response)) if len(new_texts) == 1: return new_texts[0] else: return combine_results(new_texts, query_str, qa_prompt, llm, num_children=num_children) 步驟 3:整合所有技術 我們將檢索器、回應合成方法整合成一個查詢引擎。 class MyQueryEngine: def __init__(self, retriever, qa_prompt, llm, num_children=5): self.retriever = retriever self.qa_prompt = qa_prompt self.llm = llm self.num_children = num_children def query(self, query_str): retrieved_nodes = self.retriever.retrieve(query_str) return combine_results(retrieved_nodes, query_str, self.qa_prompt, self.llm, self.num_children) [Optional] 優化與改進回應合成效能 使用 非同步處理(Async Processing) 來加快查詢速度。 結合 分批處理(Batch Processing),提高模型推理效能。 微調提示詞(Prompt Engineering)以產生更精確的回應。 總結 本教學介紹了多種回應合成策略,並展示了如何在 RAG 管道中有效地處理大量檢索數據。 簡單合成法 適用於小型上下文 建立與改進策略 可用於逐步擴展答案 階層式摘要 幫助壓縮資訊並提高效率 非同步查詢與分批處理 可提升查詢效能 透過這些技術,您可以構建更強大的 RAG 系統! 從零開始構建回應合成與評估:RAG 教學 簡介 檢索增強生成(RAG)管道是一種強大的方法,透過檢索相關文件來增強 LLM 的表現。其中,回應合成(Response Synthesis)是 RAG 系統的關鍵組件之一,負責將檢索到的節點(nodes)組合成最終答案。此外,評估這些回應的質量也是一個重要步驟,可以確保生成的回應準確且忠於原始資訊。 本教學將探討多種回應合成與評估策略,並使用 LlamaIndex 與 OpenAI LLM 來實作。 你將學到的內容 使用簡單提示詞(prompt)進行回應合成 如何使用 建立與改進(Create and Refine) 策略處理上下文溢出 階層式摘要(Hierarchical Summarization) 的實作方法 正確性(Correctness) 和 忠誠度(Faithfulness) 評估方法 使用非同步方式提升合成效率 檢索評估(Retrieval Evaluation) 與 LlamaIndex 內建的評估模組 問題生成(Question Generation) 技術應用 將所有技術整合到簡單的查詢引擎中 [Optional] 如何優化回應合成效能 評估概念 評估與基準測試是 LLM 開發中的關鍵概念。要提升 LLM 應用(如 RAG 或 Agent)的表現,必須有方法來衡量其效果。 LlamaIndex 提供了多種評估模組,以測量生成結果的質量以及檢索結果的相關性。 回應評估(Response Evaluation) 正確性(Correctness):檢查生成的答案是否與參考答案一致(需要標註資料)。 語義相似性(Semantic Similarity):檢查生成的答案是否與參考答案在語義上相似(需要標註資料)。 忠誠度(Faithfulness):檢查生成的答案是否忠於檢索的上下文(避免幻覺)。 上下文相關性(Context Relevancy):檢查檢索到的內容是否與問題相關。 答案相關性(Answer Relevancy):檢查生成的答案是否與問題相關。 準則遵循(Guideline Adherence):檢查生成的答案是否符合特定準則。 問題生成(Question Generation) LlamaIndex 也可以利用現有的數據集自動生成問題,以進行更全面的評估。 檢索評估(Retrieval Evaluation) 我們也提供模組來獨立評估檢索結果。 核心步驟包括: 數據集生成:從非結構化文本生成 (問題, 上下文) 配對。 檢索評估:使用排名指標(如 MRR、hit-rate、precision)評估檢索效果。 LlamaIndex 提供的評估模組可直接用於上述步驟。 相關工具整合 LlamaIndex 也整合了社群評估工具,如: UpTrain Tonic Validate(包含可視化結果的 Web UI) DeepEval Ragas RAGChecker 使用模式 完整的使用細節請參考以下模式: 查詢評估模式(Query Eval Usage Pattern) 檢索評估模式(Retrieval Eval Usage Pattern) 模組與筆記本 有關如何使用這些評估組件,請參閱對應的模組指南。 RAG 系統的標註評估數據集(LabelledRagDataset) 有關如何使用標註數據集來評估 RAG 系統的詳細說明,請參閱專門的指南。 從零開始構建回應合成與評估:RAG 教學 簡介 檢索增強生成(RAG)管道是一種強大的方法,透過檢索相關文件來增強 LLM 的表現。其中,回應合成(Response Synthesis)是 RAG 系統的關鍵組件之一,負責將檢索到的節點(nodes)組合成最終答案。此外,評估這些回應的質量也是一個重要步驟,可以確保生成的回應準確且忠於原始資訊。 本教學將探討多種回應合成與評估策略,並使用 LlamaIndex 與 OpenAI LLM 來實作。 你將學到的內容 使用簡單提示詞(prompt)進行回應合成 如何使用 建立與改進(Create and Refine) 策略處理上下文溢出 階層式摘要(Hierarchical Summarization) 的實作方法 正確性(Correctness) 和 忠誠度(Faithfulness) 評估方法 使用非同步方式提升合成效率 將所有技術整合到簡單的查詢引擎中 [Optional] 如何優化回應合成效能 前置準備 請確保已安裝所需的 Python 套件: %pip install llama-index-readers-file pymupdf %pip install llama-index-vector-stores-pinecone %pip install llama-index-llms-openai %pip install llama-index 步驟 1:設置環境 我們將建立一個 Pinecone 向量存儲(vector store)並準備 LlamaIndex 組件。 載入數據 我們將下載範例 PDF 文件並使用 PyMuPDFReader 讀取它。 !mkdir data !wget --user-agent "Mozilla" "https://arxiv.org/pdf/2307.09288.pdf" -O "data/llama2.pdf" from pathlib import Path from llama_index.readers.file import PyMuPDFReader loader = PyMuPDFReader() documents = loader.load(file_path="./data/llama2.pdf") 建立 Pinecone 索引與檢索器 初始化 Pinecone 並創建一個向量存儲,設定 chunk 大小為 1024。 import pinecone import os api_key = os.environ["PINECONE_API_KEY"] pinecone.init(api_key=api_key, environment="us-west1-gcp") pinecone.create_index("quickstart", dimension=1536, metric="euclidean", pod_type="p1") pinecone_index = pinecone.Index("quickstart") pinecone_index.delete(deleteAll=True) from llama_index.vector_stores.pinecone import PineconeVectorStore from llama_index.core import VectorStoreIndex from llama_index.core.node_parser import SentenceSplitter from llama_index.core import StorageContext vector_store = PineconeVectorStore(pinecone_index=pinecone_index) splitter = SentenceSplitter(chunk_size=1024) storage_context = StorageContext.from_defaults(vector_store=vector_store) index = VectorStoreIndex.from_documents(documents, transformations=[splitter], storage_context=storage_context) retriever = index.as_retriever() 步驟 2:實作回應合成 基礎回應合成 我們從最基本的方法開始,將檢索到的節點全部放入單一提示詞中。 from llama_index.llms.openai import OpenAI from llama_index.core import PromptTemplate llm = OpenAI(model="text-davinci-003") qa_prompt = PromptTemplate( """ 以下是上下文資訊: --------------------- {context_str} --------------------- 根據上述上下文資訊,請回答問題。 問題: {query_str} 答案: """ ) 處理上下文溢出:建立與改進策略 若檢索的上下文過長,我們可以透過逐步改進來處理。 refine_prompt = PromptTemplate( """ 原始問題如下: {query_str} 我們已提供一個初步答案: {existing_answer} 我們可以利用以下新的上下文來改進這個答案(若需要)。 ------------ {context_str} ------------ 根據新的上下文,請改進原始答案。 若無需修改,請返回原始答案。 改進後的答案: """ ) 步驟 3:回應評估 正確性評估(Correctness Evaluation) 我們比較模型生成的答案與標準答案之間的相似度,並評分 1 到 5 分。 CORRECTNESS_SYS_TMPL = """ 你是一個專業的評估系統,負責評估問答機器人的準確性。 根據以下資訊進行評估: - 使用者問題 - 參考答案 - 生成答案 請評分 1 至 5 分,並解釋你的評分理由。 """ 忠誠度評估(Faithfulness Evaluation) 我們確保生成的答案是否忠於檢索到的內容,而非憑空捏造。 EVAL_TEMPLATE = PromptTemplate( """ 請判斷以下資訊是否受到上下文支持。 如果任何上下文支持此資訊,請回答 YES,否則回答 NO。 資訊: {query_str} 上下文: {context_str} 答案: """ ) 步驟 4:整合所有技術 我們將檢索器、回應合成與評估方法整合成一個查詢引擎。 class MyQueryEngine: def __init__(self, retriever, qa_prompt, llm, num_children=5): self.retriever = retriever self.qa_prompt = qa_prompt self.llm = llm self.num_children = num_children def query(self, query_str): retrieved_nodes = self.retriever.retrieve(query_str) return combine_results(retrieved_nodes, query_str, self.qa_prompt, self.llm, self.num_children) 總結 本教學介紹了回應合成與評估方法,確保 RAG 系統生成的答案既準確又忠於檢索內容。 回應合成:簡單合成、建立與改進、階層式摘要 評估方法:正確性評估、忠誠度評估 非同步處理與批量處理 提升查詢效能 不落格風格教學日誌:從零開始打造 Retrieval 系統 這篇教學日誌紀錄了如何建立一個標準的 Retriever 來對一個向量資料庫(Vector Database)進行檢索,以便透過相似度進行資料查詢。文中使用了 Pinecone 作為向量資料庫,並搭配 LlamaIndex(又稱 GPT Index)相關模組進行文件載入與檢索。 在這篇教學日誌中,你將會學到: 如何生成 Query Embedding 如何使用不同的檢索模式(Dense、Sparse、Hybrid)查詢向量資料庫 如何將查詢結果轉為 Nodes 如何將檢索流程封裝成自訂 Retriever 文末也會提供一些反向思考與進階課題,供同學參考與延伸學習。讓我們開始吧! 目錄 環境設定與安裝 建立 Pinecone Index 建立 PineconeVectorStore 載入文件 文件切割並載入 Vector Store 定義 Vector Retriever Step 1:生成 Query Embedding Step 2:查詢向量資料庫 Step-3:將結果轉成-nodes Step-4:將流程包裝成-retriever-類別 將 Retriever 插入 RetrieverQueryEngine 做回應生成 反向思考:為什麼要這樣做? Optional 進階教學 環境設定與安裝 如果你在 Colab 或其他環境上,請先執行下列指令來安裝所需套件(或確保已安裝): %pip install llama-index-readers-file pymupdf %pip install llama-index-vector-stores-pinecone %pip install llama-index-embeddings-openai !pip install llama-index 如環境中已安裝上述套件,可跳過此步驟。 建立 Pinecone Index 在下方程式碼中,會透過 Pinecone API 建立(或存取)我們想要的 Index。我們使用 text-embedding-ada-002 作為預設的嵌入模型,其維度是 1536。另外,如果之前的 Index 中已有內容,可以透過 pinecone_index.delete(deleteAll=True) 來刪除所有資料重新開始。 from pinecone import Pinecone, Index, ServerlessSpec import os api_key = os.environ["PINECONE_API_KEY"] # 確保你有設定這個環境變數 pc = Pinecone(api_key=api_key) # dimensions are for text-embedding-ada-002 dataset_name = "quickstart" if dataset_name not in pc.list_indexes().names(): pc.create_index( dataset_name, dimension=1536, metric="euclidean", spec=ServerlessSpec(cloud="aws", region="us-east-1"), ) pinecone_index = pc.Index(dataset_name) # [Optional] drop contents in index pinecone_index.delete(deleteAll=True) 建立 PineconeVectorStore 透過 PineconeVectorStore 包裝 pinecone_index,並存放在 StorageContext 中。這樣一來,我們就可以在 LlamaIndex 的高階 API 中直接使用此向量存儲。 from llama_index.vector_stores.pinecone import PineconeVectorStore vector_store = PineconeVectorStore(pinecone_index=pinecone_index) 載入文件 在這個範例中,我們載入了一份 PDF(llama2.pdf)檔案作為測試文件。透過 PyMuPDFReader 讀取 PDF 並轉為 Document 物件。 !mkdir data !wget --user-agent "Mozilla" "https://arxiv.org/pdf/2307.09288.pdf" -O "data/llama2.pdf" from pathlib import Path from llama_index.readers.file import PyMuPDFReader loader = PyMuPDFReader() documents = loader.load(file_path="./data/llama2.pdf") 文件切割並載入 Vector Store 這一步會透過 SentenceSplitter 以一定大小(chunk_size=1024)對文件進行切割,再將分段後的文件載入到向量存儲裡。 由於我們想更直觀地操作,在此直接利用 VectorStoreIndex.from_documents 進行高階封裝,將文件與向量儲存結合。 注意: 本文後半段的檢索過程則是 “從零開始” ,較少使用高階索引的功能,直接操作底層查詢。 from llama_index.core import VectorStoreIndex from llama_index.core.node_parser import SentenceSplitter from llama_index.core import StorageContext splitter = SentenceSplitter(chunk_size=1024) storage_context = StorageContext.from_defaults(vector_store=vector_store) index = VectorStoreIndex.from_documents( documents, transformations=[splitter], storage_context=storage_context ) 定義 Vector Retriever 下面示範如何自行撰寫 Retriever,並一步一步展開整個檢索流程。 預設的查詢字串: query_str = "Can you tell me about the key concepts for safety finetuning" Step 1:生成 Query Embedding 我們使用 OpenAIEmbedding 取得嵌入表徵(embedding),用來與向量資料庫中的內容進行相似度比對。 from llama_index.embeddings.openai import OpenAIEmbedding embed_model = OpenAIEmbedding() query_embedding = embed_model.get_query_embedding(query_str) Step 2:查詢向量資料庫 定義一個 VectorStoreQuery,其中包含我們的 query_embedding、要取回的節點數(similarity_top_k=2),以及檢索模式("default", "sparse", "hybrid" 皆可指定)。 # construct vector store query from llama_index.core.vector_stores import VectorStoreQuery query_mode = "default" # query_mode = "sparse" # query_mode = "hybrid" vector_store_query = VectorStoreQuery( query_embedding=query_embedding, similarity_top_k=2, mode=query_mode ) # returns a VectorStoreQueryResult query_result = vector_store.query(vector_store_query) query_result Step 3:將結果轉成 Nodes VectorStoreQueryResult 會回傳一串 Node 與對應的相似度(similarities)。以下將它們做成一個 NodeWithScore 陣列,方便後續操作或顯示。 from llama_index.core.schema import NodeWithScore from typing import Optional nodes_with_scores = [] for index, node in enumerate(query_result.nodes): score: Optional[float] = None if query_result.similarities is not None: score = query_result.similarities[index] nodes_with_scores.append(NodeWithScore(node=node, score=score)) # [Optional] 顯示看看結果 from llama_index.core.response.notebook_utils import display_source_node for node in nodes_with_scores: display_source_node(node, source_length=1000) Step 4:將流程包裝成 Retriever 類別 以下自訂了一個 PineconeRetriever 類別,繼承自 LlamaIndex 的 BaseRetriever。 只要提供 vector_store、embed_model、query_mode 和 similarity_top_k,就能建立出一個自訂的檢索器。 from llama_index.core import QueryBundle from llama_index.core.retrievers import BaseRetriever from typing import Any, List class PineconeRetriever(BaseRetriever): """Retriever over a pinecone vector store.""" def __init__( self, vector_store: PineconeVectorStore, embed_model: Any, query_mode: str = "default", similarity_top_k: int = 2, ) -> None: """Init params.""" self._vector_store = vector_store self._embed_model = embed_model self._query_mode = query_mode self._similarity_top_k = similarity_top_k super().__init__() def _retrieve(self, query_bundle: QueryBundle) -> List[NodeWithScore]: """Retrieve.""" if query_bundle.embedding is None: query_embedding = self._embed_model.get_query_embedding( query_bundle.query_str ) else: query_embedding = query_bundle.embedding vector_store_query = VectorStoreQuery( query_embedding=query_embedding, similarity_top_k=self._similarity_top_k, mode=self._query_mode, ) query_result = self._vector_store.query(vector_store_query) nodes_with_scores = [] for index, node in enumerate(query_result.nodes): score: Optional[float] = None if query_result.similarities is not None: score = query_result.similarities[index] nodes_with_scores.append(NodeWithScore(node=node, score=score)) return nodes_with_scores 接著,我們透過上面定義的 PineconeRetriever 建立一個檢索器,並嘗試使用它對剛才的 query_str 進行檢索: retriever = PineconeRetriever( vector_store, embed_model, query_mode="default", similarity_top_k=2 ) retrieved_nodes = retriever.retrieve(query_str) for node in retrieved_nodes: display_source_node(node, source_length=1000) 將 Retriever 插入 RetrieverQueryEngine 做回應生成 最後,我們將寫好的 PineconeRetriever 插入到 LlamaIndex 提供的 RetrieverQueryEngine 中,以生成最終回應。 提示:未來還可以替換成不同回應生成器、使用更複雜的 Template 或 Chain 等技術。 from llama_index.core.query_engine import RetrieverQueryEngine query_engine = RetrieverQueryEngine.from_args(retriever) response = query_engine.query(query_str) print(str(response)) 反向思考:為什麼要這樣做? 1. 為什麼要自訂 Retriever? • 直接使用高階 API (如 VectorStoreIndex.query)雖然方便,但有時候我們需要精細掌控查詢細節,或是想要在檢索前後做更多動作(如過濾文件、加入額外的檢索邏輯)。 2. 為什麼要把查詢與回應生成拆開? • 這樣可以輕易替換不同的檢索策略(或 Vector Store)而不影響回應生成邏輯,讓系統更具彈性。 3. 取得相似度有何用? • 相似度可以幫助我們理解檢索到的內容是否與查詢足夠相關;或在後續做融合(Reranking)等進階操作時使用。 Optional 進階教學 1. Sparse 或 Hybrid Search • 如果你的向量儲存工具(例如 Pinecone)支援稀疏向量,可以嘗試使用 "sparse" 或 "hybrid" 模式進行查詢,取得更豐富或多元的檢索結果。 2. 自訂相似度函數或指標 • 如果你想要以餘弦相似度 (cosine similarity) 或其他方式度量向量距離,可以調整 Pinecone Index 的 metric(或自行在程式中計算)。 3. 權重調整 • 在 Hybrid Search 情境下,可以對稀疏向量與 Dense 向量的權重做調整,以便產出更適合特定專案需求的檢索結果。 4. 文件更新與版本控管 • 若文件經常變動,如何有效地更新向量存儲與 Index?是否需要做版本控管或快照(snapshot)保留?這些都是在實際生產環境中常見的議題。 5. 查詢前的意圖識別 • 在一些進階應用中,若系統無法辨別使用者查詢的意圖,可以先經過一層意圖判斷後,選擇合適的 Retriever 或 Query 模式,進一步提升系統的品質。 希望透過上述步驟讓你對整個檢索流程與 Pinecone + LlamaIndex 的運作原理有更直觀的理解。也歡迎大家帶著問題與想法自行實驗並分享心得!
-
Playwright 介紹 智能爬文的第一步
使用 Playwright 進行網頁自動化:從基礎到實戰 1. Playwright 簡介 Playwright 是由 Microsoft 開發的強大瀏覽器自動化工具,支持 Chromium、Firefox 和 WebKit。相較於 Selenium,它擁有更高效的 API,適用於網頁測試、自動化數據抓取、機器人流程自動化(RPA)等場景。 2. 安裝 Playwright 在使用 Playwright 之前,需要先安裝相關的 Python 套件。 pip install playwright termcolor 接著,安裝 Playwright 的瀏覽器環境: playwright install 3. 簡單的網頁自動化案例 我們將使用 Playwright 瀏覽 https://jina.ai,並抓取頁面標題與特定標籤的內容。 3.1 Python 代碼示例 from playwright.sync_api import sync_playwright from termcolor import colored def run(playwright): # 啟動 Chromium 瀏覽器,非無頭模式(可以看到瀏覽器執行過程) browser = playwright.chromium.launch(headless=False) page = browser.new_page() page.goto("https://jina.ai") # 取得頁面標題 print(f"Page Title is: {colored(page.title(), 'cyan')}" ) # 抓取特定標籤的內容 ud_header = page.locator('.ud-heading-serif-xxl').all_text_contents() for subheader in ud_header: print(f"Jina Subheader: {colored(subheader, 'cyan')}") # 關閉瀏覽器 browser.close() # 使用 Playwright 執行網頁自動化 with sync_playwright() as playwright: run(playwright) 3.2 代碼解析 啟動 Playwright: sync_playwright():同步執行 Playwright。 playwright.chromium.launch(headless=False):啟動 Chromium 瀏覽器,headless=False 表示顯示瀏覽器介面。 打開新分頁並瀏覽網址: page = browser.new_page() 創建新分頁。 page.goto("https://jina.ai") 訪問目標網站。 抓取頁面資訊: page.title() 取得頁面標題。 page.locator('.ud-heading-serif-xxl').all_text_contents() 抓取 .ud-heading-serif-xxl 選擇器對應的所有文字內容。 輸出結果: termcolor.colored(text, 'cyan') 讓輸出更具可讀性。 關閉瀏覽器: browser.close() 釋放資源,確保瀏覽器正確關閉。 4. 可能遇到的錯誤與解決方案 4.1 無法找到特定選擇器 如果 page.locator('.ud-heading-serif-xxl') 找不到對應內容,可能是: 選擇器名稱已更改,需使用開發者工具(F12)檢查 HTML 結構。 目標元素是動態載入的,需使用 page.wait_for_selector(selector) 等待元素加載。 4.2 瀏覽器未安裝 如果執行時遇到類似 Error: browser not installed,請執行: playwright install 來安裝對應瀏覽器。 5. 進一步學習與優化 5.1 反思與優化方向 異步執行:可使用 async 提高效率。 數據存儲:將抓取內容存入 CSV、JSON 或資料庫。 自動化測試:結合 pytest-playwright 進行測試。 動態交互:如自動填寫表單、點擊按鈕等。 5.2 可選挑戰 爬取其他網站:嘗試修改 URL,抓取不同網站的數據。 處理 JavaScript 渲染的頁面:使用 page.wait_for_load_state("domcontentloaded") 確保 DOM 加載完成。 自動登入功能:嘗試登錄帳號,並抓取登入後的內容。 6. 結論 本文介紹了 Playwright 的基礎使用方式,並提供了一個抓取網頁標題與內容的示例。透過這些知識,你可以開始使用 Playwright 進行自動化測試、數據抓取,甚至機器人流程自動化。
-
Felo - 最好用的AI Agent全方位no code工具!?來探討吧!
本文章將會針對 AI 初學者、行銷人員和開發者,並包含具體應用案例,讓不同背景的讀者都能輕鬆上手。 Felo AI 入門教學:輕鬆掌握多元 AI 搜尋引擎的魅力 現今網路資訊爆炸,Felo AI 應運而生,成為一款整合生成式 AI 的創新搜尋引擎。它由日本新創公司 Sparticle Inc. 開發,於 2024 年推出 (2024最強AI搜尋引擎:Felo AI完整評測,為什麼它讓我放棄Perplexity?)。Felo AI 最大的特色是跨語言的智慧搜尋,結合了尖端模型(例如 GPT-4)提供精準答案,同時清楚列出資訊來源供查證 (2024最強AI搜尋引擎:Felo AI完整評測,為什麼它讓我放棄Perplexity?)。不論你是 AI 初學者、行銷人員,或是開發者,Felo AI 都致力於用對話式介面和強大功能讓你用母語「搜尋全世界」,輕鬆獲取各領域的知識 (Felo Search 智慧搜尋與心智圖結合,提升使用體驗 | 原來可以這樣做沙龍) (Felo Search 智慧搜尋與心智圖結合,提升使用體驗 | 原來可以這樣做沙龍)。本篇將以輕鬆易懂的方式介紹 Felo AI 的基本功能、如何開始使用,以及針對不同背景讀者的應用案例、進階技巧與最佳實踐,幫助你快速上手這款全能 AI 工具。 Felo AI 的基本功能與特色 Felo AI 不只是傳統搜尋引擎的替代品,更像是一位智慧助理,可透過 ChatGPT 式對話回覆提問,同時提供可靠的資料來源佐證。以下是它的幾項核心功能與特色: 對話式搜尋:Felo AI 以聊天問答的形式呈現搜尋結果,就像和一個聰明的朋友對話,你只要輸入問題,系統能理解意圖並給出詳盡答案 (Felo Search 智慧搜尋與心智圖結合,提升使用體驗 | 原來可以這樣做沙龍)。相較一般搜尋只給連結,Felo AI 直接提供整合後的資訊,節省你點擊多個網頁的時間。 多語言支援與翻譯:跨語言能力是 Felo AI 的強項。你可以用母語發問,Felo AI 會搜尋全球資訊並自動將結果翻譯成你的語言 (Felo AI 與 SearchGPT 比較:跨語言學術搜尋... - 數位行銷學習|104學習精靈)。這打破語言障礙,非英語使用者也能無縫取得世界各地的知識 (Felo AI 與 SearchGPT 比較:跨語言學術搜尋... - 數位行銷學習|104學習精靈)。例如,用中文查詢英文論文時,Felo AI 可直接翻譯摘要內容,讓學術研究變得更簡單 (Felo AI 與 SearchGPT 比較:跨語言學術搜尋... - 數位行銷學習|104學習精靈)。其即時翻譯功能免去另開翻譯工具的麻煩,可直接讀懂外語網頁 (Felo AI 與 SearchGPT 比較:跨語言學術搜尋... - 數位行銷學習|104學習精靈)。 學術搜尋與知識庫:Felo AI 深耕學術領域,內建連結全球學術資料庫,支援搜尋論文並翻譯重點段落 (Felo AI 與 SearchGPT 比較:跨語言學術搜尋... - 數位行銷學習|104學習精靈)。這對研究人員或學生來說是一大福音,方便找到多國語言的學術資源。不僅如此,Felo AI 還提供知識組織工具,如「主題集」和「思維導圖」,幫助整理複雜資訊 (Felo AI 與 SearchGPT 比較:跨語言學術搜尋... - 數位行銷學習|104學習精靈)。相比傳統引擎只給結果列表,Felo AI 能將相關知識結構化,提升理解效率。 心智圖(思維導圖):最大亮點之一是自動心智圖功能。Felo AI 可將搜尋結果或對話內容生成視覺化的心智圖,讓資訊的關聯脈絡一目了然 (2024最強AI搜尋引擎:Felo AI完整評測,為什麼它讓我放棄Perplexity?)。透過思維導圖,使用者可以更容易掌握主題的全貌,特別適合釐清複雜概念 (2024最強AI搜尋引擎:Felo AI完整評測,為什麼它讓我放棄Perplexity?)。心智圖還支援編輯、下載,方便你加入自己的筆記或與他人分享 (2024最強AI搜尋引擎:Felo AI完整評測,為什麼它讓我放棄Perplexity?)。 來源透明與文件搜尋:每次 Felo AI 回答後,都會附上引用來源連結,方便你點擊查看原始內容 (2024最強AI搜尋引擎:Felo AI完整評測,為什麼它讓我放棄Perplexity?)。這種資訊來源透明度讓人更安心使用 AI 答案,也培養查證習慣。此外,Felo AI 內建網址摘要功能,只要貼上文章連結並輸入「summarize」摘要指令,就能快速獲得該頁面的重點概要 (Felo AI 與 SearchGPT 比較:跨語言學術搜尋... - 數位行銷學習|104學習精靈)。它也支援搜尋各種文件(PDF、Word、PPT 等),直接給出相關檔案結果,滿足多樣資訊需求 (Felo AI 與 SearchGPT 比較:跨語言學術搜尋... - 數位行銷學習|104學習精靈)。 無廣告、介面親和:為了提供專注的體驗,Felo AI 採用簡潔清爽的介面設計,幾乎沒有廣告干擾 (Felo Search 智慧搜尋與心智圖結合,提升使用體驗 | 原來可以這樣做沙龍)。而且完整支援繁體中文介面,包含選單、說明等,台灣使用者上手毫無障礙 (2024最強AI搜尋引擎:Felo AI完整評測,為什麼它讓我放棄Perplexity?)。介面同時提供淺色/深色模式切換,符合不同使用偏好 (2024最強AI搜尋引擎:Felo AI完整評測,為什麼它讓我放棄Perplexity?)。 以上這些功能使 Felo AI 成為「一站式」的智慧搜尋助手。例如,你可以直接用中文問「今年有什麼有趣的 AI 專案?」Felo AI 不僅會用對話形式彙整網上資訊回答,還可能自動生成一張相關專案的心智圖給你。對於想快速獲取知識又不想被資訊洪流淹沒的使用者而言,Felo AI 提供了高效率且直觀的解決方案。 如何註冊與開始使用 Felo AI 開始使用 Felo AI 非常簡單。你可以直接在瀏覽器中造訪官方網站(felo.ai),或下載行動 App(Android 與 iOS 皆有支援)進行體驗 (Felo Search 智慧搜尋與心智圖結合,提升使用體驗 | 原來可以這樣做沙龍)。以下是入門步驟: 註冊帳號:首次使用建議註冊一個免費帳號。點擊網站或 App 上的「登入/註冊」按鈕,可使用電子郵件快速註冊,或直接透過 Google、Apple 等第三方帳戶登入。註冊後方便保存你的搜尋歷史和主題收藏。不註冊也能直接試用基本搜尋功能,但登入帳號後才能充分體驗所有特色(如保存主題集)。 選擇搜尋模式:進入 Felo AI 主畫面後,你會看到一個大型的搜尋輸入框。介面語言會自動依據你的系統語言顯示(例如繁體中文)。在輸入框右側,有一個 「Pro」開關,代表是否使用進階模型搜尋。免費用戶每天擁有數次 Pro 模式的查詢額度,可用于更深入的提問。如果是一般簡單問題,關閉 Pro 開關即可進行快速搜尋(不消耗進階查詢額度)。建議先保留默認模式,待需要更詳細解答時再開啟 Pro 查詢。 (Felo Search 智慧搜尋與心智圖結合,提升使用體驗 | 原來可以這樣做沙龍)圖:Felo AI 網頁版的主畫面。畫面中央是對話式的搜尋欄,支持多語言提問;左側則有功能選單,包括對話搜尋、主題集和歷史記錄等。右上角提供登入/註冊入口,而下方醒目顯示「用您的語言搜尋世界」的標語,凸顯其跨語言搜尋特色。 進行第一次提問:在輸入框中鍵入你想查詢的問題或關鍵字。例如可以輸入「什麼是 Felo AI?」然後送出。幾秒鐘內,Felo AI 就會以對話形式給出答案,通常包含幾段文字解說和相關參考來源連結。在這個過程中,你彷彿直接在和 AI 交談,非常直覺。 查看回答與來源:閱讀 Felo AI 的回答內容。如果需要更深入細節,可以點擊答案中附上的【...†Lx-Ly】來源鏈接,跳轉閱讀原始文章或資料。這是 Felo AI 相較一般 chatbot 的優勢——它提供可追溯的來源,方便驗證資訊 (2024最強AI搜尋引擎:Felo AI完整評測,為什麼它讓我放棄Perplexity?)。 探索更多:在答案的下方,你可能會看到一些「相關問題」建議,或是一張「思維導圖」按鈕。你可以點擊這些來擴展學習。例如點擊心智圖按鈕,Felo AI 會把剛剛搜尋的主題繪製成一張樹狀圖,展示核心概念和延伸知識點,幫助你發現還沒想到的相關議題。 主題收藏:若這次搜尋涉及的內容你想留待日後參考,可以使用主題收藏功能(在搜尋結果頁面或回答旁邊通常有「加入主題」的按鈕)。將當前的結果儲存在一個自定義主題下,例如「學習Felo AI」,方便日後打開主題時瀏覽該主題下的所有相關內容 (2024最強AI搜尋引擎:Felo AI完整評測,為什麼它讓我放棄Perplexity?)。 初次體驗建議先從幾個有興趣的簡單問題開始,熟悉 Felo AI 的回答風格和功能版面。好消息是 Felo 提供了很慷慨的免費用量:根據官方資訊,免費方案除了無限次的一般快速搜尋外,每天還有約 5 次使用進階 GPT-4 等模型的專業搜尋額度,足夠滿足大部分日常需求 (Felo Search 智慧搜尋與心智圖結合,提升使用體驗 | 原來可以這樣做沙龍)。也就是說,不花錢也能享有 Felo AI 幾乎所有核心功能,包含全網搜尋、AI 對話、主題收藏等 (2024最強AI搜尋引擎:Felo AI完整評測,為什麼它讓我放棄Perplexity?)。當然,若你是重度使用者或對 GPT-4 等進階 AI 模型有大量需求,可以考慮訂閱 Felo Pro 計畫,以獲得每日數百次的進階查詢配額與更快的回應速度 (2024最強AI搜尋引擎:Felo AI完整評測,為什麼它讓我放棄Perplexity?) (Felo Search 智慧搜尋與心智圖結合,提升使用體驗 | 原來可以這樣做沙龍)。但對初學者而言,一開始使用免費版就絕對綽綽有餘。 在完成註冊和初步提問後,相信你已大致了解 Felo AI 的運作方式了。接下來,我們將介紹不同背景的使用者如何將 Felo AI 套用到實際應用場景中,發揮它的最大價值。 主要使用場景與應用案例 Felo AI 功能多元,適用於各種情境。以下將以三種類型的使用者為例,說明 Felo AI 能如何助你達成目標。 AI 初學者的學習夥伴 對於剛接觸人工智慧或相關領域的新手來說,Felo AI 是一位耐心又博學的老師。AI 初學者可以利用 Felo AI 來快速學習陌生概念、技術原理,或獲取最新趨勢資訊: 快速了解新知識:如果你聽說一個新名詞例如「生成對抗網路 (GAN)」,卻不清楚是什麼,不妨直接問 Felo AI:「GAN 是什麼?」。Felo AI 會給出簡明扼要的解釋,通常還會附上相關背景或應用說明,幫助你在幾分鐘內抓到重點。有用的是,回答底部還提供了深入閱讀的來源連結,方便你追蹤學術論文或科普文章以獲得更詳細資訊 (Felo Search 智慧搜尋與心智圖結合,提升使用體驗 | 原來可以這樣做沙龍)。這種答案+來源的形式,讓初學者能先獲得消化過的摘要,再自行研讀原文,學習效率大大提升。 多語言資源學習:很多 AI 知識儲存在英文資料中。以往英語不夠熟練的初學者可能被擋在門外,但 Felo AI 藉由強大的跨語言搜尋,直接將英文內容翻譯成中文給你 (Felo AI 與 SearchGPT 比較:跨語言學術搜尋... - 數位行銷學習|104學習精靈)。例如,你想學習一個 Python 機器學習函式庫的新函數,可以用中文詢問,Felo AI 會搜尋英文官方文件或國外討論,然後用中文回答重點,讓你無痛獲取英文世界的知識。必要時還可點開原文對照,逐步提升自己的英文閱讀能力。一來一往中,Felo AI 彷彿成了你的雙語教練。 結構化理解:初學新領域時,常覺得知識點雜亂無章。Felo AI 的思維導圖功能正好派上用場。每當你查詢一個較大的主題(如「深度學習演算法分類」),獲得回答後,不妨點擊「生成心智圖」。你將看到 Felo AI 把相關概念以樹狀圖形式列出,例如深度學習底下有哪些分支、每種演算法的關聯性如何等 (2024最強AI搜尋引擎:Felo AI完整評測,為什麼它讓我放棄Perplexity?)。這對視覺型學習者尤其有幫助——將零散資訊組織起來後,知識結構一目了然,加深記憶之餘也方便你找到後續進階的學習路徑。 循序對話探討:AI 初學者在自學過程中難免有許多連鎖疑問。Felo AI 支援上下文連貫的對話模式,讓你可以針對同一主題連續發問而不必每次重頭描述背景。例如你先問了「什麼是強化學習?」拿到基本答案後,接著追問「有沒有強化學習在遊戲中的成功案例?」Felo AI 會記住你前面的提問背景,直接給出相關案例的回答,省去你重複背景說明的麻煩 (2024最強AI搜尋引擎:Felo AI完整評測,為什麼它讓我放棄Perplexity?)。這種對話式的深入探討,宛如有個 24 小時待命的老師,陪你挖掘每一個好奇點。 總的來說,Felo AI 對 AI 初學者而言,就像一個智能學習助理。它友善地用你的語言解答問題,幫你跨越語言門檻取經全球知識,同時提供工具幫助理解和整理。在學習AI的路上,善用 Felo AI,你會發現自己可以更快掌握關鍵概念,也更有動力自行探索下去。 行銷人員的內容生成助手 對行銷、媒體或內容創作領域的人士來說,靈感與效率就是一切。Felo AI 恰好提供了一系列功能,幫助行銷人員在內容策劃、撰寫上如虎添翼: 內容靈感與文案產出:當你需要為產品撰寫宣傳文案或發想活動點子時,可以把 Felo AI 視作一個頭腦風暴夥伴。透過對話式提問,你可以要求它產生創意點子,例如:「幫我想三個強調環保的產品廣告標語」。得益於內建的 GPT-4 等大型模型,Felo AI 具備相當不錯的AI 寫作能力,可以輔助生成各類內容,包括撰寫文章段落、廣告標語、摘要重點甚至多語言翻譯等 (2024最強AI搜尋引擎:Felo AI完整評測,為什麼它讓我放棄Perplexity?)。這表示行銷人員在趕稿時,完全可以先讓 Felo AI 給出一版初稿,再加以人工潤色,極大提升效率。舉例而言,你可以請 Felo AI 「以輕鬆幽默的口吻介紹新品飲料」,它會產出一段草稿文字供你參考,為你的創作提供靈感火花 (2024最強AI搜尋引擎:Felo AI完整評測,為什麼它讓我放棄Perplexity?) (2024最強AI搜尋引擎:Felo AI完整評測,為什麼它讓我放棄Perplexity?)。 社群趨勢調查:掌握市場和社群動態對行銷人員至關重要。Felo AI 整合了社群媒體搜尋功能,特別針對 Reddit、Twitter、小紅書等平台提供搜尋模式 (2024最強AI搜尋引擎:Felo AI完整評測,為什麼它讓我放棄Perplexity?)。你可以直接詢問「目前在討論度最高的手機相機功能是什麼?」Felo AI 會幫你搜羅 Reddit 上相關討論的重點意見,或抓取 Twitter 上的熱門話題摘要。這讓你不用逐個打開社群網站,就能一站掌握輿論趨勢 (2024最強AI搜尋引擎:Felo AI完整評測,為什麼它讓我放棄Perplexity?) (2024最強AI搜尋引擎:Felo AI完整評測,為什麼它讓我放棄Perplexity?)。例如在新產品上市前,你可以透過 Felo AI 搜尋消費者對競品的評價亮點,迅速了解市場關注點並調整自己的行銷策略。 資料搜集與內容策展:在準備行銷提案或內容企劃時,常需要蒐集大量背景資料。Felo AI 的主題收藏功能非常實用——你可以將不同來源的搜尋結果彙整在一個主題檔案裡 (2024最強AI搜尋引擎:Felo AI完整評測,為什麼它讓我放棄Perplexity?)。假設你正在企劃一場活動,需要資料例如「Z 世代旅遊趨勢」「過去五年國旅統計」「競爭對手活動案例」等,只需各自搜索並將結果添加到「活動提案」主題集中。稍後你能在主題集中一次瀏覽所有相關資料,不必翻找歷史記錄,省時又便利。網址摘要功能同樣令內容策展更高效:面對一篇冗長的市場研究報告,只要把連結貼給 Felo AI,請它摘要重點,你很快就能取得報告的關鍵發現 (Felo AI 與 SearchGPT 比較:跨語言學術搜尋... - 數位行銷學習|104學習精靈)。 多國市場資訊:如果你的行銷業務涉足海外,Felo AI 的多語言優勢可以大展身手。比如你想了解日本市場某產品的口碑,可以用中文問「日本消費者如何評價XX產品?」,Felo AI 會搜尋日文網路上的評論並翻譯給你,整理出日本用戶的觀點摘要。這比起單純使用翻譯工具去讀日文網站有效許多,因為 Felo AI 幫你濃縮了重點意見。跨語言的市場調研在 Felo AI 上變得毫不費力,讓行銷團隊更容易取得國際視野。 總而言之,Felo AI 可作為行銷人員的內容生成與情報蒐集助手。無論是發想創意、撰寫文案,還是追蹤話題、整理資料,Felo AI 都能給予即時的支援與靈感。透過人機協作,行銷人員能更專注於創意本身,將繁瑣的資料收集與初稿撰寫交給 AI,加速產出高品質的行銷內容。 開發者的資訊探索利器 對軟體開發者和工程師而言,時間就是金錢。平時在解決技術問題、學習新工具時,常需要在網上搜尋文件或求助社群。Felo AI 為開發者提供了一套高效率的知識檢索工具,讓你更快找到答案並專注於寫程式本身: 技術問答與代碼範例:當你遇到程式錯誤或卡關,可以直接問 Felo AI,例如:「如何解決 Python 中的 MemoryError?」Felo AI 會自動搜尋 Stack Overflow、Reddit 等技術論壇上的相關討論,並以精簡的回答告訴你可能的原因和解決方案。同時列出的來源連結允許你點擊查看原始討論串,獲取更深入的背景(例如其他開發者的代碼片段或建議)。相比自己在論壇中大海撈針,Felo AI 幫你濃縮了眾多前輩的經驗,常常一兩句話就點出問題關鍵。對開發者來說,這種問答形式比傳統搜尋節省大量時間。 文件與 API 索引:開發新功能時難免需要翻閱技術文件(Documentation)。Felo AI 的文件搜尋能力可以直達目標——只要關鍵字夠明確,它能直接找到相關的官方文件頁面。例如你查詢「React useEffect 用法」,Felo AI 很可能直接給出 React 官方文件對 useEffect 鉤子的說明摘要,讓你快速了解用法細節。如果想看全文,只需點開引用來源即可跳轉官方手冊 (Felo AI 與 SearchGPT 比較:跨語言學術搜尋... - 數位行銷學習|104學習精靈)。更棒的是,若文件是英文的,你也可以請 Felo AI 幫忙翻譯其中關鍵段落,省去你自行理解翻譯的時間。多語言翻譯對開發者同樣適用,像是日本出的開源工具說明或法文博客文章,透過 Felo AI 都可跨語言檢索並閱讀重點內容。 範例代碼產生:除了搜尋現有知識外,Felo AI 還能運用其生成式 AI 模型,替你產生簡單的範例代碼。比如你問它「如何用 Python 實現快速排序?」Felo AI 有機會直接給出一段 Python 快速排序的示範程式碼,並附上講解步驟。當然,這些 AI 生成的代碼需要自行測試和斟酌,但作為參考範例能提供靈感。行內許多重複性的工具代碼(如格式轉換、API 調用樣板)都可以先問問 Felo AI,有時能節省手動翻文件或寫樣板的工夫。 主題研討與知識積累:對於大型專案的開發者團隊,Felo AI 的主題集功能也相當受用。如果你正在調研某項新技術,例如「微服務架構在金融業的應用」,可以建立一個該主題收藏,把平時找到的相關文章、論文、案例研究都存進去 (2024最強AI搜尋引擎:Felo AI完整評測,為什麼它讓我放棄Perplexity?)。團隊成員甚至可以共用這份主題集(將心智圖或重點摘要匯出分享),確保大家汲取同樣的資訊來源。長此以往,Felo AI 不僅解答了當下的疑難,還幫助開發者累積專屬的知識資料庫。下次遇到類似問題時,只要打開過往的主題收藏,就能迅速回顧並找到解決辦法。 可以看到,Felo AI 對開發者而言,更像是一款智能化的工程知識搜尋引擎。它把散落各處的技術經驗與文件智慧集中起來,跨語言、跨平台地提供給你。遇到Debug難題時,它是你的快速顧問;鑽研新技術時,它是你的資料嚮導。有了 Felo AI,相信開發者能把更多時間投入創造性工作,而不是困於漫長的搜尋與閱讀過程中。 進階功能與實用技巧 熟練掌握 Felo AI 的基本操作後,你還可以利用一些進階功能和技巧,進一步提升使用體驗: 主題收藏(Topic):如前文所述,將多個相關搜尋結果歸檔到「主題」是非常強大的功能。進階用法上,你可以為每個專案、每篇論文準備一個主題集,隨時把找到的資料加入其中。Felo AI 允許你在搜尋結果旁直接點選「加入主題」,新建或選擇既有主題分類 (2024最強AI搜尋引擎:Felo AI完整評測,為什麼它讓我放棄Perplexity?)。日後點開該主題時,其中累積的所有 Q&A 和連結都還在,相當於打造個人知識庫。建議定期整理主題集的內容,把無用的刪除、重要的加上註解,如此你的資訊庫會越來越精準好用。 AI 深度對話:Felo AI 不限於一問一答,還提供連貫對話的進階模式 (2024最強AI搜尋引擎:Felo AI完整評測,為什麼它讓我放棄Perplexity?)。在每次搜尋後,你都可以追問後續問題,AI 會記憶上下文。例如在主題收藏頁中,有一個「AI 對話」按鈕,點擊後你可以就該主題與 AI 展開連續對話 (2024最強AI搜尋引擎:Felo AI完整評測,為什麼它讓我放棄Perplexity?)。這對深入研究某個議題很有幫助——你可以圍繞主題反覆詢問不同角度,AI 的回答會逐步累積先前討論的知識,變得更加貼合你的探究方向。善用對話模式,可以挖掘出許多隱藏資訊或觀點,彌補單次提問的不足。 多元搜尋模式:在 Felo AI 的搜尋框附近,你可能注意到可選擇不同搜尋渠道或模式。例如全網搜尋(預設,一般性網路資源)、AI 對話(直接問 AI,不限定資料庫)、Reddit、X/Twitter、小紅書等社群 (2024最強AI搜尋引擎:Felo AI完整評測,為什麼它讓我放棄Perplexity?)。這些模式允許你針對不同來源進行定向搜尋。進階用戶可以根據需求切換:當你想獲取權威資料時,用全網搜尋或學術模式;想看社群風向時,切換 Reddit 或小紅書模式會很有效 (2024最強AI搜尋引擎:Felo AI完整評測,為什麼它讓我放棄Perplexity?)。例如做市場分析時,先用全網模式了解背景,再用社群模式抓取用戶真實反饋,兩相結合資訊更全面。熟悉各搜尋模式的特性,能讓你在 Felo AI 上如魚得水,精確找到最相關的答案。 思維導圖技巧:Felo AI 的心智圖除了自動生成外,你也可以做一些自定義操作。例如生成後的導圖支援節點編輯——你可以刪除某些不相關的分支,或加入你自行輸入的要點,以打造更貼合你理解的知識地圖 (2024最強AI搜尋引擎:Felo AI完整評測,為什麼它讓我放棄Perplexity?)。完成後,利用匯出功能將心智圖存為圖片帶走,插入到報告或簡報中,讓你的成果展示更加專業。熟練的用戶甚至會將多張心智圖組合,用於頭腦風暴會議的材料。一張由 AI 打底、人工補充修訂的思維導圖,往往能成為極佳的知識呈現工具。 內容生成與AI寫作:Felo AI 內建的 AI 模型不僅會回答問題,也可聽從指令生成內容。進階玩法上,你可以嘗試讓 Felo AI 幫你寫作:例如「請幫我寫一封邀請函給客戶,主旨是新品發布會。」或「替我將上述內容摘要成 100 字」。這類要求其實就是在調用 Felo AI 的AI 寫作功能 (2024最強AI搜尋引擎:Felo AI完整評測,為什麼它讓我放棄Perplexity?)。它可以產出草稿供你參考,節省你從零開始的時間。在翻譯方面也是如此,直接對 Felo 說「將上段文字翻譯成英文」,它會迅速給出譯文 (2024最強AI搜尋引擎:Felo AI完整評測,為什麼它讓我放棄Perplexity?)。這些生成類操作對 Felo AI 而言並非難事,充分利用可以提升你的工作效率。不過要注意的是,AI 生成內容有時措辭可能不完全符合你的期望,需要你再進行潤色修改以符合風格或細節正確。 跨平台與整合:別忘了,Felo AI 支援多平台使用。除了網頁介面,手機 App 方便你隨時查詢。而更有趣的是,在 Twitter(現稱為 X)上只要 @felosearch 發問,也能收到 Felo AI 的回答 ([ Felo - Search the world on the App Store ](https://apps.apple.com/us/app/felo-search-the-world/id6598782546#:~:text=edge%20RPA%20technology%20scours%20platforms,on%20Twitter%20with%20your%20questions))!這意味著你甚至不打開 App,也能直接在常用社群平台調用 Felo AI 的智慧。對重度使用者而言,可以將 Felo 設為預設搜尋引擎,在瀏覽器中直接以關鍵字觸發搜尋 (2024最強AI搜尋引擎:Felo AI完整評測,為什麼它讓我放棄Perplexity?)。總之,將 Felo AI 靈活嵌入你的日常工具鏈中,能讓 AI 如影隨形地提供幫助。 透過以上進階技巧,Felo AI 將不僅僅是一個Q&A工具,而會成為你日常工作流程的一部分。建議用戶抱著好奇心多嘗試,探索各種功能組合。例如,先用 Felo 找資料→存入主題集→生成心智圖整理→接著請 AI 寫作產出初稿,如此一條龍的操作將大大提高你的產出效率。隨著熟練度提高,你會不斷發現 Felo AI 更多貼心強大的用法。 最佳實踐與常見錯誤避免 為了充分發揮 Felo AI 的威力,並避免使用中的一些誤區,以下總結幾點最佳實踐和常見錯誤供參考: 1. 明確提問,逐步細化:儘量用清晰完整的句子向 Felo AI 提問。開始探索一個新主題時,先問大方向獲取概覽,再針對不清楚的部分提後續細節問題。切忌一上來丟一個模糊詞彙,這樣 AI 也難猜透你的需求。逐步細化問題的對話方式最能引導出有價值的答案。 2. 善用來源鏈接:Felo AI 每次答復都附帶了來源,不要忽視它們。最佳做法是在閱讀 AI 給的總結後,點開幾個關鍵來源快速瀏覽 (2024最強AI搜尋引擎:Felo AI完整評測,為什麼它讓我放棄Perplexity?)。這能驗證內容正確性,也可能從原文獲得額外背景。養成交叉查證的習慣,可以避免誤信 AI 生成的錯誤資訊。 3. 利用主題集整理知識:當你為某個專案或主題反覆搜索時,不要讓資訊散落在歷史紀錄中。正確做法是建立主題收藏,隨手把重要結果收入其中 (2024最強AI搜尋引擎:Felo AI完整評測,為什麼它讓我放棄Perplexity?)。日後複習時直接看主題集即可,省時省力。相反地,常見錯誤是每次需要用時再重新搜索,既浪費時間也可能漏掉之前找到的好資料。 4. 巧用心智圖與筆記:在進行學習或構思時,思維導圖能幫助整理思路。建議在獲得一定量資訊後就生成心智圖來梳理。如果發現導圖有不需要的部分,可以編輯精簡,使其成為你的專屬筆記圖表 (2024最強AI搜尋引擎:Felo AI完整評測,為什麼它讓我放棄Perplexity?)。避免只是看了一眼導圖就關閉,錯失將知識結構化的機會。 5. 留意免費額度與使用策略:Felo AI 免費版雖然功能完整,但每日進階查詢(Pro Search)有次數上限 (Felo Search 智慧搜尋與心智圖結合,提升使用體驗 | 原來可以這樣做沙龍)。最佳實踐是將簡單問題用一般模式解決,把寶貴的 Pro 次數留給需要深入分析的大哉問。常見的錯誤用法則是對任何小問題都開啟 GPT-4 模式詢問,不但浪費額度,有時過於龐大的模型反而回答未必更簡潔。瞭解自己需求的輕重,聰明分配查詢模式,才能持久享受免費用量。 6. 校對 AI 產生的內容:當你使用 Felo AI 進行內容創作(例如讓它寫段落或程式碼)後,務必親自校對修改。AI 給的初稿通常只是輔助參考 (2024最強AI搜尋引擎:Felo AI完整評測,為什麼它讓我放棄Perplexity?)。避免完全照單全收地使用 AI 文本,尤其在正式對外發布前,確認語氣、事實、細節都無誤才安心上線。把關內容品質仍然需要人工參與。 7. 保持隱私和安全:雖然 Felo AI 鼓勵你提出各種問題,但請避免在提問中輸入敏感個人資訊或機密資料。任何上傳網路的內容都有風險。使用 AI 工具時與使用其他線上服務一樣,注意保護個人隱私是基本常識。 8. 遇到問題善用說明:如果在使用過程中發現某功能不知如何操作,例如找不到心智圖按鈕、無法登入等,不妨查看 Felo 官方的常見問題(FAQ)或教學資源。官網部落格本身也有許多教程文章,可以搜尋關鍵詞找到對應說明(例如「心智圖教程」「AI 簡報功能」等) (如何使用 Felo AI 心智圖功能(教程) | Felo Search Blog)。善用這些學習資源,可以幫你更快掌握正確的用法,避開很多新手誤區。 最後提醒一點:AI 再強大也取代不了人的判斷。把 Felo AI 當作輔助工具而非絕對權威,保持批判思考,你才能用得既安心又高效。 經過上述介紹,相信你已對 Felo AI 有了相當全面的認識。這款結合了多語言搜尋、AI 對話與內容生成的全方位工具,對不同領域的使用者都相當友好。從回答日常疑問、學術輔助,到行銷創意發想、技術支援,Felo AI 都展現出強大的適應力和助益。如果你還沒嘗試過,不妨現在就動手體驗一下。在實際使用中探索功能,將理論轉化為實戰技能。可以預見,隨著 Felo AI 持續更新(開發團隊也不斷引入更新的 AI 模型與功能 (如何使用 Felo AI 心智圖功能(教程) | Felo Search Blog)),我們能做的事情只會越來越多。趕快善用這項工具,讓 AI 幫你輕鬆搜羅全世界的資訊,成為工作學習上的得力助手吧!
-
-
章節2 Prompt Engineering