跳到主要內容

RAG 和 Prompt 原理超簡單解說!想知道 AI 怎麼找答案看這篇

這篇文章是給對於你已經開始使用所謂的 ChatGPT / Claude / Gemini 之類的 AI 服務,甚至是 Siri (嘿丟,他也是一種 AI 應用服務喔)

簡單來說是非技術人員, PM,小白,想要趕快惡補的人,直接花十分鐘可以看完的一篇科普業配文章。

或者是概念僅止於,AI 這東西會幻想,會有誤差,會對於生活有些幫助但沒有幫助的人們,做個簡單又不是太簡單的介紹,希望用一個非常入門的方式讓你們有個了解。

當然,這篇文章目的很簡單,就是引流,如果你身邊有已經對於 Web 技術開發的人員,歡迎報名分享給他,年末出國不如學一技在身,參加今年我們舉辦最後一場 RAG 實作工作坊,報名連結https://exma.kktix.cc/events/ai-for-dev-course-rag-2

注意:接下來每個大段落結束都會有一段工商導入,但文章絕對精彩,請注意!



為了讓各位容易想像,我們將整個世界的資訊,先濃縮到這本『西遊記』的世界觀當中,我們整個世界都在這個『西遊記』,而大型語言模型我們用『書精靈』來描述。

PS. 我們先預設各位,應該都有聽過,西遊記!如果沒有聽過西遊記的,請右轉出去,謝謝!

先來談談向量

在《西遊記》的世界裡,我們可以把向量想像成一種「內容座標」,讓系統知道每個角色、場景、法術等的「位置」和「距離」。向量幫助語言模型知道不同內容之間的關聯程度。

向量就像內容的「距離」和「位置」

比方說,唐三藏的「位置」(向量)會接近「佛經」和「取經」的概念,因為他一路上都是為了取經而前進。孫悟空的向量位置則會更靠近「金箍棒」和「七十二變」這些概念,因為這些是他的特徵。

相似內容靠得更近:像「佛經」和「取經」會靠近唐三藏的向量,因為它們彼此有很強的關聯。 相差較大內容會離得較遠:像「取經」和「妖怪」「妖怪的寶藏」就距離比較遠,因為妖怪的寶藏和取經的目標關聯性不大。

是誰決定的這些位置?

簡單來說,這些位置和關係是模型自己學出來的。語言模型會閱讀大量的資料和這世界觀的資訊,觀察哪些詞語經常一起出現,根據「共同出現的頻率」來決定它們的關係,並且自動生成向量。例如:

  • 如果模型看到「唐三藏」總是和「取經」一起出現,它就會讓「唐三藏」的向量靠近「取經」。
  • 反之,如果模型發現「妖怪的寶藏」和唐三藏沒有太大關聯,這些向量就會距離較遠。

當我們心中先具備向量,距離的觀念!

接著暫停一下,各位記得要分享這篇文章給更多人!
還有記得付費報名活動,https://exma.kktix.cc/events/ai-for-dev-course-rag-2

接著我們討論一下 Prompt

接著用《西遊記》解釋 Prompt Engineering 的作用,Prompt Engineering 就是學會如何問問題,讓「你」這位主宰者更好地理解得到想要的答案格式或細節。

舉例:問唐三藏的背景

假設你問書精靈「告訴我唐三藏的故事」,精靈可能給你一個非常簡單的回答:「唐三藏是去取經的和尚。」這雖然正確,但並不完整。

如果使用 Prompt Engineering 提供更多指導:

  • 你可以問:「請告訴我唐三藏一路上取經的歷程,包括他的徒弟和遇到的妖怪。」
  • 書精靈的回答就會更詳細,比如說:「唐三藏是去西天取經的和尚,他一路上遇到很多妖怪,有孫悟空、豬八戒和沙悟淨陪伴他,他們一起克服了重重困難。」

通過 Prompt Engineering,我們可以引導精靈給出更符合需求的答案,避免過於簡單或模糊的回答。

Prompt Engineering:是否一定要有角色的概念?

在 Prompt Engineering 中,並不一定要有角色的概念,但「角色」可以幫助模型更好地理解語境,特別是在故事背景下。

是否一定要有角色?

簡單概要的說,看情境,並沒有絕對,以下舉例

  • 不一定要有角色:有時我們的問題並不需要特定角色,比如「請描述西天取經的目的」。這樣的問題並不涉及具體角色,而是針對背景或情節。

  • 當涉及角色時,角色設定可以更清楚引導模型:比如問「你身為孫悟空,請詳細說明動機和為什麼保護唐三藏?」時,加入「孫悟空」和「唐三藏」的角色背景,可以幫助模型理解我們的期望,使回答更具體、貼合角色個性。

    因此,這也是為什麼網路上會蒐集許多好的 Prompt 樣板 (Prompt template) 和常見模式 (prompt mode) 用《西遊記》角度,有許多不同的角色,不同的情境準備起來,當你想要以『專家角度』,『角色角度』,『故事章節帶入』等,就會有不同用法,就可以省去回憶思考的時間,快速得到精確的答案。

    接下來讓我們談談課程中會提到的其中兩種 prompt, (當然課程中會提到更多,又再次工商置入成功,耶) https://exma.kktix.cc/events/ai-for-dev-course-rag-2

    Few-Shot Prompt 的《西遊記》

    Few-Shot Prompt 就是給書精靈提供一些範例或樣本,讓書精靈更清楚我們希望他怎麼回答。

