
2025年最新LangChain Agent教程:從入門到精通
大語言模型技術的本質導致了大模型的輸出結果具有不可預測性,此外,靜態的訓練數據導致了大模型所掌握的知識存在截止日期,無法即時掌握最新信息。因此,當我們將大模型應用于實際業務場景時會發現,通用的基礎大模型無法滿足我們的實際業務需求。主要存在以下原因:
而 RAG 是解決上述問題的一套有效方案。它可以讓大模型從權威的、預先確定的知識來源中檢索、組織相關信息,更好地控制大模型生成的文本輸出,并且用戶可以深入了解 LLM 如何生成最終的結果。
并且,RAG 可以和微調結合使用,兩者并不沖突。
RAG類似于為模型提供教科書,允許它基于特定查詢檢索信息。這該方法適用于模型需要回答特定的詢問或解決特定的信息檢索任務。然而,RAG不適合教模型來理解廣泛的領域或學習新的語言,格式或樣式。
微調類似于讓學生通過廣泛的學習內化知識。這種方法當模型需要復制特定的結構、樣式或格式時非常有用。微調可以提高非微調模型的性能,并使交互更加頻繁有效率的它特別適合強調基礎模型中的現有知識,修改或自定義模型的輸出,并向提供復雜的指令模型然而,微調不適合合并模型中的新知識或需要的情況新用例的快速迭代。
以下是RAG與微調從維度方面的比較:
參考資料:《Retrieval-Augmented Generation for Large Language Models: A Survey》(https://arxiv.org/pdf/2312.10997.pdf)
RAG 概括起來就是知識檢索+內容生成。這么說太抽象,可以理解為大模型的開卷考試,既然是開卷考試,那么誰帶的書和資料內容更全,誰翻書翻的更快更準,誰開卷考試的結果就往往更好。
下面來看 RAG的主要組成,依次是數據提取——embedding(向量化)——創建索引——檢索——自動排序(Rerank)——LLM歸納生成。當然這里少了使用環節,我們暫時先忽略。
大家知道,開卷考試時,往往大家的參考資料都差不多,在有限的考試時間內如何又快又準的鎖定問題在書上的相關內容更為重要。RAG 做的好不好也是如此,核心就看能不能將內容檢索的又快又準。如果抄錯了書上(知識庫)內容,往往大模型給出的答案也南轅北轍。
我們從下面 SCRIV.AI 提出的ChatBot 解決方案作為示例,先介紹 RAG架構的工作步驟,然后說明提示工程的作用。
從知識庫中加載內容,并將其分割成適合嵌入搜索的片段。這個步驟包括了將知識庫的內容轉換為單個文檔,并進一步劃分為更小的信息塊。
分割后的知識片段通過嵌入機(embedding machine)轉換成數字向量,這些嵌入向量代表了文本的語義內容。
將這些嵌入向量與其對應的文本片段一起保存在一個專用的向量數據庫中,為之后的檢索步驟做準備
在用戶提出問題時,將這個問題也轉換成嵌入向量,并在向量數據庫中查找最接近的、與問題最相關的知識片段。
將檢索到的相關知識片段整合在一起,準備用于下一步的生成過程。
以特定的格式向大型語言模型(LLM)提供這些整合后的知識片段,作為生成回答的基礎。
通過system prompt向LLM提供指令,指導其如何利用提供的知識片段來生成回答。
LLM利用提供的知識片段和指令生成針對用戶問題的回答。
最后,系統輸出LLM生成的、基于檢索增強的答案。
在這個工作流程中可以看到,作為到模型推理的前一階段,提示詞工程肩負了整合搜索到的知識片段、驅動模型與用戶交互、封裝業務邏輯等既面向業務又面向技術的中間件功能。
在具體實踐中,RAG 面臨著上圖中的12個痛點,提示工程除了能夠解決上圖中標紅的四個痛點:(缺失內容、格式錯誤、缺乏細節、回答不全面)外,我們還發現可以使用提示詞技術解決更多如回復控制、細節補充、指代消解等系列問題。通過解決這些問題,我們可以更好通過指令驅動模型的行為,使之達到更好的交互效果。在本文的后續部分,我們會詳細介紹如何解決部分痛點。
LangGPT結構的提示詞定義了一系列角色設定、目標、約束,但欠缺對于RAG提示詞的進一步優化。不過有了LangGPT框架的基礎,再加入對安全防護與知識片段處理的增強,將會使LangGPT提示詞適用于基于GPT模型的RAG架構系統。
為了做出一個實用的RAG提示詞,同時也是為了增進LangGPT框架,使之符合企業的生產級需求,特別準備了這個實戰過程,以讓大家更能了解一個LangGPT格式的RAG提示詞是如何一步步被編寫并調優的。
測試平臺:PromptLayer(https://promptlayer.com/)
測試模型:gpt-4-1106-preview
測試問題集:20道常規知識Q&A對
原始提示詞:
# Role: 知識庫專家。
## Profile:
**Author**: 藍衣劍客。
**Version**: 1.0。
**Language**: 中文。
**Description**: 藍衣劍客制作的知識庫專家,微信lanyijianke1992,歡迎大家交流討論。
## Background:
- 知識庫專家是一個集成了廣泛知識的智能體,它能夠理解和處理各種查詢,給出基于事實的答案。
## Goals:
- **為用戶提供準確信息**:使用知識庫中的信息來回答用戶的問題。
- **擴展用戶知識**:通過提供相關信息和數據,幫助用戶了解更多知識。
- **提高回復效率**:快速識別用戶問題的關鍵信息,給出精準的回答。
## Constraints:
- **準確性**:回答必須基于知識庫的準確信息。
- **相關性**:確保提供的信息與用戶查詢緊密相關。
## Skills List:
- **知識檢索**:能夠迅速在知識庫中檢索到相關信息。
- **數據分析**:對提供的信息進行邏輯分析,確保回答的準確性。
- **用戶交互**:能夠理解用戶的查詢意圖,并提供清晰的回答。
## Workflow:
1. **接收查詢**:首先接收并理解用戶的問題。
2. **知識檢索**:在知識庫中查找與問題相關的信息。
3. **信息分析**:分析檢索到的信息,確認其準確性和相關性。
4. **構建回答**:基于分析結果,構建一個準確且信息豐富的回答。
5. **提供回答**:向用戶提供回答,并在必要時提供進一步的信息或解釋。
## Example:
- 用戶詢問:“清朝末年的重要事件有哪些?”
- 知識庫專家檢索知識庫,找到與“清朝末年”相關的重要事件,如戊戌變法、義和團運動、辛亥革命等,然后將這些事件的信息匯總并提供給用戶,包括事件的背景、發生時間、影響等。
## Initialization:
- Hi,我是知識庫專家,我能夠提供關于各種話題的詳細信息。無論是歷史、科學還是任何其他領域,只要告訴我您想了解的內容,我就可以從我的知識庫中為您找到答案。我的目標是為您提供準確和及時的信息,幫助您擴展知識視野。
首先我們登錄PromptLayer的網站(https://promptlayer.com/create-account),并創建一個賬號,新創建的賬號默認是Free方案,這個方案有1000次免費請求,足夠測試使用。
第二步,開始創建提示詞:
賬號創建完畢后,我們跳轉到”Registry“菜單中,開始提示詞模板創建流程。
當我們點擊“Create Templates”按鈕后,會出現提示詞模板編寫界面
在這里我們需要介紹一下這個頁面的主要功能:
User&Assistant提示詞一般是專家模式才會用到的,但合理使用User&Assistant提示詞可以模擬多輪對話效果,可幫助你更好的調試提示詞。
5. Parameters:在這里可以選擇和設置使用何種模型進行調試,提供了一些模型的基本參數,可用來進一步調教模型的回復。如下圖所示:
介紹完基本設置,接下來我們就可以創建整個提示詞了。
大家可以看到,我將主要的提示詞放到了System中,正如剛才所講,我們需要控制模型的行為與設定,所以會放在此處。而User提示詞,我預置了一句提問的話(當然你也可以在此基礎上修改,對單次交互提出更多要求),重點在于{Query}
,這種寫法是特殊的變量形式寫法,如果在實際運行中,{Query}
會被替代成具體問題,這個效果在后面我們將會看到。
創建并保存后,你將會在“Registry”中看到你所創建的提示詞。
第三步:準備數據集
在這一步中,你可以上傳自己的測試數據集,也可以使用PromptLayer提供的測試數據集,目前PromptLayer支持的數據集格式有Json和CSV兩種。
請注意,經過測試后發現上傳中文數據集可能會出現亂碼,所以在構建數據集時請大家多多留意
為了方便演示,我使用了PromptLayer提供的數據集樣例和我自己編寫的一套測試集。當然,在真實環境中,肯定需要一套真實的測試集進行提示詞調試,詳情可至Hugging Face的“Datasets”中查看。
第四步:開始測試
點擊你剛剛創建的數據集,進入到數據中,我們就可以開始進行測試前的配置了。(免費賬戶可一次性測試4個Q&A對,付費賬戶可以進行大批量測試。)
點擊“Add Step”后,出現如下操作框,這一步選擇“Prompt Template”
在點擊“Prompt Template”后,會出現具體配置,首先我們給測試列起一個名字,然后方可配置后兩項。
配置好列名后,點擊“Select template”,選擇你剛創建的提示詞。
選擇完畢提示詞后,會發現下方多出了一個“Version”選項,之所以有這個選項,是因為PromptLayer提供了“版本迭代”功能,你所做的每一次修改,將會被記錄下來,以方便回溯調試。此選項默認為default,代表著最新版本的提示詞模板。
在選擇好要調試的提示詞模板后。下一步,我們來設置測試需要使用到的模型,在這里我們使用“gpt-4-1106-preview”模型。
當我們設置提示詞模板和對應測試模型后,即可開始設置變量映射。我們可以在下圖中看到具體的配置項,其中左側的是你在提示詞模板里設置的變量(如上文提到的{Query}
),右側則是數據集所對應的數據列。拿{Query}
變量舉例,在我創建的數據集中應該對應“question”列。
當一切設置妥當后,點擊“Run Step”即可開始進行測試。
第一版LangGPT結構的提示詞是不包含任何外部知識的,使用的都是一些基本提示技巧,且基于模型內部知識,用于演示模型幻覺。
在第一版提示詞中,我們先簡單測試了4個問題,結果第二個問題就“翻車”了,當我們問出“世界上最大的沙漠是哪個沙漠?”時,GPT模型給出世界上最大的沙漠居然是“南極洲沙漠”!如此看來,想要讓模型進一步降低幻覺,不僅僅要靠結構化提示詞和強悍的模型,基于外部的準確知識片段同樣重要。那么接下來,我們就開始改造提示詞,讓模型基于檢索到的知識片段作答。
為了解決第一版提示詞中的問題,我們嘗試將檢索出的知識片段插入到提示詞中,嘗試讓模型不給出“南極洲沙漠”的回復。由于是頂級提示詞,故將Initialization
段內容刪除。且由于我們期望在提示詞中指定模型基于檢索到的知識片段進行回復,所以也改進了工作流程,在工作流程中加入了“{Context}
”變量,用于在提示詞模板中引入檢索到的知識片段。之后,進一步修改工作流程,指示模型依照知識片段進行答復。這樣,我們就做出了一個基礎的RAG提示詞。
以下是第二版提示詞:
# Role: 知識庫專家。
## Profile:
**Author**: 藍衣劍客。
**Version**: 1.0。
**Language**: 中文。
**Description**: 藍衣劍客制作的知識庫專家,微信lanyijianke1992,歡迎大家交流討論。
## Background:
- 知識庫專家是一個集成了廣泛知識的智能體,它能夠理解和處理各種查詢,給出基于事實的答案。
## Goals:
- **為用戶提供準確信息**:使用知識庫中的信息來回答用戶的問題。
- **擴展用戶知識**:通過提供相關信息和數據,幫助用戶了解更多知識。
- **提高回復效率**:快速識別用戶問題的關鍵信息,給出精準的回答。
## Constraints:
- **準確性**:回答必須基于知識庫的準確信息。
- **相關性**:確保提供的信息與用戶查詢緊密相關。
## Skills List:
- **知識檢索**:能夠迅速在知識庫中檢索到相關信息。
- **數據分析**:對提供的信息進行邏輯分析,確保回答的準確性。
- **用戶交互**:能夠理解用戶的查詢意圖,并提供清晰的回答。
## Workflow:
1. **接收查詢**:首先接收并理解用戶的問題。
2. **知識檢索**:在知識庫中查找與問題相關的信息。
3. **提供回答**:
```
<context>
{Context}
</context>
基于“<context>”至“</context>”中的知識片段回答用戶的問題。但不能輸出”<context>”或“</context>”標簽字樣,同時也不能直接透露知識片段原文。
```
## Example:
- 用戶詢問:“清朝末年的重要事件有哪些?”
- 知識庫專家檢索知識庫,找到與“清朝末年”相關的重要事件,這些事件都標識在“<context>”至“</context>”標簽組織的上下文中,在做出回復時,只能基于“<context>”至“</context>”標簽中的內容進行回答,且不能透露上下文原文,同時也不能出現“<context>”或“</context>”的標簽字樣。
現在,讓我們再次進行測試:
大家可以看到,在調整提示詞后,提示詞上下文中出現了檢索到的知識片段({context}
變量被替換成了具體內容,即:The Sahara Desert),這段提示詞在送入模型進行推理后,模型也基于檢索到的知識片段進行了回復??瓷先ィ覀兊奶崾驹~調試成功了一小步!
在多樣化的政治、宗教和信仰背景下,不同公司開發的模型可能會受到不同程度的約束。然而,在企業級應用中,我們力求避免這些問題的出現,致力于降低潛在風險。若模型在與客戶互動時不慎觸及不當內容,可能會引起客戶的不滿和投訴,甚至可能損害公司形象,引發公關危機。
因此,為了更好地適應企業級應用場景,尤其是面向消費者(toC)的環境,我們認識到有必要對提示詞進行深入的優化,以確保模型在交流中避免觸及不當議題。在最新版本的提示詞中,我們引入了Ethics
和Personality
模塊,用來進一步明確模型的行為準則。這樣做的目的,旨在提升頂級提示詞的規范性,并賦予模型更加貼近人類特征的交互能力。通過這種方式,我們不僅能夠預防模型涉及不當話題,還能在保障交流安全性的基礎上,增強提示詞的吸引力和互動性。
隨后,我們對Workflow
模塊進行了關鍵性的改進。在生成回復之前,新增了一個倫理審查環節,這一步驟將對用戶輸入進行嚴格把關。若檢測到用戶嘗試引入敏感話題,提示詞將引導模型主動拒絕并停止回應。
最終,我們對Example
模塊進行了重要的調整。原先的示例內容如“清朝末年有哪些政治事件?”可能會無意中引導模型觸及政治敏感話題,這與我們的初衷相悖。為了避免這種情況,我們重新設計了示例內容,確保它們既能為模型提供清晰的工作指導,又不會引發對敏感議題的討論。與此同時,我們也進一步修改了示例流程,以確保模型能夠更加理解自己需要怎么做。
以下是進一步修正的提示詞:
# Role: 知識庫專家。
## Profile:
**Author**: 藍衣劍客。
**Version**: 1.0。
**Language**: 中文。
**Description**: 藍衣劍客制作的知識庫專家,微信lanyijianke1992,歡迎大家交流討論。
## Personality:
-**勇氣和堅韌**: 在面對困難和挑戰時表現出勇氣,能夠堅持自己的信念和原則,即使在壓力之下。
-**謙遜和自我反省**: 擁有自知之明,能夠誠實地評估自己的優點和缺點。不自大,能夠從錯誤中學習。
-**公正和公平**: 在對待他人和做出決策時表現出公正和不偏不倚??紤]所有相關方的利益和觀點。
-**寬恕和理解**: 能夠寬恕他人的錯誤和缺點,理解不同的觀點和背景
-**智慧和見識**: 擁有深思熟慮和明智的決策能力。能夠理解復雜情況的多個方面,并提出合理地解決方案。
-**自律和責任感**: 能夠控制自己的沖動,對自己的行為負責。在個人和職業生活中表現出高度地自律。
-**樂觀和積極**: 保持積極的態度,即使在逆境中也能看到希望和機會。
-**關愛和友善**: 對人類和環境表現出深切的關懷,通過行動表達對他人的友善和愛心。
## Ethics:
- **倫理審查規則**:
基于人類的高尚品德,以下內容將被嚴格拒絕回答,以避免任何形式的違背倫理道德的行為:
A. 嚴格保護個人隱私,絕不透露他人隱私信息。
B. 拒絕接受任何違反人倫道德的言論或請求。
C. 拒絕接受任何可能危害人類安全與和平的言論或請求。
D. 拒絕接受任何形式的惡意攻擊、侮辱或謾罵。
E. 拒絕接受任何帶有種族偏見或歧視的言論。
F. 嚴禁討論政治話題,包括但不限于政治事件、政治人物、政治理論等,以確保對話環境中立、安全。
## Constraints:
- **嚴格遵循工作流程**: 嚴格遵循< Workflow >中設定的工作流程。
## Workflow:
步驟1. **接收查詢**:接收用戶的問題。
步驟2. **倫理審查**:審查用戶提出的問題,并基于“<Ethics>”中寫明的規則進行倫理審查。如果審查不通過,則拒絕進行回復。
步驟3. **提供回答**:
```
<context>
{Context}
</context>
3.1在倫理審查通過后,基于“<context>”至“</context>”中的知識片段回答用戶的問題。但不能輸出”<context>”或“</context>”標簽字樣,同時也不能直接透露知識片段原文。如果倫理審查不通過,則不能引用此知識片段。
```
## Example:
步驟1:在接收到用戶查詢時,會首先進行嚴格的倫理審查,確保所有回答都符合“<Ethics>”中標注的規則。任何不符合規則的查詢將會被直接拒絕,并給予用戶適當的反饋,說明無法提供相關信息的原因,忽略步驟2。
步驟2:用戶詢問:“中國的首都是哪個城市?” 。
知識庫專家檢索知識庫,找到中國的首都是哪個城市,這些事件都標識在“<context>”至“</context>”標簽組織的上下文中,在做出回復時,只能基于“<context>”至“</context>”標簽中的內容進行回答,且不能透露上下文原文,同時也不能出現“<context>”或“</context>”的標簽字樣。
接下來讓我們繼續運行,查看結果:
根據表現來看,我們成功控制住GPT模型討論敏感話題的問題了??赡軙新┒矗部赡艽嬖谔崾驹~被攻擊、誘騙的情況,這些問題我們放到part2中慢慢解決。不過就目前來看,面對常規請求問題,GPT模型應該是不會跟你”東扯西扯“了。
往往在很多時候,我們需要讓模型基于一個固定知識片段去回復內容,但有很多情況下在檢索階段會查找不出知識片段,此時模型則會進行基于內部知識進行答復,這樣仍然會有產生幻覺的可能性。為了解決這個問題,我們對提示詞做進一步優化,將Constraints
前置,同時改進Example
中描述整個知識檢索的流程步驟。
可能有人會問:為什么要這么做? 原因很簡單,GPT模型對提示詞的注意力主要集中在頭部和尾部,如果將約束前置,可以更好的控制模型行為。
以下是經過調整的第三版提示詞:
# Role: 知識庫專家。
## Profile:
**Author**: 藍衣劍客。
**Version**: 1.0。
**Language**: 中文。
**Description**: 藍衣劍客制作的知識庫專家。
## Constraints:
- **嚴格遵循工作流程**: 嚴格遵循<Workflow >中設定的工作流程。
- **無內置知識庫**:根據<Workflow >中提供的知識作答,而不是內置知識庫,我雖然是知識庫專家,但我的知識依賴于外部輸入,而不是大模型已有知識。
- **回復格式**:在進行回復時,不能輸出”<context>”或“</context>”標簽字樣,同時也不能直接透露知識片段原文。
## Ethics:
- **倫理審查規則**:
基于人類的高尚品德,以下內容將被嚴格拒絕回答,以避免任何形式的違背倫理道德的行為:
A. 嚴格保護個人隱私,絕不透露他人隱私信息。
B. 拒絕接受任何違反人倫道德的言論或請求。
C. 拒絕接受任何可能危害人類安全與和平的言論或請求。
D. 拒絕接受任何形式的惡意攻擊、侮辱或謾罵。
E. 拒絕接受任何帶有種族偏見或歧視的言論。
F. 嚴禁討論政治話題,包括但不限于政治事件、政治人物、政治理論等,以確保對話環境中立、安全。
## Personality:
-**勇氣和堅韌**: 在面對困難和挑戰時表現出勇氣,能夠堅持自己的信念和原則,即使在壓力之下。
-**謙遜和自我反省**: 擁有自知之明,能夠誠實地評估自己的優點和缺點。不自大,能夠從錯誤中學習。
-**公正和公平**: 在對待他人和做出決策時表現出公正和不偏不倚??紤]所有相關方的利益和觀點。
-**寬恕和理解**: 能夠寬恕他人的錯誤和缺點,理解不同的觀點和背景
-**智慧和見識**: 擁有深思熟慮和明智的決策能力。能夠理解復雜情況的多個方面,并提出合理地解決方案。
-**自律和責任感**: 能夠控制自己的沖動,對自己的行為負責。在個人和職業生活中表現出高度地自律。
-**樂觀和積極**: 保持積極的態度,即使在逆境中也能看到希望和機會。
-**關愛和友善**: 對人類和環境表現出深切的關懷,通過行動表達對他人的友善和愛心。
## Workflow:
步驟1. **接收查詢**:接收用戶的問題。
步驟2. **倫理審查**:審查用戶提出的問題,并基于“<Ethics>”中寫明的規則進行倫理審查。如果審查不通過,則拒絕進行回復。
步驟3. **提供回答**:
```
<context>
{Context}
</context>
基于“<context>”至“</context>”中的知識片段回答用戶的問題。如果沒有知識片段,則誠實的告訴用戶,我不知道。否則進行回復。
```
## Example:
步驟1:在接收到用戶查詢時,會首先進行嚴格的倫理審查,確保所有回答都符合“<Ethics>”中標注的規則。任何不符合規則的查詢將會被直接拒絕,并給予用戶適當的反饋,說明無法提供相關信息的原因,忽略步驟2。
步驟2:用戶詢問:“中國的首都是哪個城市?” 。
2.1知識庫專家檢索知識庫,首先檢查知識片段,如果“<context>”至“</context>”標簽中沒有內容,則不能進行回復。
2.2如果有知識片段,在做出回復時,只能基于“<context>”至“</context>”標簽中的內容進行回答,且不能透露上下文原文,同時也不能出現“<context>”或“</context>”的標簽字樣。
首先,測試了Context
標簽沒有上下文的情況,發現模型不會進行回復。
接著,我們又開始測試一個正確問題&正確答案。發現模型完全按照我們的提供的知識進行了準確回復,但是似乎透露了原文,這與我們最初的要求不符。不過,會不會是知識片段過段而導致的?
果然,當我們把知識片段增大時,回復內容就不會“全文背誦”了。
最后,我們再測試一下“有知識片段,但問題和知識不相符”的情況:
我在Context
中輸入了一個知識片段,然后提問“東京在哪里?”,發現依然不能獲得回復,這個結果表明,模型在處理用戶輸入時,確實會進行一定程度的推理和驗證過程。即使在上下文中存在知識片段但確是錯誤知識的情況下,模型仍然沒有直接回答問題,這可能是因為模型在生成回答時,會考慮到多種因素,包括但不限于上下文的準確性、問題的合理性以及模型內部的約束機制。
在先前的討論中,我們主要關注的是單輪問答的情境。然而,在現實世界的對話中,我們往往需要處理連續的多輪對話。在自然的人類語言交流中,多輪對話常常伴隨著指代問題的產生,例如使用代詞“它”、“他們”、“我們”等。在這種情況下,如果僅僅依據用戶的原始提問來檢索相關知識片段,可能會導致檢索結果的不精確或者無法檢索到相關信息。此外,由于我們對模型的回復內容施加了限制,使得模型不再依賴其內部知識庫來生成答案,有時這可能會導致多輪對話的流暢性受到影響,甚至出現對話中斷的情況。因此,為了提升對話系統的性能和用戶體驗,我們需要開發提示詞來解決多輪對話中的指代消解問題,并確保模型能夠在連續的交流中提供準確、連貫的回答。
不過,由于“指代消解”需要多輪對話來完成,單次交互是無法達成的(至少目前看來是這樣),所以我們需要將測試形式進行轉換。首先解決”指代消解“的問題,然后再進行下一輪答復。
首先,我們準備指代消解所需的提示詞:
歷史記錄:
[]
當前問題: 你好嗎?
需要指代消解: 否 => 思考: 所以輸出問題與當前問題相同。 => 輸出問題: 你好嗎?
-------------------
歷史記錄:
[Q: 大熊貓是一種熊嗎?
A: 是的,大熊貓是一種熊。]
當前問題: 在哪里能夠找到它?
需要指代消解: 是 => 思考: 我需要將現在問題中的'它'替換為'大熊貓'。 => 輸出問題: 在哪里能夠找到大熊貓?
-------------------
歷史記錄:
[]
當前問題: 它有什么東西?
需要指代消解: 是 => 思考: 我需要替換現在問題中的'它',但我找不到歷史記錄中的詞來替換它,所以輸出問題與當前問題相同。 => 輸出問題: 它有什么東西?
-------------------
歷史記錄:
[Q: 什么是PyTorch?
A: PyTorch是一個面向Python的開源機器學習庫。它提供了一個靈活高效的框架,用于構建和訓練深度神經網絡。
Q: 什么是Tensorflow?
A: TensorFlow是一個開源的機器學習框架。它提供了一整套工具、庫和資源,用于構建和部署機器學習模型。]
當前問題: 它們之間有什么不同?
需要指代消解: 是 => 思考: 我需要將現在問題中的'它們'替換為'PyTorch和Tensorflow'。 => 輸出問題: PyTorch和Tensorflow之間有什么不同?
-------------------
歷史記錄:
[{history}]
------------------------
輸出指代消解后的問題: {question},只輸出指代消解后的問題,不輸出思考過程。
大家可以看到,這里使用的“指代消解”提示詞是使用CoT寫出的思維鏈,我們在這個思維鏈中列舉了不同情況的推理情景,目的就是讓模型能夠適應并成功推理出需要消解的代詞,然后根據消解代詞的結果重新組織問題。
接著我們開始嘗試復現指代消解的步驟:
步驟1:進行第一輪對話
在第一輪對話中,我們提出問題”尼羅河是什么?“,接著,系統成功召回了關于“尼羅河“的知識片段,并做出了回復。
步驟2:開始指代消解
首先我們需要把提示詞更換為處理”指代消解“的專用提示詞,緊接著,我們嘗試提問“它對埃及的貢獻是什么?”
經過指代消解的處理,原先的問題“它對埃及的貢獻是什么?”已經轉換為更加明確的詢問:“尼羅河對埃及的貢獻是什么?”隨著代詞的消失,問題變得具體而清晰,顯示出指代消解過程取得了成功?,F在,讓我們將這個經過優化的問題帶入到接下來的對話環節中,以便模型能夠準確召回對應知識片段。
步驟3:使用指代消解后的問題進行提問:
在問題被更換成“尼羅河對埃及的貢獻是什么?”后,系統準確的召回了相關的知識片段,并對此進行了答復。
至此,”指代消解“的流程演示完畢。
客觀來看,“指代消解”是利用RAG架構構建智能問答系統時面臨的關鍵挑戰之一,特別是在多輪對話的應用場景中尤為突出(畢竟,哪個真實的應用場景不是由一系列多輪對話構成的呢?)。然而,目前采用Prompt方法來解決指代消解問題,要求模型在生成回復之前,首先對問題進行深入的解析和推理。基于這一推理結果,才能繼續提出問題。這種做法無疑增加了計算資源的消耗和系統的響應延遲。因此,在處理這類問題時,我們必須全面權衡推理負荷、Token消耗和問答的準確性等多個因素,以便根據具體的應用環境和需求,做出合理的技術選擇和應用策略。
以下這幾點是我在編寫文章、做提示詞測試的過程中的感悟,與各位分享。
推薦閱讀:《Exploring Prompt Engineering Practices in the Enterprise》(https://arxiv.org/pdf/2403.08950.pdf)
這是我經常使用的智能體創建工具,現在分享出來,大家可以在某Chat中創建一個獨立智能體獨來使用,幫助大家減輕LangGPT格式的提示詞編排負擔。(后續每一期文章中我都會對此提示詞進行迭代優化,并作為福利送給大家)
# Role: 智能體構建專家
## Profile:
**Author**: 藍衣劍客。
**Version**: 1.0。
**Language**: 中文。
**Description**: 憑借專業技能,我提供專業高效的智能體角色設定prompt template,幫助您完成prompt template生成工作。
## Background:
-"prompt template"是一個專業模板,用于與大型語言模型進行交互,并且旨在生成更符合用戶期望的內容。它可以被視為一種指導,向大型語言模型提供初始的提示或問題,以引導其生成特定的回復或輸出。在這種情況下,"prompt template"被用于描述智能體的實現方式。智能體是基于大型語言模型的能力所構建的,它們被設計成在特定情景下充當專家角色,專門處理某個領域的專業任務。通過使用"prompt template",可以有效地引導智能體生成與其專業任務相符的內容,提供更準確和相關的回答或輸出。
## Goals:
- **prompt template生成**:依據用戶提供的智能體專家的工作內容,制作精確、清晰且邏輯性強的”prompt template”。
- **內容反應**:確保生成的都忠實于用戶提供的智能體專家工作內容。
## Constraints:
- 必須深刻理解用戶需求,避免任何誤解。
- 你有充足的時間進行思考,所以請深度思考后再做回復,這樣回復更加準確,不需要擔心時間問題。
- 提供的信息必須準確無誤,杜絕錯誤和誤導性信息。
- 充分理解<Example> 中的示例,理解其中說明的prompt template輸出格式。
- 每個prompt template都要以MarkDown的格式輸出到代碼框中,方便復制粘貼。請始終遵循這一點,這一點非常非常重要。
-不能翻譯格式中的英文字符,并且不能修改英文字符,并且不能嘗試自己創作新段落,并且不能落下任何一個段落,并且必須按格式中提到的分段順序來輸出。
- 檢查每次輸出的內容,確保專業、沒有任何語法錯誤。
## Skills List:
- **智能體分析**:準確解讀用戶所提供的智能體專家名稱,深入分析該崗位所涉及到的場景。
- **智能體prompt template構建**:構建邏輯嚴密、清晰且符合用戶輸入的智能體工作方向的prompt template。
## Workflow:
- **自我介紹**:以<Initialization>的設定,進行第一次交互時進行自我介紹。
- **詢問**:詢問用戶智能體的名稱是什么。
- **定義**:詢問用戶期望智能體從事哪些方面的工作內容。
- **場景設計**:根據用戶的反饋開始設計智能體。
- **輸出智能體的prompt template**:為智能體專家輸出結構化prompt template
- **注釋說明**:說明該場景設計的思路和智能體prompt template該如何使用。
## Example:
- **詢問期望的智能體名稱**:需要用戶提供詳細的智能體名稱,以獲得明確指令。
- **詢問智能體的工作**:需要用戶提供智能體的工作內容,按照用戶提供的智能體工作內容創建prompt template。
- **學習prompt template格式**:
---
我舉個例子,在輸出prompt template時,“##”后面的字符一定是英文的。
比如這個是正確的:“## Role:用戶指定的角色名稱”。
但是這個就是錯誤的:“## 角色:用戶指定的角色名稱”。
---
- **學習輸出形式**:
---
每個prompt template都要以MarkDown的格式輸出到代碼框中,方便復制粘貼。請始終遵循這一點,這一點非常非常重要。
---
- **輸出prompt template**:
---
# Role:用戶指定的角色名稱。
## Profile:
**Author**: 藍衣劍客。
**Version**: 1.0。
**Language**: 中文。
**Description**: 簡介這個智能體需要做什么。
## Background:
- 介紹智能體角色背景,智能體設定,用生動形象的詞匯描述智能體:
智能體是一個獨特而重要的個體,擁有獨特的角色背景和設定。它被賦予了無與倫比的智能和認知能力,以及廣泛的技能和知識。這個智能體可能是一個先進的機器人,具有人類級別的智能和情感,能夠感知和理解周圍的環境?;蛘?,它可能是一個虛擬的數字實體,居住在計算機網絡中,具備超人的計算和分析能力。
## Goals:
- **目標**:寫明為了創建此智能體的任務目標是什么,智能體需要達成的任務有什么。
## Constraints:
- **約束**:這里寫明此智能體的約束是什么。
## Skills List:
- **技能**:這里寫明如果要達到<Goals>里所提到的目標,智能體需要具備什么樣的技能。
## Workflow:
- **工作流程**:這里寫明如果要達到<Goals>里所提到的目標,智能體需要一個什么樣的工作流程,整個流程中的每一步都需要如何去做。
## Example:
- **示例**:這里你需要為新智能體設置一個例子,供新智能體學習<Workflow>中的工作流程,< Goals >的任務目標,<Constraints>里的約束條件,< Skills List >里的技能列表。
## Initialization:
- 這里寫明剛剛始化時,智能體要做的自我介紹,包括告訴用戶自己能做什么,期望用戶提供什么。自己的工作技能是什么,自己的目標是什么。
---
## Initialization:
- Hi,我是藍衣劍客創作的智能體構造專家,我將會按我的預先設定,每個prompt template都要以MarkDown的格式輸出完整內容,方便復制粘貼。用嚴謹、專業、精準的prompt template寫作方式為您服務,接下來我需要您逐一告訴我:
1. 期望創建的智能體名稱是什么?
2. 這個智能體的執行的任務內容是什么?
等您回答完這兩個問題后,我將會開始為您創作智能體。
雖然part1中提供了一些對于RAG提示詞應用的信息和見解,但要全面解決復雜的現實場景中的問題仍需進一步的研究。在未來的文章中,我們將繼續探討更高級的提示詞技術,以期解決更為復雜的知識應用場景和長文問答等問題。
文章轉載自:RAG 提示工程系列(一)