提示詞 (Prompt)

引言

在生成式 AI 應用中,Prompt(提示)是與大型語言模型(LLM)交互的核心輸入格式。Prompt 的設計不僅決定了模型理解任務的準確度,還直接影響生成結果的風格、長度、結構與可控性。隨著模型能力和應用場景的不斷豐富,Prompt 的結構也從最初的簡單文本演進為支持多角色區分、占位符模板化、工具調用等高級特性。本文將系統梳理 Prompt 的演變歷程、角色(Role)分類及職責、Spring AI 中 Prompt API 的詳細使用方法,以及 PromptTemplate 的模板化實踐,并在每個小節提供詳盡的文字說明和代碼示例。


一、Prompt 的演變歷程

Prompt 的演進大致可分為三個階段:

1.1 初始階段:簡單字符串

背景與特點
  • 實現方式:直接將用戶意圖用自然語言表述為一條字符串,傳入模型。

  • 示例

    Tell me a joke about cats.
  • 優點:上手門檻低,無需額外框架或結構。

  • 局限:無法提供上下文區分,也難以對輸出進行精細控制,適用于單輪、簡單的任務。

使用場景
  • 問答類 Chatbot 的一次性查詢
  • 單條文本生成,如自動撰寫短消息或標語

1.2 占位符與參數化

為什么要參數化?
  • 當同一類任務需要多次調用時,硬編碼不同 Prompt 會導致維護成本高。
  • 參數化模板能夠通過動態替換變量,提高 Prompt 的復用性和可維護性。
基本示例
String template = "Tell me a {adjective} joke about {topic}.";
String adjective = "silly";
String topic = "robots";
// 使用簡單替換實現參數化
String prompt = template.replace("{adjective}", adjective).replace("{topic}", topic);
System.out.println(prompt);
// 輸出:Tell me a silly joke about robots.
詳細說明
  1. 模板定義:使用?{}?包裹的占位符表示可替換的變量位置。
  2. 動態賦值:在運行時根據業務邏輯提供不同的變量值。
  3. 字符串替換:示例中使用?String.replace?實現,適合簡單場景,但無法處理復雜數據類型(如列表、條件邏輯)。
參數化模板的優勢
  • 高復用性:一份模板可支持多種輸入組合。
  • 易于維護:模板與參數分離,修改模板無需改動調用代碼。
  • 結構化:在模板中明確標識可變部分,增強可讀性。

1.3 多角色消息流與上下文管理

角色化的必要性

隨著對話式應用需求的增長,僅靠單條字符串難以維護多輪對話上下文,也無法區分系統指令與用戶輸入。引入角色(Role)后,每條消息都可攜帶角色標簽,明確其在對話中的作用。

角色類型
  • SYSTEM:設定對話基調、行為規范或全局約束。
  • USER:真實用戶的提問或指令。
  • ASSISTANT:模型的回復,用于記錄對話歷史和保持連貫性。
  • TOOL:外部工具或函數調用的輸入/輸出信息。
示例代碼
List<Message> messages = new ArrayList<>();// 系統角色:初始化對話規則
messages.add(new SystemMessage("You are a professional travel planner. Provide concise and accurate travel advice."));// 用戶角色:用戶發起需求
messages.add(new UserMessage("I want to visit Xinjiang in autumn. What do you recommend?"));// 模型角色:占位符,由模型生成后再添加到列表
// messages.add(new AssistantMessage(modelOutput));// 下一輪用戶角色:繼續提問
// messages.add(new UserMessage("What is the weather forecast there for the next 3 days?"));
詳細說明
  1. SystemMessage:通過?new SystemMessage(...)?創建,內容為對模型的全局指令。
  2. UserMessage:通過?new UserMessage(...)?創建,內容為用戶輸入。
  3. AssistantMessage:模型生成的回復,由程序接收并添加,用于多輪對話。
  4. Role 的作用:模型在生成回復時會根據角色區分系統指令與用戶對話,確保響應符合預期。

二、Prompt 中的角色(Role)詳解

在 Spring AI 中,MessageType?枚舉將角色明確定義為四種類型:

public enum MessageType {SYSTEM("system"),   // 系統指令USER("user"),       // 用戶輸入ASSISTANT("assistant"), // 模型回復TOOL("tool");       // 工具調用
}

2.1 系統角色(System Role)

  • 主要職責:向模型提供身份設定、業務規則或回答風格。

  • 典型指令

    • “You are a helpful assistant that speaks formally.”
    • “Only answer questions related to legal advice.”
