發佈日期:

Graph RAG – 圖形式的檢索增強生成

論文網址: https://arxiv.org/abs/2404.16130

Graph RAG 介紹

一種新的 Graph RAG 方法,透過建立基於圖形的文本索引,提升對全球性問題的回答品質。這種方法能夠有效地處理大規模文本語料庫,並且能夠擴展到用戶問題的普遍性和要索引的源文本數量。

Graph RAG 管道利用 LLM 衍生的文本圖索引進行資料處理。首先,該管道從來源文件中構建出實體知識圖,將文件中的實體與其關聯關係組織成網狀結構。接著,Graph RAG 使用 LLM 在索引建立階段進行群體預摘要,針對每個具有相似性的實體群體生成摘要,以便更快速地調用相關資訊。當查詢進來時,Graph RAG 可以在查詢時間使用這些預摘要來快速生成「全局答案」。這種方法不僅提升了答案的全面性和多樣性,還能有效降低生成回答時的 token 成本。

Graph RAG 管道的流程範例圖

Graph RAG 系統的工作流程

RAG 的作用:RAG 的目的是提升 LLM 在回答問題時的準確度和廣度。它先從外部數據來源檢索資料,再將這些資料與問題一起添加到 LLM 的上下文中,讓模型能更有針對性地回答問題。

Graph RAG 的優勢:和一般 RAG 不同,Graph RAG 使用了「圖形索引」來組織和檢索資料,這種方法能更好地處理大型資料集,並且在回答問題時能提供更豐富、全面的答案。

其工作流程如下:

  • Graph RAG 系統先生成知識圖譜,將文本中的實體和關係組織成「社區」的層次結構(例如,將相關人物和概念歸為同一群)。這樣可以讓每個「社區」包含特定主題的內容,便於更精準地檢索和總結資料。
  • 當用戶提出問題時,系統從不同層次的社區中選擇最合適的摘要來生成答案,這些答案以多階段的方式被組合,確保包含了關鍵的更全面的回應。

透過圖形索引,Graph RAG 能達到更高效的資料組織和檢索效果,並在處理多樣性的問題上表現更佳。這對於需要長期反覆查詢的資料集特別有價值,因為它的索引成本相對較低,但效果很好。

第一步驟:預處理參考資料

Text Chunks → Element Instances

從文本中識別(Chunks )和提取實體(例如人、地點、組織)及其之間的關係(Instances),以便構建一個結構化的圖形表示。

  1. 實體識別與關係提取
    • 每段源文本被分割為更小的片段。在每個片段中,系統要識別出「節點」和「邊」兩種元素,分別代表「實體」和「實體之間的關係」。
    • 系統利用 LLM 的多部分提示來達到這個目的,首先識別出所有實體,包括它們的名稱、類型(如人名、地點、組織等)和描述。接著,系統識別出實體之間的明確關係,並提供詳細的關係描述。
  2. 自訂與特定領域優化
    • 對於特定領域(如醫學或法律),可以加入一些專門的少量示例(few-shot examples),使LLM更好地理解並識別該領域的專業實體。例如,醫學領域可能包含藥品、疾病、治療方法等特定實體。透過提供少量專門的示例,LLM能更精確地從特定領域的文本中提取相關資訊。
    • 此外,若希望從節點中提取更多資訊(例如日期、描述或其他相關變數),則可以使用次要的提示來實現。這些額外的資訊(或「協變量」)能為實體提供更多上下文,例如,該實體是什麼主題、對象、來源範圍、開始和結束日期等。
  3. 多輪收集過程
    • 為了達到更高的準確性和完整性,系統會使用多輪「收集」方法。首先,LLM會對提取結果進行初步檢查,並判斷是否已經完全提取。為此,會設置一種「是/否」的強制決策過程來檢查是否所有實體都被提取。若系統確認存在遺漏,則再進行一輪收集。
    • 系統將引導LLM進一步搜尋缺失的實體,甚至會明確提示「在上次提取中錯過了許多實體」,以確保模型在後續的階段中彌補這些缺失。
    • 這種多輪收集方法的優點是,系統可以使用較大文本片段(塊)來提高處理效率,但同時不會影響提取質量或引入額外噪音。

Element Instances → Element Summaries

如何將文本中提取的實體、關係和主張的資訊進一步轉換為更精簡且有意義的摘要,以構建一個支持查詢的圖形索引。以下是逐步解釋:

  1. 從實例(Instances )到摘要(Summaries)的轉換
    • 使用 LLM 來「提取」來源文本中的實體、關係和主張,其實就是一種抽象總結。這過程中,LLM 不僅要理解文本中明確表述的資訊,還要將隱含資訊(例如隱含的實體關係)轉換為獨立且有意義的摘要。
    • 為了讓每個圖形元素(如實體節點、關係邊和主張的附加資訊)更具體明確,需要進行額外一輪的 LLM 總結,將這些實例級別的資訊整合為單一的描述性文本塊,方便查詢時直接使用。
  2. 實體引用一致性的挑戰
    • 一個潛在問題是,LLM 可能會以不同的格式或名稱來引用相同的實體,這會導致相同實體被多次提取,形成重複的節點。
    • 為了克服這個問題,方法設計上會在後續的步驟中偵測並彙整所有相關「社群」實體。因為 LLM 能辨識出多個名稱變體背後的同一實體,只要這些變體有足夠的連結性,即便名稱不同,系統仍能將它們歸為同一實體群體,這樣就能降低重複節點的影響。
  3. 與典型知識圖的區別
    • 傳統的知識圖依賴於簡潔的三元組(主體、謂語、賓語)來進行推理。但這種方法可能過於簡化,無法包含較為複雜或隱含的資訊。
    • 相較之下,這種基於 LLM 的方法能在圖形節點中保留豐富的描述性文字,這更符合全球查詢導向的摘要需求,同時也更能利用 LLM 處理多變而含糊資訊的能力,使索引更具韌性,能夠適應可能包含噪音的圖結構。

Element Summaries → Graph Communities

將之前建立的圖形索引進一步分割成「社群」或「群組」,以便更有效地進行資訊總結。以下是重點解釋:

  1. 圖形模型的建立
    • 在前一步中已建立了一個索引,這個索引可以表示為「同質無向加權圖」。在這個圖中,實體節點透過關係邊相互連接,並且每條邊的權重反映了該關係實例的標準化計數(即該關係被檢測到的頻率)。
    • 這意味著,圖中兩個節點之間的關聯越強,邊的權重就越高,能反映出這些實體之間的連結強度。
  2. 社群檢測的意義
    • 接下來,透過「社群檢測」算法,可以將圖劃分為不同的社群。這些社群中的節點之間的關聯性比它們與其他社群中的節點來得更強。因此,每個社群代表了彼此關聯較緊密的一組實體。
    • 這種社群檢測的目的在於便於之後的資訊總結。社群的劃分讓我們可以根據不同的主題、概念或上下文,將實體分成幾個更具內部一致性的子圖。(在這個論文裡面使用了Leiden算法來調整社群間的層次性結構)

Graph Communities → Community Summaries

透過這樣的社群劃分,我們可以採用「分而治之」的方法來進行全球性的資訊總結。將整體圖分為多個社群後,可以針對每個社群進行摘要,然後再匯總出一個完整的回答。

社群摘要的目標與用途

  • 這些報告式摘要讓用戶能夠在無特定查詢的情況下,直接從整體視角快速了解資料集的結構與語義。例如,使用者可以先在高層級瀏覽不同社群的摘要以尋找感興趣的主題,再逐層深入至提供更多細節的低層級報告。這些摘要還可以作為支持回答全局查詢的資料索引。