例子:介紹人物的需求

假設我們想要書精靈幫我們介紹《西遊記》中的角色特徵,並希望回答有特定格式。如果我們直接問「請介紹孫悟空、豬八戒和沙悟淨」,書精靈可能會給出很簡單的答案。

使用 Few-Shot Prompt 給出結果

範例一

你可以先給他幾個範例:

prompt:
請參考以下輸出範例,
範例 1:「孫悟空是具有七十二變能力的猴子,擅長使用金箍棒,性格直率、勇敢。」
範例 2:「豬八戒原本是天蓬元帥,擅長使九齒釘耙,性格懶散但也有責任心。」
請問問精靈:「請按照這個格式介紹沙悟淨生平。」

書精靈的回答就會更符合需求,可能會回答:「沙悟淨是原天宮的捲簾大將,擅長使用降妖杖,性格沉穩、忠誠。」

範例二

假設我們想讓書精靈描述每一個冒險情節的「地點」、「遇到的妖怪」和「解決方式」。

範例 1:「白骨精之戰:地點是在荒野,妖怪是白骨精,解決方式是孫悟空用火眼金睛識破並打敗了妖怪。」
範例 2:「紅孩兒之戰:地點是在火焰山,妖怪是紅孩兒,解決方式是孫悟空請來觀音菩薩將紅孩兒收服。」
請問:「請用同樣的格式描述金角大王和銀角大王的故事。」


書精靈產出: 

「金角大王和銀角大王之戰:地點是在平頂山蓮花洞,妖怪是金角大王和銀角大王,解決方式是孫悟空巧妙地騙回寶物,最終制服了妖怪。」

這樣模型就知道我們希望的回答應該包括「地點」、「妖怪」、「解決方式」,並按此格式提供答案。

這樣通過 Few-Shot Prompt,精靈知道我們想要的答案格式,給出的回答會更一致。

Chain of Thought 西遊記

Chain of Thought 是讓模型一步一步說出他的思考過程,適合複雜問題。或者讓他進行一個反思,驗證的過程。

情境 1:唐三藏為什麼會堅持取經?

假設你問書精靈:「唐三藏一路上遇到那麼多妖怪,為什麼他還堅持去西天取經呢?」

這個問題有點複雜,如果書精靈直接回答「因為他有毅力」,這樣的答案肯定是大家經常遇到的答案,但肯定是無法完全理解唐三藏的想法。

使用 Chain of Thought,書精靈會一步一步解釋自己的思考過程。

書精靈的回答(逐步思考):

  • 第一步:唐三藏的使命

「唐三藏是一位虔誠的和尚,他的目標是去西天取得佛經。他相信這是幫助世人解除痛苦的方法,因為佛經裡的智慧可以教導人們做好事、不傷害他人。」

  • 第二步:佛祖的教導

「在唐三藏出發之前,佛祖告訴他取經之路會很艱難,會有妖怪來阻攔他,因為妖怪不希望佛法普及。但唐三藏還是決定出發,因為他覺得這是他應該做的事情,不能輕易放棄。」

  • 第三步:遇到困難的時候的信念

「每當唐三藏遇到妖怪,他都會想起自己的使命,提醒自己這是對自己信念的考驗,只有堅持下去才能真正完成任務。這時候他的徒弟孫悟空、豬八戒和沙悟淨也會幫助他克服困難。」

  • 總結:為什麼堅持

「所以,唐三藏一路上沒有放棄,因為他有很強的信念,認為只要堅持,最終就能得到佛經,幫助更多的人。」

這樣,書精靈一步一步解釋唐三藏的想法,讓你更容易理解整體的內容和過程,而不會只有一個答案。

情境 2:反思和驗證自己的回答

假設你問書精靈:「孫悟空的七十二變真的無敵嗎?」

書精靈可能會首先回答「是的,七十二變很厲害」。但是,他還會在這個回答之後進行反思,看看是否有其他例子來驗證這個回答。

書精靈的 Chain of Thought:

  • 第一步:七十二變的威力

「孫悟空的七十二變可以讓他變成很多不同的東西,比如動物、樹木、甚至小石頭。這讓他在面對妖怪時有很多方法保護自己和師父。」

  • 第二步:思考限制