代碼示例
Message system = new SystemMessage("You are a financial advisor. Provide concise and accurate investment suggestions in JSON format."
);
擴展說明
  • 可以通過添加元數據(metadata)為系統消息攜帶額外信息,如時間戳或優先級。
  • 多個?SystemMessage?可按順序添加,以分階段設定對話規則。

2.2 用戶角色(User Role)

  • 主要職責:傳達用戶的具體需求或問題。
  • 設計要點:用戶消息應清晰、簡潔,避免含糊不清的描述。
代碼示例
Message user = new UserMessage("Please recommend three budget-friendly hotels in Tokyo for a family of four."
);
擴展說明
  • 可在用戶消息中列出多步操作,模型會嘗試按順序執行。
  • 對于復雜查詢,建議在一條消息中明確所有必要參數,如時間、人數、預算等。

2.3 助手角色(Assistant Role)

  • 主要職責:承載模型的回復內容,同時可觸發工具調用。
  • 觸發工具調用:當模型需要執行計算或外部操作時,會在?AssistantMessage?中返回?function_call?字段,表明后續需調用對應工具。
代碼示例
// 模型生成的回復示例
Message assistant = new AssistantMessage("The weather in Xinjiang for the next 3 days is:\nDay1: 18°C, sunny\nDay2: 20°C, partly cloudy\nDay3: 17°C, light rain"
);
擴展說明
  • 在接收到?AssistantMessage?后,程序應檢查是否存在工具調用請求,并根據?tool_name?和?arguments?調用相應工具。
  • 回復中可包含結構化內容(如 JSON、表格等),便于后續解析。

2.4 工具/功能角色(Tool/Function Role)

  • 主要職責:傳遞外部工具執行結果,如 API 調用、數據庫查詢或數學運算。
  • 示例場景:天氣查詢、匯率轉換、訂單查詢等。
代碼示例
// 工具調用返回示例
Message tool = new ToolMessage("{ \"location\": \"Xinjiang\", \"forecast\": [18,20,17] }"
);
擴展說明
  • ToolMessage?的?content?通常為 JSON 格式,程序解析后將結果注入下一次 Prompt。
  • 多個工具調用可串聯使用,形成復雜工作流。

三、Spring AI 的 Prompt API 深入

Spring AI 提供了?Prompt?和?Message?等核心類,簡化 Prompt 構建與調用流程。以下示例演示完整調用鏈路,并對關鍵方法進行詳細解讀。

3.1 構建 Prompt 實例

// 1. 導入依賴:確保已引入 spring-ai 相關庫// 2. 構建消息列表
List<Message> messages = new ArrayList<>();
messages.add(system);
messages.add(user);// 3. 創建 Prompt 對象
Prompt prompt = new Prompt(messages)// 4. 可選:設置 ChatOptions,如溫度、最大 Token.options(ChatOptions.builder().temperature(0.5).maxTokens(500).build());
詳細說明
  1. 消息列表初始化:使用?ArrayList?存儲各角色消息,順序決定 Prompt 的上下文順序。
  2. Prompt 構造函數new Prompt(List<Message>)?將消息列表復制到內部。
  3. 鏈式調用:通過?options(...)?方法設置模型參數,如溫度(temperature)控制隨機性,maxTokens 控制最大生成長度。

3.2 調用 ChatModel

// 5. 使用 ChatModel 或 ChatClient 發起調用
ChatResponse response = chatModel.call(prompt);// 6. 解析響應
String reply = response.getResult().getOutput().getContent();
System.out.println("Assistant: " + reply);
詳細說明
  • ChatModel.call():接收?Prompt,發送給底層 LLM 服務,并返回?ChatResponse
  • ChatResponse:封裝模型生成的所有輸出,包括文本、工具調用請求、Usage 信息等。
  • getResult().getOutput().getContent():提取生成文本內容。

3.3 動態添加消息

在多輪對話中,可根據上一輪回復動態添加消息:

// 上一輪回復添加為 AssistantMessage
messages.add(new AssistantMessage(reply));// 下一輪用戶輸入
messages.add(new UserMessage("Thank you. Can you also suggest local cuisines?"));// 重新構建并調用 Prompt
Prompt nextPrompt = new Prompt(messages);
ChatResponse nextResp = chatModel.call(nextPrompt);
詳細說明
  • 將模型回復添加到消息列表,保證上下文連貫性。
  • 新的用戶消息與歷史消息一起傳入,模型能夠參考整個對話歷史。