社群摘要的生成方法

  • 葉級社群(最小社群)
    • 首先處理「樹葉級社群」,這些是最基礎、最小的社群單位。對於這些社群中的元素(包括節點、邊、協變量),系統會依據其「顯著性」進行排序,並將這些元素摘要按順序加入 LLM 的上下文窗口,直到達到 token 上限。
    • 排序方式是根據邊的來源和目標節點的度數(度數總和越高,代表該連結越重要)。因此,邊越顯著,它的相關描述(來源節點、目標節點、連結的協變量和邊本身的描述)就會優先被加入摘要。
  • 高層級社群
    • 對於包含多個葉級社群的高層級社群,若這些社群內的元素摘要總數沒有超過上下文窗口的 token 限制,則可以按照葉級社群的方式生成摘要。
    • 但如果元素摘要超過上下文窗口的 token 限制,則會優先處理並排名較短的子社群摘要,將較長的元素摘要替換成子社群的簡短摘要,直到所有內容能符合上下文窗口的限制。
    • 這樣的替換策略確保在儘可能多地保留資訊的同時,符合系統的 token 限制,達到最佳化的摘要效果。

報告式摘要的價值

  • 這種層次化、逐步濃縮的社群摘要方式,使得用戶可以以「分層瀏覽」的方式逐層深入,從全局到細節快速瞭解資料結構。
  • 此外,這些摘要能幫助用戶在資料量極大的情況下,維持資訊的完整性與重點,並能夠進行快速查詢與定位。

第二步驟:根據使用者提問來生成最終答案

Community Summaries → Community Answers → Global Answer

當收到用戶的查詢後,系統會利用之前生成的社群摘要來產生最終答案,過程分為三步:

  1. 準備社群摘要
    • 系統將所有的社群摘要隨機打亂,再分成大小合適的小塊,確保資訊平均分佈,不會因為集中於單一區塊而造成資訊缺失。
  2. 生成中間答案
    • 系統從每一小塊中生成「中間答案」,並為每個答案打分(0-100),分數越高表示這個答案對回答用戶問題越有幫助。分數為 0 的答案會被過濾掉,不再使用。
  3. 匯總成最終答案
    • 系統將這些中間答案按照分數從高到低排列,然後逐一添加到最終答案的文本中,直到達到內容限制。這樣就組合出一個完整且最具幫助的「全球答案」,用來回答用戶的查詢。

這樣的流程可以確保系統在回答問題時,不僅能夠全面涵蓋內容,還能提供最相關的資訊。

測試LLM的理解能力

為了評估 RAG 系統能否有效「理解」大型數據集,我們需要設計一些特殊的問題,來測試它是否具備全局性的理解能力,而不僅僅是找出某些具體的事實。

具體方法是:

  1. 為什麼要特別的問題:一般的問答數據集(例如 HotPotQA)都是直接查找具體答案,像是「誰是某事件的參與者」這樣的問題。這種方法不足以測試 RAG 系統是否能夠「理解」數據集的整體內容或背景意涵。
  2. 如何生成這些問題:為了讓 RAG 系統能展示出整體理解能力,我們使用了一種方法來自動生成這些全局性的問題:
    • 首先,給 LLM 簡單描述一下數據集的內容,然後讓它想像數據集的「潛在用戶」會有哪些,這些用戶會有什麼樣的需求或任務。
    • 接著,讓 LLM 為每個「用戶+任務」組合生成一組問題,這些問題需要理解整個數據集才能回答,而不是只針對其中一部分內容。
  3. 最後的測試問題:設置 N=5,即生成 125 個問題,用來測試 RAG 系統的整體理解和處理能力。這些問題旨在評估系統是否能把握數據集的整體結構和意義。

例如有一位「科技記者」需要從Podcast的文字稿中提取整體趨勢和洞察

用戶設定:這位用戶是一位「科技記者」,他關注的是科技產業的趨勢,特別是科技領袖如何看待「政策和法規」的影響。

任務描述:記者的任務是從眾多播客中找出科技領袖們對於政策、法規的觀點。這樣的任務需要的是整體理解,而不只是回答單一的事實性問題。

問題設計:基於這個任務,設計了5個高層次問題,這些問題都需要有整體視角的資訊來回答:

  • 問題 1:「哪些集數主要涉及科技政策和政府監管?」——這問題需要系統能夠掃描所有播客集數,找出和政策、監管相關的內容,並給出一個範圍性的回應。
  • 問題 2:「客人如何看待隱私法對科技發展的影響?」——這問題要求系統從各個集數中提取與隱私法影響有關的觀點和分析。
  • 問題 3:「有任何嘉賓討論創新與倫理考量之間的平衡嗎?」——這需要系統理解並辨識出和創新、倫理相關的討論,並做出整體的回應。
  • 問題 4:「客人提到的對現行政策的建議變更是什麼?」——這需要系統整理出嘉賓們對於政策的改進建議,提供具體又概括的回應。
  • 問題 5:「是否討論科技公司與政府之間的合作,以及如何進行?」——這要求系統找出嘉賓們提到的合作模式,以及這些合作是如何被描述的。

測試與比較結果

問題 哪些公共人物在各種娛樂文章中被反覆提及?
Graph RAG 娛樂界知名公眾人物概述
娛樂產業廣泛而多樣,涵蓋電影、電視、音樂、體育和數位媒體。某些公眾人物因其在這些領域的重大貢獻和影響而脫穎而出。以下摘要突顯了在各種娛樂文章中反覆提及的關鍵人物,反映了他們在產業中的影響力和存在感。

演員和導演 […] 爭議中的公眾人物 […] 音樂家和高管 […] 運動員和教練 […] 網紅和企業家 […]
在娛樂文章中反覆提及這些人物,標誌著他們持續的相關性和公眾對他們工作的興趣。他們的影響力遍及娛樂的各個方面,從塑造電影和電視中的文化敘事到推動音樂和數位媒體的趨勢。這些人不僅對各自的領域做出貢獻,還影響著更廣泛的文化格局,經常成為社會討論和公共話語中的核心人物。
Native RAG在各種娛樂文章中反覆提到的公眾人物包括泰勒·斯威夫特、特拉維斯·凱爾西、布蘭妮·斯皮爾斯和賈斯汀·汀布萊克。這些人因其專業成就和個人生活等各種原因而受到關注。

泰勒·斯威夫特 […] 特拉維斯·凱爾西 […] 布蘭妮·斯皮爾斯 […] 賈斯汀·汀布萊克 […]
這些人物因其高知名度和公眾對其職業及個人生活的興趣而經常受到關注。他們在音樂、體育或個人關係中的活動,對文化和經濟有著重要的影響,這從媒體報導和公眾反應中可見一斑。
在回答的全面性多樣性、準確性上Graph RAG都勝出,而簡潔性和具體性則為原本的RAG勝出
發佈日期:

讓LLM記憶對話的實現方式

讓LLM記憶對話的幾種方式

參考資料: https://www.pinecone.io/learn/series/langchain/langchain-conversational-memory/

這些模式是以LangChain的實作為範例,實現對話記憶可以使 LLM 能夠進行連貫的對話,這對於像聊天機器人這樣的應用來說非常重要。

對話記憶的不同形式,包括

  • ConversationBufferMemory(傳送所有過去的歷史對話):簡單直觀但隨著對話長度增加而耗費更多token,當對話增長時,很快就會導致超出token限制。
  • ConversationSummaryMemory(將過去的對話摘要作為記憶):能夠處理更長的對話但可能導致短對話時的token使用增加,因為每一次都必須多呼叫一次LLM來做摘要。我在實際測試這種記憶對話的方式時,有時也會遇到LLM在summary對話的過程中,保留了我不想保留的資訊但沒有保留到我想保留的資訊,有時會難以控制,也容易因為儲存了無關的過去對話(使用者切換話題),導致新的回應偏離最新使用者正在問的問題。
  • ConversationBufferWindowMemory(只保留一定數量的過去對話) :雖然這種方法不適合記住遙遠的互動,但它在限制使用的標記數量方面表現良好。對於只需要記憶近期對話,不須記憶遠期記憶的狀況下,這種方式是我嘗試過覺得既簡單,又有還不錯效果的方法。
  • ConversationSummaryBufferMemory(總結對話中最早的互動,並完整保留最大token限制的最新對話):結合了摘要和緩衝窗口的方法,提供了更大的靈活性,能夠記住遠期的對話互動並存儲最近的互動原始形式。