「但是,有一些妖怪擁有特殊的能力,能看穿孫悟空的變身,比如紅孩兒就能認出變成昆蟲的孫悟空。這說明七十二變並不是完全無敵,還是有一些例外。」

  • 第三步:結論和驗證

「所以,我的回答應該是,七十二變確實很厲害,但並不是完全無敵,因為有些妖怪有特別的能力可以對付他。」

Chain of Thought 就像是讓書精靈一步一步展開他的思考過程,幫助他在回答時更清楚地解釋每個原因。

當問題複雜時,這樣的回答方式能讓答案更容易理解,而且在有需要時還能進行反思和驗證,讓回答更準確。


Prompt 還有更多串接方式和應用,課程裡面會講更多實際更多 Prompt ,實務上建議參加課程!(但先說必須要有技術底)

RAG of 西遊記

這樣聽下來是不是對於書精靈(語言模型來說)具備了 Prompt 就足夠了呢?

非也,非也!

有時候,即使 prompt 設計得很好,書精靈仍然難以記住《西遊記》中所有的細節。

畢竟你的記憶有限,書精靈也是,記憶是有限的,即便有大量的記憶空間,但資料一次輸入這麼多時,會耗費過多的時間進行等待運算,我們會需要有另外的方式來進行分段的處理。

RAG(Retrieval-Augmented Generation) 是一種「先找後答」的技巧,用來提高模型的回答精確度。RAG 透過兩步驟來完成回答。

RAG 就像是給書精靈一個「檢索咒語」,幫助他先找到和問題相關的段落,再進行回答。

首先檢索相關內容,然後使用這些找到的資料來生成答案。這樣可以幫助模型處理大量資訊,尤其是當問題需要詳細細節或最新資料時,RAG 能有效縮小範圍,避免模型記住所有內容而浪費資源。

  • 檢索(R):書精靈會先從《西遊記》中找出和「天庭派來的妖怪」有關的段落,比如紅孩兒、白骨精等妖怪的背景,並找到它們與天庭的關係。

  • 生成(G):然後精靈根據這些找到的段落生成一個更完整的答案,比如:「在取經路上,孫悟空遇到的妖怪中,紅孩兒等妖怪與天庭有特殊的聯繫。這些妖怪阻撓取經的原因可能涉及天庭內部的鬥爭和試煉設置……」

例子:使用 RAG

假設你問了一個比較複雜的問題:

「孫悟空在取經路上遇到的妖怪中,有哪些是天庭派來的?為什麼這些妖怪要阻撓取經?」


這個問題涉及到不同妖怪的背景,以及它們與天庭的關係,這些內容分散在《西遊記》的許多章節裡。如果僅靠 prompt,書精靈可能很難給出一個詳細且準確的回答。

這樣一來,精靈就能更準確地回答,包含更多細節,並且回答過程更條理分明。

什麼情況下特別需要 RAG?

問題涉及大量細節時:比如問

「孫悟空在取經路上遇到的每個妖怪的背景和來歷」

這樣的問題涉及太多細節,RAG 能幫助書精靈找到和每個妖怪有關的段落,再進行回答。

《西遊記》的內容這麼多,假設今天西遊記又出了 100 多集:即使 prompt 很好,精靈記住所有內容也很難。RAG 可以讓他在回答前,先找到最相關的段落,只讀取這些段落來回答問題。

需要準確性時:如果問題很細緻,比如

「哪個妖怪與天庭的關係最密切?」

這種問題需要非常準確的答案,RAG 可以幫助精靈找到書中最相關的描述,避免誤解或遺漏。

想像你問模型:「唐三藏在取經路上遇到的妖怪有哪些?」RAG 系統會先在《西遊記》中找出與妖怪有關的段落,並整理出紅孩兒、白骨精等妖怪的相關資訊,然後模型才根據這些資訊回答,確保答案完整且準確。

簡單來說,RAG 就像一位智慧的助手,先快速查找《西遊記》裡的相關資料,再根據找到的內容回答問題,這樣讓回應更準確又省時。

總結後記

簡單來說,這是一篇很初探的文章,讓大家知道語言模型到底是怎麼跟所謂文字,資料,相似資訊扯上邊,在這個框架下,Prompting 和 RAG 的結合是一種協同方式,

Prompting 指導模型如何回答,確保回答的格式和風格符合需求。RAG 幫助模型從海量資料中找到與問題最相關的片段,讓生成的答案更具體、更準確。

其中,為什麼這些概念和實作的過程會這麼重要?這些一切的一切,都是讓機器知道人類期望的目的和達到人類預期的產出。

同時我們也更知道語言模型在資料的生成與探索和索引的方式,懂更多的探索方式,我們才能真正真正善用 AI ,成為 AI 應用真正的主人。

最後呼籲,記得分享文章!