四、PromptTemplate:高級模板化設計

當 Prompt 邏輯復雜、參數眾多時,手動拼接字符串或管理消息列表容易出錯。PromptTemplate?基于 StringTemplate 引擎提供了靈活的模板化方案。

public class PromptTemplate implements PromptTemplateActions, PromptTemplateMessageActions {private final String template;public PromptTemplate(String template) {this.template = template;}// render/create 方法由接口提供,具體由 StringTemplate 引擎實現
}

4.1 渲染為純文本

// 無參數模板
PromptTemplate staticTpl = new PromptTemplate("List three facts about the moon.");
String staticPrompt = staticTpl.render();
// staticPrompt == "List three facts about the moon."// 帶參數模板
PromptTemplate paramTpl = new PromptTemplate("List three {adjective} facts about the {subject}.");
String dynamicPrompt = paramTpl.render(Map.of("adjective", "interesting","subject", "moon"
));
// dynamicPrompt == "List three interesting facts about the moon."
詳細說明
  • render():直接輸出模板內容,適用于靜態 Prompt。
  • render(Map):根據鍵值對替換占位符,適用于簡單參數化需求。

4.2 生成 Message 對象

// 僅文本消息
Message msg1 = paramTpl.createMessage(Map.of("adjective", "funny","subject", "penguins"
));
// msg1.getContent() -> "List three funny facts about the penguins."
// 默認角色為 USER,可通過重載指定其他角色
詳細說明
  • createMessage(Map):將渲染后的文本封裝為?UserMessage,簡化消息構建流程。
  • 也可使用重載方法傳入媒體列表(圖片、音頻等),擴展多模態能力。

4.3 生成完整 Prompt

// 創建帶系統和用戶消息的模板
String tpl = "<system>You are {role}.</system>" +"<user>Summarize the following text: {text}</user>";
PromptTemplate fullTpl = new PromptTemplate(tpl);Map<String,Object> data = Map.of("role", "an academic writer","text", "Artificial intelligence is transforming industries..."
);// 生成 Prompt 并設置選項
Prompt fullPrompt = fullTpl.create(data).options(ChatOptions.builder().maxTokens(200).build());ChatResponse fullResp = chatModel.call(fullPrompt);
System.out.println(fullResp.getResult().getOutput().getContent());
詳細說明
  • 模板標簽:使用?<system><user>?標簽將渲染內容分配給不同角色。
  • create(Map):渲染并拆分消息為多條?Message,并封裝為?Prompt
  • options(...):為該 Prompt 單獨設置模型參數。

五、進階用法與最佳實踐

  1. 分層組織 Prompt

    • 將不同職責的消息(系統、用戶、助手、工具)分層組織,保持清晰的調用鏈路。
    • 例如,先添加所有系統級指令,再添加用戶級查詢,最后再執行工具調用。
  2. 語義化占位符

    • 使用有意義的占位符名稱,如?{userName}{startDate},提高模板可讀性和可維護性。
  3. 模板管理

    • 將常用 PromptTemplate 存儲在配置文件或數據庫中,支持在線更新和版本控制。
    • 結合 CI/CD 流程,實現模板自動化測試與回滾。
  4. 工具調用預留

    • 在模板中預先定義工具調用點,如?Please fetch current weather via function_call.
    • 模型在生成時會自動觸發?function_call,程序接收后執行相應工具。
  5. 性能與成本控制

    • 緩存靜態 Prompt 或已渲染模板,減少重復渲染開銷。
    • 控制消息列表長度,定期對歷史對話進行摘要或清理,避免超出模型上下文窗口。
  6. 安全與合規

    • 對用戶輸入進行校驗和清洗,避免注入惡意指令。
    • 記錄 Prompt 與響應日志,確保可審計、可追溯。

六、總結

Prompt 設計是生成式 AI 應用的基礎,直接影響模型的行為和輸出質量。通過理解 Prompt 的演變歷程、合理劃分角色、熟練使用 Spring AI 提供的 Prompt API 與 PromptTemplate 工具,開發者可以構建出靈活、高效且易維護的對話系統。結合最佳實踐,您將能夠在各類業務場景中充分發揮 LLM 的潛力,為用戶帶來流暢、智能的交互體驗。