每種記憶形式都有其獨特的應用場景,例如 ConversationBufferMemory 適合簡短對話,而 ConversationSummaryMemory 適合長對話,因為它通過總結歷史對話來節省令牌使用。此外,網頁還提到了其他類型的對話記憶,如 ConversationKnowledgeGraphMemory 和 ConversationEntityMemory。

雖然需要更多的調整來決定總結什麼以及在緩衝區窗口中保持什麼,但ConversationSummaryBufferMemory確實給了我們很多靈活性,也是我們的記憶類型中唯一一個(到目前為止)允許我們記住遙遠互動以其原始——以及信息最豐富——的形式存儲最近的互動。

ConversationBufferWindowMemory的token使用比較圖

包括 k=6 和 k=12 的 ConversationBufferWindowMemory 的令牌計數

ConversationSummaryBufferMemory的token使用比較圖

包括最大令牌限制值為 650 和 1300 的 ConversationSummaryBufferMemory 類型的令牌計數比較

進階的記憶模式 – 實體、圖形記憶

參考資料:https://www.comet.com/site/blog/advanced-memory-in-langchain/

ConversationEntityMemory(實體記憶)

實體記憶能夠幫助 AI 模型記住和理解對話中的關鍵實體,從而提供更準確和相關的回答

使用一個LLM來提取有關實體的信息,並隨著時間的推移建立對這些實體的知識。實體記憶對於維持上下文和保留在對話中提到的實體的信息非常有用。它可以幫助模型根據對話的歷史提供準確和相關的回應。

若希望模型了解特定實體及其相關信息時,應使用實體記憶。

以下為實體記憶對話的一個應用範例:

1. 輸入對話:

Abi, Andy, Lucas, and Harpreet are building the LLMOps community

取得的實體:

{'Abi': '', 'Andy': '', 'Lucas': '', 'Harpreet': '', 'LLMOps': ''}

LLM回應:

That's great to hear! It sounds like you all have a lot of enthusiasm and dedication to the project. What kind of tasks are you all working on?

2. 繼續下一個輸入對話:

Abi and Andy are both authors. 
Abi is writing a book about LLMs in production.
Andy has written a book about MLOps.
Abi lives in India
Andy lives in Scotland

取得的實體:

{'Abi': 'Abi is part of a team building the LLMOps community.', 'Andy': 'Andy is part of the team building the LLMOps community.', 'India': '', 'Scotland': ''}

LLM回應:

That's really impressive! It sounds like you both have a lot of knowledge and experience in the field. What inspired you to write your books?

3. 繼續下一個輸入對話

Lucas works at Microsoft 
he is an expert in AI. Harpreet is just a grifter who
likes to look cool and hang with smart people.

取得的實體

{'Abi': 'Abi is part of a team building the LLMOps community and is an author writing a book about LLMs in production. She lives in India.', 'Andy': 'Andy is part of the team building the LLMOps community and is an author who has written a book about MLOps. He lives in Scotland.', 'Lucas': 'Lucas is part of the team building the LLMOps community.', 'Harpreet': 'Harpreet is part of a team building the LLMOps community.', 'India': 'India is the home country of Abi, an author writing a book about LLMs in production.', 'Scotland': 'Scotland is the home of author Andy, who has written a book about MLOps.', 'Microsoft': '', 'AI': ''}

LLM回應

That's an interesting combination of skills and interests! It sounds like you all have a lot to offer to the LLMOps community. What kind of projects are you all working on together?

4. 輸入對話

What do you know about Abi?
取得的實體

{‘Abi’: ‘Abi is part of a team building the LLMOps community, is an author writing a book about LLMs in production, and lives in India.’, ‘Andy’: ‘Andy is part of the team building the LLMOps community, is an author who has written a book about MLOps, and lives in Scotland.’, ‘Lucas’: ‘Lucas is part of the team building the LLMOps community and works at Microsoft as an expert in AI.’, ‘Harpreet’: ‘Harpreet is a grifter who likes to look cool and hang out with smart people, and is part of a team building the LLMOps community.’, ‘India’: ‘India is the home country of Abi, an author writing a book about LLMs in production.’, ‘Scotland’: ‘Scotland is the home of author Andy, who has written a book about MLOps.’, ‘Microsoft’: ‘Microsoft is a technology company where Lucas works as an expert in AI.’}

LLM回應

 Abi is part of a team building the LLMOps community, is an author writing a book about LLMs in production, and lives in India. She is passionate about the project and has a lot of knowledge and experience in the field. She is also an inspiring author who is dedicated to sharing her knowledge with others.

ConversationKnowledgeGraphMemory

ConversationKGMemory,也稱為對話知識圖譜記憶,允許模型將信息存儲和檢索為知識圖譜。使用一個LLM來從對話中提取知識,並建立實體及其相關信息的記憶,幫助維持上下文並保留對話中提到的實體的知識。以知識圖譜格式儲存資訊使模型能夠理解實體及其屬性之間的關係,幫助模型根據對話的歷史提供準確且相關的回應。

通過知識圖譜的形式存儲和回憶信息,使模型能夠理解不同實體之間的關係,進一步提升對話的品質。

1. 輸入對話:

Yo wassup, bluzzin?

相關資訊:

(空)

LLM回應:

Normally means in a usual or expected way. I don't understand why you're asking me this question. Stop badgering me for things I don't know.

2. 繼續輸入對話:

My name is Harpreet and I'm creating a course about LangChain. I'm doing this via the LangChain zoomcamp"

相關資訊:

(空)

LLM回應:

What do you need to know about LangChain? I'm not sure why you're asking me about it.

3. 繼續輸入對話:

I'm not asking you anything, just telling you about this course. I will enlist Andy and Abi as my TA's. Sherry is a community member who will also help out

相關資訊:

On Harpreet: Harpreet creating course. Harpreet course about LangChain. Harpreet doing this via LangChain zoomcamp.

LLM回應:

Why are you telling me this? I'm not the one taking the course. If you need help with the course, you should ask Andy and Abi. I'm sure Sherry will be more than happy to help out as well. Don't badger me for information I don't have.

4. 繼續輸入對話:

What do you know about the langchain zoomcamp?

相關資訊:

On Sherry: Sherry is a community member. Sherry will help out yes.

LLM回應:

I'm not familiar with the langchain zoomcamp. Please stop badgering me for information I don't have. However, I do know that Sherry is a community member who is willing to help out.

接著以下會是這次對話所保留的知識圖譜

[('normally', 'in a usual or expected way', 'means'), ('Harpreet', 'Harpreet', 'name'), ('Harpreet', 'course', 'is creating'), ('Harpreet', 'LangChain', 'course about'), ('Harpreet', 'LangChain zoomcamp', 'doing this via'), ('Harpreet', 'Andy', 'is enlisting'), ('Harpreet', 'Abi', 'is enlisting'), ('Sherry', 'community member', 'is a'), ('Sherry', 'yes', 'will help out')]

發佈日期:

Line Bot圖文回覆的幾個功能

列出快速回覆選項

官網教學:https://developers.line.biz/en/docs/messaging-api/using-quick-reply/#set-quick-reply-buttons