技術人,記得報名,信用卡是用來刷的,放著總是會爆!
(課程報名有賺有賠,參加之前請詳細查看公開說明書 wwww)
https://exma.kktix.cc/events/ai-for-dev-course-rag-2

留言

張貼留言

這個網誌中的熱門文章

npm 還可以看影片,沒想到真的有人這麼做

 還真的有人做這件事情, 庆余年2剛上線,有一位小哥竟然利用 npm 包的機制,將整套高清視頻都搬上來了。 https://x.com/fengmk2/status/1791498406923215020 圖片來源, https://x.com/fengmk2/status/1791498406923215020/photo/1 此 Package 出處 https://www.npmjs.com/package/lyq2?activeTab=versions 截圖留念, 機制說明 NPM(Node Package Manager)是一個流行的 JavaScript 軟件包管理器,用於管理和分發 Node.js 應用的依賴。它允許開發者將自己的代碼打包成「包」,並上傳到 NPM 的公共註冊表,供其他開發者下載和使用。這個過程通常包括以下步驟: 創建 NPM 包 :開發者將自己的代碼和相關文件打包成一個 NPM 包。 上傳到註冊表 :將包上傳到 NPM 的公共註冊表。 下載和使用 :其他開發者可以通過 NPM 命令行工具下載並安裝這些包。 這位小哥利用這一機制,可能是通過將整套高清視頻文件打包成 NPM 包並上傳到公共註冊表。其他人只需通過簡單的 NPM 命令即可下載這些視頻文件。 影響 版權問題 :這種行為涉及明顯的版權侵犯。高清視頻通常受到版權保護,未經授權的分發和下載都是非法的。 NPM 註冊表的可靠性 :這類內容的出現可能會損害 NPM 註冊表的可靠性和聲譽。NPM 註冊表是開發者分享和使用代碼的重要平台,如果充斥著這些不合法的內容,會影響其公信力。 潛在的安全風險 :將視頻文件偽裝成 NPM 包可能會帶來潛在的安全風險。下載這些包的用戶可能會無意中下載到惡意軟件或其他有害內容。 技術濫用 :這一行為展示了技術的濫用,原本為了方便開發者分享和使用代碼的機制,被用來分發非法內容,會對整個開發者社區造成負面影響。 歡迎留言給我,讓我們得到更多討論,一起回饋更多可能。 如果對於技術架構或者技術開發有相關需要顧問教育訓練服務或專案開發,聯絡方式如下,或者是與皇漢科技 EXMA-Square 進行聯繫。 FB: https://www.facebook.com/clonncd/ Twitter: https://twitter.com/clonncd 熱血漢誌:...

2024 推薦關注的 JavaScript 知識

以 js 整體發展來看,目前自己最看好的發展是在於兩個面向,一個部分是 Storybook ,一個部分是 Web container ,為何會是這兩個部分,這邊也分享一下自己的見解。 Storybook Storybook, 如果有用過的朋友都知道,他是屬於前端的展示,可以從 UI 的結構,到 parameter 的傳入,以及 component 如何使用的方式細節呈現等完全呈現。 AI 的到來,加上 Storybook 的呈現,可以讓新發展,或者更新版本的 UI Component 不再是孤兒,很快的 AI 可以學習如何使用新的 Component, 且在同時可以讀取 UI 畫面(Vision) 的狀態下進行識別 UI 在呈現上可以使用的方式。 同時也可以直接了解整體程式碼在使用上可以有怎麼樣參數傳入的方式,甚至是,你只要發展出一套 react 的版本,透過 AI 可以直接透過 Storybook 的版本,直接用最典型的狀態(但不一定效果最佳)轉換成 Vue, 或者 Villina JS 的版本。 這對於開發者,是一個多大的福音,Do Once, Call Everywhere. Web Container Web Container, 正所謂,Container 之下無蟒夫,容器化不只是能夠跑在後端,現在也能夠跑在前端,加速了整體的部署,同時也加速了以往的 SSR 的限制,以往很多時候『it works on my pc』的窘境將不再復見,你的瀏覽器將是我的雲端,You are the edge of mine, 聽起來有多浪漫,光靠這招就是一個歡呼! 完全就是一個端到端,環境的問題接下來將再不是一個問題,以往會有的 Node.js 的問題,接下來都可以在 Web Container 裡面排除掉,直接快速的進行部署實現,同時執行出應用端應該有的樣子。 當然瀏覽器支援度會是一個問題,不過我相信這只是時間的問題而已,相信在座的各位,最多的就是時間! 等吧! JSDC 2024  JavaScript Developer 年度盛會,線上展開。 這次講師要講什麼,就是要講這些有的沒的,還不來聽嗎? 聽懂幾個關鍵字,開心學會一輩子! JSDC 2024 網站: https://2024.jsdc.tw/ JSDC 2024 售票連結: https://www.a...