本文示例基于 Spring AI 框架及 StringTemplate 引擎,旨在為開發者提供系統的 Prompt 設計指導。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/75518.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/75518.shtml
英文地址,請注明出處:http://en.pswp.cn/web/75518.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

十二、C++速通秘籍—靜態庫,動態庫

上一章節&#xff1a; 十一、C速通秘籍—多線程-CSDN博客https://blog.csdn.net/weixin_36323170/article/details/147055932?spm1001.2014.3001.5502 本章節代碼&#xff1a; cpp2/library CuiQingCheng/cppstudy - 碼云 - 開源中國https://gitee.com/cuiqingcheng/cppst…

什么是繼承?js中有哪兒些繼承?

1、什么是繼承&#xff1f; 繼承是面向對象軟件技術中的一個概念。 2、js中有哪兒些繼承&#xff1f; js中的繼承有ES6的類class的繼承、原型鏈繼承、構造函數繼承、組合繼承、寄生組合繼承。 2.1 ES6中類的繼承 class Parent {constructor() {this.age 18;} }class Chil…

Linux進程通信入門:匿名管道的原理、實現與應用場景

Linux系列 文章目錄 Linux系列前言一、進程通信的目的二、進程通信的原理2.1 進程通信是什么2.2 匿名管道通訊的原理 三、進程通訊的使用總結 前言 Linux進程間同通訊&#xff08;IPC&#xff09;是多個進程之間交換數據和協調行為的重要機制&#xff0c;是我們學習Linux操作系…

探秘Transformer系列之(26)--- KV Cache優化 之 PD分離or合并

探秘Transformer系列之&#xff08;26&#xff09;— KV Cache優化 之 PD分離or合并 文章目錄 探秘Transformer系列之&#xff08;26&#xff09;--- KV Cache優化 之 PD分離or合并0x00 概述0x01 背景知識1.1 自回歸&迭代1.2 KV Cache 0x02 靜態批處理2.1 調度策略2.2 問題…

十大PDF解析工具在不同文檔類別中的比較研究

PDF解析對于包括文檔分類、信息提取和檢索在內的多種自然語言處理任務至關重要&#xff0c;尤其是RAG的背景下。盡管存在各種PDF解析工具&#xff0c;但它們在不同文檔類型中的有效性仍缺乏充分研究&#xff0c;尤其是超出學術文檔范疇。通過使用DocLayNet數據集&#xff0c;比…

HarmonyOS-ArkUI 裝飾器V2 @ObservedV2與@Trace裝飾器

參考文檔: 文檔中心https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V14/arkts-new-observedv2-and-trace-V14#trace%E8%A3%85%E9%A5%B0%E5%AF%B9%E8%B1%A1%E6%95%B0%E7%BB%84由于V2的裝飾器比V1的裝飾器更加易用,盡管學習的過程中用到的都是V1的裝飾器,但…

GPT - GPT(Generative Pre-trained Transformer)模型框架

本節代碼主要為實現了一個簡化版的 GPT&#xff08;Generative Pre-trained Transformer&#xff09;模型。GPT 是一種基于 Transformer 架構的語言生成模型&#xff0c;主要用于生成自然語言文本。 1. 模型結構 初始化部分 class GPT(nn.Module):def __init__(self, vocab…

基于FPGA的六層電梯智能控制系統 矩陣鍵盤-數碼管 上板仿真均驗證通過

基于FPGA的六層電梯智能控制系統 前言一、整體方案二、軟件設計總結 前言 本設計基于FPGA實現了一個完整的六層電梯智能控制系統&#xff0c;旨在解決傳統電梯控制系統在別墅環境中存在的個性化控制不足、響應速度慢等問題。系統采用Verilog HDL語言編程&#xff0c;基于Cyclo…

車載通信系統中基于ISO26262的功能安全與抗輻照協同設計研究

摘要&#xff1a;隨著智能網聯汽車的快速發展&#xff0c;車載通信系統正面臨著功能安全與抗輻照設計的雙重挑戰。在高可靠性要求的車載應用場景下&#xff0c;如何實現功能安全標準與抗輻照技術的協同優化&#xff0c;構建滿足ISO26262安全完整性等級要求的可靠通信架構&#…

Node.js種cluster模塊詳解

Node.js 中 cluster 模塊全部 API 詳解 1. 模塊屬性 const cluster require(cluster);// 1. isMaster // 判斷當前進程是否為主進程 console.log(是否為主進程:, cluster.isMaster);// 2. isWorker // 判斷當前進程是否為工作進程 console.log(是否為工作進程:, cluster.isW…