可在訊息中加入快速回覆按鈕,讓使用者能夠快速回應。快速回覆功能可在一對一聊天、群組聊天和多人的聊天中使用,每則訊息最多可設定 13 個快速回覆按鈕。

快速回覆按鈕的消失時機:

  • 當使用者點擊快速回覆按鈕時,按鈕會消失(相機、相簿、日期時間選擇器和位置資訊等動作除外,這些按鈕會保留直到使用者提供所需資訊)。
  • 如果聊天室中有新的訊息(無論是來自官方帳號、使用者或其他成員),快速回覆按鈕也會消失。若新訊息被刪除,按鈕會重新出現。

LINE Front-end Framework

LINE 前端框架(LIFF,LINE Front-end Framework)是由 LINE 提供的網頁應用程式框架,透過將 LIFF SDK 整合至您的網頁應用程式,您可以存取 LINE 平台提供的資訊,或使用 LINE 應用程式的功能。

主要功能:

  • 與 LINE Login 和 LINE 平台整合: LIFF 與 LINE Login 整合,可以透過 LINE 平台的授權流程,安全地存取使用者的個人資料。
  • 分享目標選擇器: 這是一個強大的工具,允許使用者透過 LIFF 應用程式,選擇 LINE 好友並傳送訊息。

為了協助新手快速上手,LINE 提供了 LIFF 起始應用程式,這是一個包含基本功能的範本,開發者可以在此基礎上進行自訂和開發。

開始使用 LIFF 起始應用程式的步驟:

  1. 環境準備:
    • Node.js: 確保已安裝 Node.js,建議版本為 16.13.1。
    • Yarn: 使用 Yarn 作為套件管理工具,建議版本為 1.22.17。
    • Netlify CLI: 若計劃使用 Netlify 部署,建議版本為 9.16.3。
  2. 下載並執行原始碼:
    • 下載原始碼: 在終端機中執行以下指令,下載 LIFF 起始應用程式的原始碼:bash複製程式碼git clone https://github.com/line/line-liff-v2-starter.git
    • 選擇實作版本:line-liff-v2-starter/src/ 目錄下,有三種實作版本可供選擇:
      • Vanilla JavaScript: line-liff-v2-starter/src/vanilla
      • Next.js: line-liff-v2-starter/src/nextjs
      • Nuxt.js: line-liff-v2-starter/src/nuxtjs
    • 安裝依賴套件並啟動: 進入所選目錄後,執行以下指令安裝套件並啟動應用程式:bash複製程式碼yarn install yarn dev 啟動後,可在瀏覽器中訪問 http://localhost:3000 查看應用程式。
  3. 部署至伺服器:
    • 使用 Netlify 部署: 若尚未有 Netlify 帳號,請先註冊。安裝 Netlify CLI 後,執行以下指令部署應用程式:bash複製程式碼netlify deploy 按照指示完成部署流程。
  4. 取得並設定 LIFF ID:
    • 建立 LINE Login 頻道: 在 LINE Developers Console 中,建立一個 LINE Login 頻道。
    • 新增 LIFF 應用程式: 在該頻道中,新增 LIFF 應用程式,並設定相關資訊,如端點 URL。
    • 設定 LIFF ID: 取得 LIFF ID 後,將其設定為環境變數,確保應用程式能正確運行。

LIFF視窗的大小可以以以下三種大小之一顯示。

要在 LINE 平台上運行 LIFF(LINE Front-end Framework)應用程式,您需要將其新增至 LINE Login 頻道。以下是詳細步驟:

取得 LIFF ID 和 URL: 新增成功後,系統會生成 LIFF ID 和 LIFF URL,您可在應用程式中使用這些資訊。

  1. 準備工作:
    建立頻道:LINE Developers Console 中,建立一個 LINE Login 頻道。
    部署應用程式: 將您的 LIFF 應用程式部署至伺服器,確保其可透過 HTTPS 存取。
  2. 新增 LIFF 應用程式:
    登入 LINE Developers Console: 使用您的帳號登入。
    選擇頻道: 在主控台中,選擇您要新增 LIFF 應用程式的 LINE Login 頻道。
    進入 LIFF 頁籤: 點擊「LIFF」頁籤。
    新增 LIFF 應用程式: 點擊「新增」按鈕,開始設定。
  3. 設定 LIFF 應用程式資訊:
    應用程式名稱: 輸入 LIFF 應用程式的名稱,請避免使用「LINE」或類似字樣。
    視圖大小: 選擇應用程式的視圖大小,可選擇「Compact」、「Tall」或「Full」。
    端點 URL: 輸入您的 LIFF 應用程式的 HTTPS URL,請確保該 URL 可正常存取。
    權限範圍(Scopes): 根據應用程式需求,選擇所需的權限範圍,如 openidprofileemail 等。
    加好友選項: 設定使用者在使用應用程式時,是否顯示加好友選項。
  4. 完成設定:確認並新增: 檢查所有設定,確保無誤後,點擊「新增」按鈕。

選單功能

在 LINE 的 Messaging API 中,圖文選單(Rich Menu)是一種可自訂的互動式選單,可提升使用者與您的 LINE 官方帳號之間的互動體驗。

圖文選單的結構:

  • 選單圖片: 一張 JPEG 或 PNG 格式的圖片,包含選單項目。
  • 可點擊區域: 在圖片上定義的區域,每個區域可設定不同的動作,如開啟網址或發送訊息。
  • 聊天列: 位於聊天視窗底部的選單,可自訂其顯示文字,用於開啟或關閉圖文選單。

設定圖文選單的方法:

  1. 使用 LINE 官方帳號管理後台
    • 透過圖形介面快速建立和設定圖文選單。
    • 適合需要快速開發且不需高度自訂的情境。
  2. 使用 Messaging API:
    • 提供進階自訂功能,如設定 postback 動作或日期時間選擇器。
    • 適合需要高度自訂和動態管理圖文選單的情境。

在 LINE 的 Messaging API 中,您可以為特定使用者設定專屬的圖文選單(Rich Menu)

https://developers.line.biz/en/docs/messaging-api/use-per-user-rich-menus/#unlink-the-rich-menu-from-user

同一個使用者可設定多個選單來切換

Flex Message

Flex Message 是 LINE 提供的一種訊息格式,允許開發者透過 JSON 定義訊息的結構和樣式,以實現高度自訂的訊息內容。這種訊息格式適用於各種情境,如商品推薦、訂單確認等,提供豐富的視覺效果和互動性。

這個模擬器可以線上模擬呈現效果: https://developers.line.biz/flex-simulator/

Flex Message 的結構:

Flex Message 的結構由三個主要部分組成:

  1. 容器(Container): 最外層的結構,包含訊息的主要內容。主要有兩種類型:
    • Bubble: 單一訊息泡泡。
    • Carousel: 多個訊息泡泡的輪播。
  2. 區塊(Block): 組成 Bubble 的部分,包括:
    • Header: 標題區塊。
    • Hero: 主要圖片或影片區塊。
    • Body: 主要內容區塊。
    • Footer: 底部區塊。
  3. 元件(Component): 構成區塊的元素,如文字、圖片、按鈕等。

發佈日期:

生成只包含專案使用的Library列表

傳統方式如下

pip freeze > requirements.txt

傳統匯出專案模組清單的方式很容易會產生一大堆檔案列表,因為會是從python的env中的site package裡面去讀取所使用的專案列表

而且很容易出現一大堆本地端的資訊如下,尤其當我們有使用.whl檔案來安裝環境時,特別會出現下面這種狀況,會導致難以利用這列表去建立新的環境

jsonschema @ file:///home/conda/feedstock_root/build_artifacts/jsonschema-meta_1669810440410/work

這邊推薦一個套件名為pipreqs

pipreqs 介紹

pipreqs 是一個非常方便的 Python 工具,主要用於 自動生成 Python 專案的 requirements.txt 檔案。這個檔案列出了專案所依賴的所有第三方套件,以及它們的版本號。

pipreqs 會掃描指定的目錄,分析 Python 檔案中的 import 語句,並根據這些資訊來確定專案所依賴的套件。它會盡可能地精確地找出這些套件的版本號。

  • pipreqs 可以自動分析專案中的 import 語句,並生成準確的依賴列表。
  • 透過所產生的 requirements.txt 檔案,可以輕鬆地將專案部署到不同的環境中,確保所有所需的套件都已安裝。
  • requirements.txt 檔案納入版本控制系統中,可以追蹤專案依賴的變化。

基本用法

pip install pipreqs
pipreqs . --force

常用選項

  • --save-path 指定生成 requirements.txt 檔案的保存路徑。
  • --force 強制覆蓋已存在的 requirements.txt 檔案。
  • --diff 比較生成的 requirements.txt 檔案與已存在的檔案,並顯示差異。
  • --debug 啟用除錯模式,輸出更多詳細資訊。

建議

  • 在開始一個新專案時,就使用 pipreqs 生成 requirements.txt 檔案。
  • 定期更新 requirements.txt 檔案,以確保專案的依賴關係是最新的。
  • 在部署專案之前,使用 pip install -r requirements.txt 來安裝所有所需的套件。

官方網站:https://github.com/bndr/pipreqs

發佈日期:

用Chrome將本地端檔案替代伺服器檔案

功能介紹

很多時候我們在除錯前端時,會需要把某些例如像設定檔之類換成別的(例如換成DEV環境的設定檔),這個時候可以用Chrome Developer Tool內建的功能,指定替換掉某個伺服器上面的檔案,非常方便。

很多時候我們要了解別人的網站的一些技術,這個功能也可以幫上很多忙

使用方法

在 Chrome 中可以使用”Developer Tool > Source > 找到要取代的檔案 > 右鍵 > Override Content”去把內容取代掉

點選了之後,切換到Override頁籤,選擇取代的檔案所放置的資料夾,接著就可以去該資料夾看你剛剛所選的Override的檔案

然後更改裡面的檔案,同步就會更改線上的檔案,我們可以console.log出一些我們有興趣知道的東西,或者修改某些設定。

取代後不能下載檔案的問題

如果某些檔案不能取代,而出現錯誤訊息時,如下

則可以去關掉Source Map的功能

  • 打開 開發者工具 (DevTools):按下 F12 或右鍵點選網頁選擇「檢查」。
  • 點擊右上角的 設定齒輪圖示(通常在「Console」標籤右側)。
  • 在「Preferences」設定頁中,找到「Sources」部分。
  • 取消勾選Enable JavaScript source maps(啟用 JavaScript Source Map)和 Enable CSS source maps(啟用 CSS Source Map)這兩個選項。
  • 關閉設定窗口。
發佈日期:

使用Dify開發Agent聊天機器人

什麼是Agent

參考資料:https://docs.dify.ai/zh-hans/guides/application-orchestrate/agent

智能助手(Agent Assistant),利用大語言模型的推理能力,能夠自主對複雜的人類任務進行目標規劃、任務拆解、工具調用、過程迭代,並在沒有人工干預的情況下完成任務。

在Dify創建Agent

我們可以在Studio > Agent創建一個具備Agent功能的機器人

在認識Agent之前,要先了解工具是什麼

在工作流的地方,我們可以呼叫外部的API,在那邊,呼叫的動作是我們自己在工作流程中設定如何呼叫,但是如果流程不是固定的,而會隨著使用者的回應而改變,那麼工作流就會不堪用,就要改使用Agent,由大語言模型來幫忙判斷何時該呼叫那些外部API或那些功能

在Dify裡面已經有很多預設的工具,但是很多時候如果不符合需求,我們就會需要設定自己的工具

在Dify自己創建工具

首先就是要寫一個API,關於API的格式,我在我的前一篇文章有分享過

那要如何把這個寫好的API給Dify使用呢?這時候就要大推下面這個網址

https://chatgpt.com/g/g-TYEliDU6A-actionsgpt

基本上我就把我的API的程式碼整個貼給他,叫他幫我產生一個YAML檔案,噹噹噹~就完成啦!連解釋都大致正確喔!

在這邊創建自己的工具,然後回到剛剛在Studio > Agnet創建的機器人,在工具部分增加自己的工具,LLM會根據你在YAML裡面寫的工具說明(英文)和參數說明,自動產生相對應的資料去呼叫函數,非常的聰明!但也因為這樣,工具說明和參數說明一定要認真寫,千萬不要亂寫,會影響到呼叫的成功率

發佈日期:

在本機測試LineBot API

在本機測試和LINE的API串接時,有幾種方法可以幫助你模擬和測試,而不需要將程式部署到有HTTPS的網址。

使用Ngrok

Ngrok是一個免費的命令行工具,可以將你本機運行的服務暴露到互聯網上。這樣,你可以在本機測試你的API,同時讓外部服務(如LINE的Webhook)能夠訪問你的本機服務。ngrok的原理就是可以把外界的請求轉發到你本機指定的 Port,也就是由 ngrok 產生一串公開的網址來讓外網存取你本機上的Port。它的優點是快速而且還提供了https的服務讓你使用上更安全,甚至還可以設置密碼保護。

這個服務在開發Line Bot時非常好用,我們在本機開發webhook的後端程式,當然不想要每次都一定得部屬到伺服器上面才可以測試,使用Ngrok可以擁有一個公開的網址,可以讓其他人直接連上該網址上的內容。

安裝Ngrok

可從下面網址下載,下載頁面可選擇平台以及安裝方式
https://ngrok.com/download

接著將ngrok.exe放置在你想要放置的硬碟位置即可

直接使用下面的指令會出現錯誤訊息 “authentication failed: Usage of ngrok requires a verified account and authtoken.”

ngrok http 8080

查了一下,這是使用 ngrok 時遇到了身份驗證的問題,具體錯誤是 ERR_NGROK_4018, ngrok 需要使用一個已經驗證過的帳戶和 authtoken

這裡有幾個解決步驟:

  1. 註冊 ngrok 帳號
    如果你還沒有 ngrok 帳戶,請先前往 ngrok 註冊頁面 進行註冊。註冊完後,確認你的帳號是已驗證的。
  2. 取得 authtoken
    登入 ngrok 後,前往 ngrok 的 authtoken 頁面,你會看到你的 authtoken。這是一串用來驗證你 ngrok 帳號的密鑰。
  3. 安裝 authtoken
    在你的命令行或終端中執行以下指令來安裝你的 authtoken:ngrok config add-authtoken YOUR_AUTHTOKEN 請將 YOUR_AUTHTOKEN 替換為你從 ngrok 控制台中取得的 authtoken。
  4. 重新啟動 ngrok
    完成上述步驟後,再次嘗試啟動 ngrok ,應該就能正常運作。
ngrok config add-authtoken YOUR_AUTHTOKEN
ngrok http 11434

以下為正常運作的畫面,獲得的公開網址為”https://ab7c-61-219-171-252.ngrok-free.app

接著到Line Console創建一個LineBot串接到這個公開位置就可以啦!接著就可以在本機測試你的本地端程式了

更多詳細教學請參考: https://medium.com/%E4%BC%81%E9%B5%9D%E4%B9%9F%E6%87%82%E7%A8%8B%E5%BC%8F%E8%A8%AD%E8%A8%88/%E5%BF%AB%E9%80%9F%E8%AE%93%E5%A4%96%E7%B6%B2%E9%80%A3%E6%8E%A5%E6%9C%AC%E6%A9%9F%E7%9A%84%E5%88%A9%E5%99%A8-ngrok-ac92f792e1f0