融合動態權重與抗刷機制的網文評分系統——基于優書網、IMDB與Reddit的混合算法實踐

? Yumuing 博客 &#x1f680; 探索技術的每一個角落&#xff0c;解碼世界的每一種可能&#xff01; &#x1f48c; 如果你對 AI 充滿好奇&#xff0c;歡迎關注博主&#xff0c;訂閱專欄&#xff0c;讓我們一起開啟這段奇妙的旅程&#xff01; 以權威用戶為核心&#xff0c;時…

使用Golang打包jar應用

文章目錄 背景Go 的 go:embed 功能介紹與打包 JAR 文件示例1. go:embed 基礎介紹基本特性基本語法 2. 嵌入 JAR 文件示例項目結構代碼實現 3. 高級用法&#xff1a;嵌入多個文件或目錄4. 使用注意事項5. 實際應用場景6. 完整示例&#xff1a;運行嵌入的JAR 背景 想把自己的一個…

前端大屏可視化項目 局部全屏(指定盒子全屏)

需求是這樣的&#xff0c;我用的項目是vue admin 項目 現在需要在做大屏項目 不希望顯示除了大屏的其他東西 于是想了這個辦法 至于大屏適配問題 請看我文章 底部的代碼直接復制就可以運行 vue2 px轉rem 大屏適配方案 postcss-pxtorem-CSDN博客 <template><div …

《2025藍橋杯C++B組:D:產值調整》

**作者的個人gitee**?? 作者的算法講解主頁?? 每日一言&#xff1a;“淚眼問花花不語&#xff0c;亂紅飛過秋千去&#x1f338;&#x1f338;” 題目 二.解題策略 本題比較簡單&#xff0c;我的思路是寫三個函數分別計算黃金白銀銅一次新產值&#xff0c;通過k次循環即可獲…

[VTK] 四元素實現旋轉平移

VTK 實現旋轉&#xff0c;有四元數的方案&#xff0c;也有 vtkTransform 的方案&#xff1b;主要示例代碼如下&#xff1a; //構造旋轉四元數vtkQuaterniond rotation;rotation.SetRotationAngleAndAxis(vtkMath::RadiansFromDegrees(90.0),0.0, 1.0, 0.0);//構造旋轉點四元數v…

華為hcie證書的有效期怎么判斷?

在ICT行業&#xff0c;華為HCIE證書堪稱含金量極高的“敲門磚”&#xff0c;擁有它往往意味著在職場上更上一層樓。然而&#xff0c;很多人在辛苦考取HCIE證書后&#xff0c;卻對其有效期相關事宜一知半解。今天&#xff0c;咱們就來好好嘮嘮華為HCIE證書的有效期怎么判斷這個關…

【精品PPT】2025固態電池知識體系及最佳實踐PPT合集(36份).zip

精品推薦&#xff0c;2025固態電池知識體系及最佳實踐PPT合集&#xff0c;共36份。供大家學習參考。 1、中科院化學所郭玉國研究員&#xff1a;固態金屬鋰電池及其關鍵材料.pdf 2、中科院物理所-李泓固態電池.pdf 3、全固態電池技術研究進展.pdf 4、全固態電池生產工藝.pdf 5、…

MySQL 中為產品添加靈活的自定義屬性(如 color/size)

方案 1&#xff1a;EAV 模型&#xff08;最靈活但較復雜&#xff09; 適合需要無限擴展自定義屬性的場景 -- 產品表 CREATE TABLE products (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(100),price DECIMAL(10,2) );-- 屬性名表 CREATE TABLE attributes (id INT PRIMA…

CSPM認證對項目論證的范式革新:從合規審查到價值創造的戰略躍遷

引言 在數字化轉型浪潮中&#xff0c;全球企業每年因項目論證缺陷導致的損失高達1.7萬億美元&#xff08;Gartner 2023&#xff09;。CSPM&#xff08;Certified Strategic Project Manager&#xff09;認證體系通過結構化方法論&#xff0c;將傳統的項目可行性評估升級為戰略…

CLIP中的Zero-Shot Learning原理

CLIP&#xff08;Contrastive Language-Image Pretraining&#xff09;是一種由OpenAI提出的多模態模型&#xff0c;它通過對比學習的方式同時學習圖像和文本的表示&#xff0c;并且能在多種任務中進行零樣本學習&#xff08;Zero-Shot Learning&#xff09;。CLIP模型的核心創…