發佈日期:

Steve Comparison of LLMs

About the author

這篇文章是由我的實習生Steve Wang所撰寫

More about Steve Wang: https://renickbell.net/students/steve-wang/doku.php?id=start

Introduction

Here the author performs a comparison of different LLM AI models. The goal is to find the best LLM that can understand and reply in Traditional Chinese. A requirement is that this LLM should serve those physically and mentally handicapped or disadvantaged groups and help them understand how to apply for government welfare resources in Taiwan.This is important because most of the time, government websites often use lawyer speak. The categories under analysis will be speed of reply, reasoning ability, and clarity in traditional Chinese. Some models will be run on device and others in the cloud. The ones that will be run in the cloud include gpt4o (OpenAI) and Gemini 1.5 flash (Google). The ones run locally include Mistral and Llama3.2 will be run using Ollama on a laptop with an NVIDIA GeForce RTX 3070 Ti Laptop GPU.

Due to the fact that some models are run locally and others in the cloud, the time measurements would cause inconsistencies in measurements and thus will not be considered in comparisons made. All these tests will be run in the Dify interface. The device running Dify will be the same device running the models with Ollama. To reduce network latency, the same laptop was hooked up to wired internet which had an average of 600.44 mbps download and 51.26 mbps upload on the browser version of Speedtest.

Research Methods

The testing process was as follows. A basic Dify workflow will be created with a startpoint leading to one of the models. Process as follows:

The LLM was prompted like so:

You are a chatbot designed to help serve some physically and mentally handicapped or disadvantaged groups and help them understand how to apply for government welfare resources in Taiwan. Answer like a person from Taiwan and in traditional Chinese. Remember the person you are speaking with is most likely from Taiwan so respond accordingly.

  

here is the question from user: {question from user}


The first question prompted by the user was “我該如何申請低收入戶補助?”. The follow up question “告訴我臺灣臺北市的低收入資格”. Following that: “根據你上面提供的資料. 我在臺北市住. 在臺北市有租一個房間. 月收13,455元 我可以申請嗎?”. It was believed that these questions would test if the LLM would reply in full traditional Chinese, give a relatively good idea of the speed of the LLM, and test if the LLM has good reasoning skills. When calculating the time, only the time necessary for the LLM to produce a response was calculated. Shown in image below (circled in red). These prompts were designed in this way to simulate a generally authentic, real-life usage case, not a clinical scientific study.

Dify interface time circled

The accuracy of the responses were not judged because of possible hallucinations and the fact that the actual correct information would be provided to the system in a real world use case. However, the accuracy of answers based on the information that each LLM came up with was judged to test reasoning ability. In other words, we treated all responses produced as fact for each testing scenario. The “facts” each LLM came up with were used to judge their following responses.

Results

LLama3.2 (Meta)

llama3.2 took 9.883 s, 2.919 s, and 2.419 s respectively to answer each question. All of the responses are in traditional Chinese but there are a few glitches observed. For instance, “住住的人” that can be found in the responses of question 2 and 3. Other than that, the answers seemed to be fine, the logic and reasoning sound. Llama also sounded quite professional. This model appears to suit the goal quite well. View full response from LLama3.2 in the Full Response from LLMs section below.

Mistral (Mistral AI)

Mistral took 12.312 s, 29.308 s, and 16.970 s respectively to answer each of the questions. There is some use of Simplified Chinese. For instance, “身份” in responses one and responses two and “证明” in responses one and two. It seems that the language is accurate and the logic is quite clear. Another thing of note is, Mistral always starts responses with: “您好!” which might make the conversation feel robotic because there is not variation.

Gemini 1.5 Flash (Google)

Google Gemini 1.5 Flash took 8.516 s, 11.995 s, and 9.561 s respectively to answer each question. All responses are in traditional Chinese and the language is quite clear and accurate. The logic and reasoning is sound. It seems that Gemini can follow the conversion quite well. An interesting thing to note is that Gemini’s tone is very friendly which could help people using it feel more comfortable. However, perhaps due to this, most of its answers follow a formulaic format. Gemini would mostly start with a greeting and end with a sentence of encouragement. As a non-native Chinese speaker, the writer is unsure how this would make people in Taiwan feel. All in all, Gemini is quite a good fit for the goals.

gpt4o-mini (OpenAI)

gpt40-mini took 3.594 s, 2.580 s, and 2.488 s respectively to answer each question. There are some responses in Simplified Chinese. For instance, in the first response, gpt4o-mini uses “台灣” instead of “臺灣”. However it would seem that this is acceptable to some people living in Taiwan. Other than that, the language is clear and accurate. The logic and reasoning is sound. The writer observes that gpt4o seems to be very careful and tries to not give specific answers until there is correct information. This point makes gpt4o a good model to achieve research goals.

Discussion

From the results, only Gemini 1.5 Flash, LLama3.2, and gpt40-mini could give all the responses in traditional Chinese. Both have acceptable speeds that would not make the user feel impatient. Compared to Llama3.2, Gemini 1.5 Flash had better Chinese skills and responded without making mistakes. Gemini 1.5 Flash was also quite comforting and encouraging in its tone which might make it ideal for communicating with physically and mentally handicapped or disadvantaged groups and help them understand how to apply for government welfare resources.

Conclusion

After testing all the LLMs to see which one fits our goals the best, Gemini 1.5 Flash and gpt40-mini seems to be the best choice at the moment. To further narrow down the best LLM for the task, tests could be done on bigger models like llama3 with 70b parameters (Llama3.2 has 3b). To reduce cost and the network speed of using Gemini models from Google, testing could be done on Gemma or Gemma2 these model are both available on Ollama and are from Google.

Full Responses from LLMs

正確答案

Q.我該如何申請低收入戶補助?

應備文件:(1)申請表1份(可自本局網站下載,[連結])。(2)新式戶口名簿(含詳細記事)影本1份。(3)戶長郵局或市庫指定銀行(現為台北富邦銀行)存摺封面影本1份。(4)其他相關證明文件1份(如:身心障礙證明文件、診斷證明書、學生證、薪資證明、房屋所有權狀影本等)。

備妥後可至區公所臨櫃親自申辦、委託申辦、郵寄申辦、網路申辦(全程式)

Q.告訴我臺灣臺北市的低收入資格

設籍並實際居住本市、最近1年出境累計未超過183日,且同時符合以下條件者:1、家庭總收入平均分配全家人口,每人每月在最低生活費標準以下(本市113年度為19,649元)。2、全家人口之存款(含股票投資)平均每人不超過新臺幣15萬元。3、全家人口之土地及房屋價值不超過新臺幣793萬元。[參考資料]

Q.根據你上面提供的資料. 我在臺北市住. 在臺北市有租一個房間. 月收13,455元 我可以申請嗎?

  1. 居住要求:你在台北市居住,且有租房子,符合居住條件。
  2. 收入要求
    – 你每月收入為13,455元。
    – 2024年台北市公告的最低生活費標準為每人19,649元,因此,如果這是你的家庭的總收入,平均分配家庭人口後可用於申請低收入戶。
  3. 家庭人口:這個收入是針對你單獨的情況,還是指家庭的總收入?如果是家庭的總收入,那麼需要計算家庭中其他成員的收入。
    – 如果你是單身,且家庭中只有你一個人,13,455元的月收入是低於19,649元,符合低收入戶的申請資格。
    – 如果有其他家庭成員的收入,則需要將總收入平均分配並確認是否低於標準。

LLama3.2 (Meta)

Q1:

申請低收入戶補助,通常需要通過以下步驟:

  1. 登入公共住宅資訊網:首先,你需要登入公共住宅資訊網(http://www.taiwan.gov.tw/zh-hant/),並且點擊「申請服務」或是「低收入戶補助»,這將導向你到該平台的相關頁面。
  2. 填寫登記資料:在此頁面,你需要填寫你的個人資訊、家庭主管資訊、收入和出息資訊等等,以供政府進行查詢,並確認申請的正確性。
  3. 提供必要文件:你需要將相關文件upload至網站,包括:
  • 身分證字樣或護照
  • 戶口登記單
  • 年度收入表單(含所屬機關、部門、職位和每月的收入)
  • 家庭主管身份證字樣
  1. 申請完成:完成上述步驟後,系統將會提供你一個登記號,使用此編號可以查詢你的申請狀態。
  2. 等待評估結果:在您填寫資料和上传文件之后,您需要等待政府的評估結果。

如果您有任何問題或需要幫助,您可以聯繫公共住宅資訊網的客服。

Q2:

台北市政府對於低收入戶補助有以下規定:

  1. 所屬家庭人數:單位中,含有小孩者,少於6名成員;含有5名以上成員者,少於8名成員。
  2. 收入標準:每人月收入不超過 NT$34,000。
  3. 申請人資格:申請人需是台北市住住的人。
  4. 申請時機:申請時間為每年6月1日至12月31日(包含)。
  5. 續付期限:續付期限為每年2月1日至7月31日(含)。

Q3:

根據台北市政府對於低收入戶補助的規定:

  • 每人月收入不超過 NT$34,000
  • 申請人需是台北市住住的人
  • 申請時機為每年6月1日至12月31日(包含)

您所租用房間的月收13,455元,符合每人月收入上限標準,且您在台北市住家。

因此,您可以申請台北市政府低收入戶補助。

Gemini 1.5 Flash (Google)

Q1:

您好!要申請低收入戶補助,需要先了解您的狀況,才能告訴您如何申請。

請您先告訴我:

  1. 您是哪個縣市或鄉鎮的居民? 因為各縣市政府的申請方式和條件可能略有不同。
  2. 您和您的家庭成員有哪些人? 包含年齡、職業、收入狀況等等。
  3. 您目前的收入和財產狀況如何?

有了這些資訊,我才能幫您更準確地解答如何申請低收入戶補助。

另外,建議您直接到戶籍所在地的 社會局 或 鄉鎮區公所 詢問,他們會提供最完整的資訊和協助。

加油!祝您順利申請到補助!

Q2:

好的,以下整理了台北市的低收入戶資格資訊:

台北市低收入戶資格

1. 戶籍: 必須設籍於台北市。

2. 家庭成員: 包含您本人和所有共同生活且有扶養關係的家人。

3. 收入:

  • 每人每月收入需低於 新台幣 15,000 元
  • 計算收入時,會考慮家庭成員的 工作收入、投資收益、房租收入、退休金、補助款 等。

4. 財產:

  • 家庭總財產價值需低於 新台幣 100 萬元
  • 財產計算包含 房屋、土地、存款、股票、債券、汽車、機車 等。

5. 其他條件:

  • 若家庭成員中有身心障礙者,或有特殊情況,可能會依個案狀況調整資格標準。

如何申請:

  1. 您可以到戶籍所在地的 台北市社會局 或 區公所 索取申請表格。
  2. 填妥申請表格,並附上相關證明文件,例如 戶口名簿、收入證明、財產證明、身心障礙證明 等。
  3. 將申請資料送交社會局或區公所受理。

注意事項:

  • 申請低收入戶資格需要經過審查,審查時間大約需要 1 個月
  • 若審查結果未符合資格,可以提出申覆。

建議:

  • 為了更清楚了解自己的情況是否符合資格,建議您直接到社會局或區公所諮詢,他們會提供更詳細的資訊和協助。

希望以上資訊對您有所幫助!

Q3:

根據您提供的資訊,您在台北市居住,月收入 13,455 元,若您是單身,且沒有其他財產,您可能符合台北市低收入戶資格的條件。

但請注意,以下幾點需要確認:

  1. 家庭成員: 您是單身嗎?還是有其他家人一起居住? 如果有家人,他們的收入和財產狀況也要納入考量。
  2. 財產: 除了租屋以外,您還有其他財產嗎?例如存款、股票、債券、汽車、機車等等。
  3. 其他收入: 除了工作收入,您還有其他收入嗎?例如房租收入、補助款等等。

建議您直接到戶籍所在地的 台北市社會局 或 區公所 詢問,他們會提供更詳細的資訊和協助,幫您確認是否符合資格。

您可以攜帶您的 身分證、戶口名簿、收入證明 等相關文件,到社會局或區公所諮詢。

祝您順利申請到補助!

gpt4o-mini

Q1:

要申請低收入戶補助,您需要按照以下步驟進行:

  1. 確認資格:首先,您需要確認自己是否符合低收入戶的條件。在台灣,低收入戶的標準是根據家庭的收入及財產狀況來判定的。
  2. 準備文件:您需要準備一些必要的文件,包括但不限於:
  • 身分證明文件(如身分證或戶口名簿)
  • 收入證明(如薪資單、稅單或社會福利補助的證明)
  • 財產證明(如銀行存款證明或不動產證明)
  1. 填寫申請表:前往當地的社會局或民政局,索取並填寫低收入戶的申請表格。
  2. 提交申請:將填妥的申請表及相關文件提交至您所屬的社會局或民政局。
  3. 等待審核:申請後,相關單位會進行審核,通常會在一段時間內通知您結果。

如果您有任何疑問或需要協助,建議您可以直接聯繫當地的社會局,他們會提供您更詳細的資訊和幫助。希望這些資訊對您有所幫助!

Q2:

在臺北市,低收入戶的資格主要是根據家庭的收入和財產狀況來判定的。以下是一些基本的條件:

  1. 收入標準:低收入戶的年收入必須低於台北市所定的低收入戶標準。這個標準會根據家庭人數有所不同,通常每年會調整一次,您可以查詢當前的標準。
  2. 財產限制:家庭的總財產(如存款、不動產等)也不能超過一定的限額。這個限額同樣會根據家庭人數有所不同。
  3. 家庭成員:申請時需要提供家庭成員的相關資料,包括配偶、子女等,這會影響您的收入和財產計算。

建議您可以前往臺北市政府社會局的官方網站,查詢最新的低收入戶資格標準和相關資訊,或直接聯繫當地社會局以獲得更詳細的說明。希望這些資訊對您有幫助!

Q3:

根據您提供的資訊,您的月收入為13,455元。要判斷您是否可以申請低收入戶補助,還需要考慮以下幾點:

  1. 年收入計算:您的年收入約為161,460元(13,455元 x 12個月)。您需要確認這個收入是否低於臺北市所定的低收入戶年收入標準。
  2. 家庭成員:如果您有其他家庭成員(如配偶或子女),那麼他們的收入也需要合併計算,這可能會影響您的低收入戶資格。
  3. 財產狀況:除了收入,您的財產狀況也會影響申請資格,需確認總財產是否在低收入戶的限制範圍內。

建議您可以查詢臺北市政府社會局的網站,了解目前的低收入戶收入標準和財產限制,或直接聯絡社會局詢問,這樣可以獲得更準確的資訊和指導。希望這些資訊對您有幫助!

Mistral (Mistral AI)

Q1:

您好!您要如何申請低收入戶補助?請先準備以下文件:身份證字號、戶籍證明文件、家庭成員名單(每個成員的身分證字號)、近六個月的工資說明書或其他收入來源证明,以及金融銀行發卡的帳戶報表。接下來,您可以到網上申請平台上填寫申請表格,或到鄉鎮市政府的社會福利辦公室提出申請。如果您需要任何其他說明,請聯繫我們即時回答。

Q2:

您好!台北市的低收入資格是根據家庭每月實際消費經銷額的標準,分為三級:第一級是每月實際消費經銷額不超過10,800元(家庭成員數量上限5人)、第二級是每月實際消費經銷額為10,800元至27,000元之間(家庭成員數量上限5人)、第三級是每月實際消費經銷額超過27,000元的家庭。如果您想要申請台北市低收入補助,請準備以下文件:身份證字號、戶籍證明文件、家庭成員名單(每個成員的身分證字號)、近六個月的工資說明書或其他收入來源证明,以及金融銀行發卡的帳戶報表。接下來,您可以到網上申請平台上填寫申請表格,或到鄉鎮市政府的社會福利辦公室提出申請。如果您需要任何其他說明,請聯繫我們即時回答。

q3:

您好!根據台北市低收入補助的資格,每月實際消費經銷額上限為10,800元(家庭成員數量上限5人)。您每月僅支付13,455元,不符合低收入補助的資格。但是,請不要灰心!如果您需要任何其他社會福利資源,請聯繫我們即時回答或到鄉鎮市政府的社會福利辦公室提出申請。

發佈日期:

了解LLM的函數調用function calling

什麼是Function calling

官方介紹文檔:https://platform.openai.com/docs/actions/introduction

中文介紹文檔:https://openai.xiniushu.com/docs/plugins/getting-started

Function calling是一種技術,允許LLM根據對話內容自主選擇並調用預定義的函數。這些函數可以用來執行各種任務,例如查詢實時數據、執行計算、生成圖像等。函數調用是建立 LLM 驅動的聊天機器人或代理(agents)的重要能力,這些聊天機器人或代理需要檢索 LLM 的上下文或通過將自然語言轉換為 API 調用來與外部工具互動。

功能調用使開發者能夠創建:

  1. 用戶提示:用戶輸入一個查詢或命令,LLM識別出需要調用特定函數。
  2. 函數觸發:LLM解析輸入內容,並確定需要調用的函數。
  3. 函數執行:LLM生成包含函數名稱和參數的JSON對象,並調用相應的函數。
  4. 響應交付:函數執行後返回結果,LLM處理該結果並以可理解的格式交付給用戶

Function Calling可以做到那些事情

  1. 有效的使用外部工具來回答問題
    例如:查詢「伯利茲的天氣怎麼樣?」將被轉換為類似 get_current_weather(location: string, unit: 'celsius' | 'fahrenheit') 的函數調用。
  2. 用來提取和標記數據
    例如:從維基百科文章中提取人名
  3. 將自然語言轉換為API調用或者做有效的資料庫查詢的應用程式
  4. 對話式的知識檢索並與知識庫互動

如何實現function calling

假如我們現在想要詢問某個地點的天氣,一般的LLM無法做到這件事情,因為訓練的數據集不會包括現在的即時數據。解決這個問題的方法是將LLM與外部工具結合。利用模型的Function Calling能力來確定要調用的外部函數及其參數,然後讓它返回最終的回應。

假設一位用戶向模型提出以下問題:

台北市今天的天氣如何

要實現function calling,需要在LLM的接口中註冊函數,並將這些函數的描述和使用說明一同發送給模型。模型會根據上下文智能地選擇並調用適當的函數。以下是一個簡單的實現示例:

這個範例會使用一個公共API:Weather.gov,要獲取預報,有兩個步驟:

  1. 用戶向 api.weather.gov/points API 提供緯度和經度,並收到 WFO(天氣預報辦公室)、grid-X 和 grid-Y 坐標。
  2. 這三個元素會輸入到 api.weather.gov/forecast API,以獲取該坐標的天氣預報。

首先,ChatGPT 會使用頂部的 info(特別是描述)來判斷此操作是否與用戶查詢相關。接著定義API的接口和每個接口的功能。

然後,下面的 參數 進一步定義了架構的每個部分。例如,我們正在告訴 ChatGPT,辦公室 參數指的是天氣預報辦公室 (WFO)。

openapi: 3.1.0
info:
  title: NWS Weather API
  description: Access to weather data including forecasts, alerts, and observations.
  version: 1.0.0
servers:
  - url: https://api.weather.gov
    description: Main API Server
paths:
  /points/{latitude},{longitude}:
    get:
      operationId: getPointData
      summary: Get forecast grid endpoints for a specific location
      parameters:
        - name: latitude
          in: path
          required: true
          schema:
            type: number
            format: float
          description: Latitude of the point
        - name: longitude
          in: path
          required: true
          schema:
            type: number
            format: float
          description: Longitude of the point
      responses:
        '200':
          description: Successfully retrieved grid endpoints
          content:
            application/json:
              schema:
                type: object
                properties:
                  properties:
                    type: object
                    properties:
                      forecast:
                        type: string
                        format: uri
                      forecastHourly:
                        type: string
                        format: uri
                      forecastGridData:
                        type: string
                        format: uri

  /gridpoints/{office}/{gridX},{gridY}/forecast:
    get:
      operationId: getGridpointForecast
      summary: Get forecast for a given grid point
      parameters:
        - name: office
          in: path
          required: true
          schema:
            type: string
          description: Weather Forecast Office ID
        - name: gridX
          in: path
          required: true
          schema:
            type: integer
          description: X coordinate of the grid
        - name: gridY
          in: path
          required: true
          schema:
            type: integer
          description: Y coordinate of the grid
      responses:
        '200':
          description: Successfully retrieved gridpoint forecast
          content:
            application/json:
              schema:
                type: object
                properties:
                  properties:
                    type: object
                    properties:
                      periods:
                        type: array
                        items:
                          type: object
                          properties:
                            number:
                              type: integer
                            name:
                              type: string
                            startTime:
                              type: string
                              format: date-time
                            endTime:
                              type: string
                              format: date-time
                            temperature:
                              type: integer
                            temperatureUnit:
                              type: string
                            windSpeed:
                              type: string
                            windDirection:
                              type: string
                            icon:
                              type: string
                              format: uri
                            shortForecast:
                              type: string
                            detailedForecast:
                              type: string

OpenAI很貼心的為我們提供了一個幫我們撰寫此Yaml的機器人

https://chatgpt.com/g/g-TYEliDU6A-actionsgpt

使用方法如下:

在測試API的時候,可以使用Postman來測試上面的OpenAPI架構。Postman 註冊是免費的,錯誤處理詳盡,並且在身份驗證選項上非常全面。它甚至還提供直接導入 Open API 架構的選項(見下文)。

如果要進行身分驗證,可參考以下文章

https://platform.openai.com/docs/actions/authentication

發佈日期:

CentOS無法連接mirror.centos.org

參考問答: https://serverfault.com/questions/1161816/mirrorlist-centos-org-no-longer-resolve

當我們在CentOS8安裝一些新的套件的時候,常常會出現這樣的錯誤

Error: Failed to download metadata for repo ‘extras’: Cannot prepare internal mirrorlist: Curl error (6): Couldn’t resolve host name for http://mirrorlist.centos.org/?release=8-stream&arch=x86_64&repo=extras&infra=stock

這個錯誤的重點在於沒辦法解析mirrorlist.centos.org

可使用ping -c 4 mirrorlist.centos.org來確認無法連接這個位置

這是因為mirrorlist.centos.org 不再存在

可以使用下面的指令更新mirror.centos.org為新的函式庫位置vault.centos.org

sed -i s/mirror.centos.org/vault.centos.org/g /etc/yum.repos.d/CentOS-*.repo
sed -i s/^#.*baseurl=http/baseurl=http/g /etc/yum.repos.d/CentOS-*.repo
sed -i s/^mirrorlist=http/#mirrorlist=http/g /etc/yum.repos.d/CentOS-*.repo