Spring AI > Spring AI API > Prompts
大家可以直接看官網(wǎng):https://docs.spring.io/spring-ai/reference/api/prompt.html
Prompts
提示是指導(dǎo)AI模型生成特定輸出的輸入。這些提示的設(shè)計(jì)和措辭顯著影響模型的響應(yīng)。
與Spring AI中的AI模型進(jìn)行最低級(jí)別交互時(shí),處理Spring AI中的提示與在Spring MVC中管理“視圖”有些相似。這涉及創(chuàng)建帶有占位符的廣泛文本,用于動(dòng)態(tài)內(nèi)容。然后,根據(jù)用戶請(qǐng)求或應(yīng)用程序中的其他代碼替換這些占位符。另一個(gè)類比是包含占位符的SQL語句,用于某些表達(dá)式。
隨著Spring AI的發(fā)展,它將引入與AI模型交互的更高級(jí)別的抽象。本節(jié)描述的基礎(chǔ)類可以類比為JDBC在其角色和功能上。例如,ChatClient類類似于JDK中的核心JDBC庫(kù)。在此基礎(chǔ)上,Spring AI可以提供類似于JdbcTemplate、Spring Data Repositories的輔助類,最終還有考慮與模型過去交互的更高級(jí)的結(jié)構(gòu),如ChatEngines和Agents。
提示的結(jié)構(gòu)在AI領(lǐng)域內(nèi)隨著時(shí)間的推移而發(fā)展。最初,提示是簡(jiǎn)單的字符串。隨著時(shí)間的推移,它們發(fā)展到包括特定輸入的占位符,如“AI:”,AI模型可以據(jù)此做出相應(yīng)的響應(yīng)。OpenAI通過將多個(gè)消息字符串分類為不同的角色,然后再由AI模型處理,引入了更多結(jié)構(gòu)化的提示方法。
API概覽
提示
通常使用ChatClient的generate方法,該方法接受一個(gè)Prompt實(shí)例并返回一個(gè)ChatResponse。
Prompt類作為一個(gè)容器,包含一系列有組織的消息對(duì)象,每個(gè)對(duì)象形成提示的一個(gè)部分。每個(gè)Message在提示中扮演一個(gè)獨(dú)特的角色,其內(nèi)容和意圖各不相同。這些角色可以包括各種元素,從用戶詢問到AI生成的響應(yīng)或相關(guān)的背景信息。這種安排使得與AI模型的復(fù)雜和詳細(xì)交互成為可能,因?yàn)樘崾臼怯啥鄠€(gè)消息構(gòu)建的,每個(gè)消息在對(duì)話中扮演一個(gè)特定的角色。
以下是一個(gè)截?cái)嗟腜rompt類版本,為了簡(jiǎn)潔起見,省略了構(gòu)造函數(shù)和實(shí)用方法:
public class Prompt {
private final List<Message> messages;
// constructors and utility methods omitted
}
消息
Message接口封裝了一個(gè)文本消息、一個(gè)屬性集合作為Map、一個(gè)稱為MessageType的分類,以及對(duì)于那些多模態(tài)模型的媒體對(duì)象列表。接口定義如下:
public interface Message {
String getContent();
List<Media> getMedia();
Map<String, Object> getProperties();
MessageType getMessageType();
}
AI模型可以處理的各種消息類型的不同實(shí)現(xiàn)。一些模型,如來自O(shè)penAI的模型,根據(jù)會(huì)話角色區(qū)分消息類別。這些角色通過MessageType有效映射,如下所述。
角色
AI中提示的發(fā)展已經(jīng)從基本的、直接的文本轉(zhuǎn)變?yōu)榫哂刑囟ń巧徒Y(jié)構(gòu)的更有組織和復(fù)雜的格式。
最初,提示是簡(jiǎn)單的字符串——只是文本行。隨著時(shí)間的推移,這發(fā)展到包括這些字符串中的特定占位符,如“用戶:”,AI模型可以據(jù)此做出相應(yīng)的響應(yīng)。這是朝著更結(jié)構(gòu)化提示邁出的一步。
OpenAI隨后引入了一種更有組織的方法。在他們的模型中,提示不僅僅是單個(gè)字符串,而是一系列消息。盡管每個(gè)消息仍然是文本形式,但被分配了一個(gè)特定的角色。這些角色對(duì)消息進(jìn)行分類,為AI模型澄清了每個(gè)提示段的上下文和目的。這種結(jié)構(gòu)化的方法增強(qiáng)了與AI溝通的細(xì)微差別和有效性,因?yàn)樘崾镜拿總€(gè)部分在交互中都扮演了一個(gè)獨(dú)特而明確的角色。
主要角色包括:
系統(tǒng)角色:指導(dǎo)AI的行為和響應(yīng)風(fēng)格,為AI解釋和回復(fù)輸入設(shè)置參數(shù)或規(guī)則。這類似于在開始對(duì)話之前向AI提供指令。
用戶角色:代表用戶的輸入——他們的問題、命令或?qū)I的陳述。這個(gè)角色是基礎(chǔ),因?yàn)樗鼧?gòu)成了AI響應(yīng)的基礎(chǔ)。
助手角色:AI對(duì)用戶輸入的響應(yīng)。不僅僅是一個(gè)答案或反應(yīng),對(duì)于維持對(duì)話的流暢性至關(guān)重要。通過跟蹤AI之前的響應(yīng)(其“助手角色”消息),系統(tǒng)確保交互是連貫和上下文相關(guān)的。
功能角色:這個(gè)角色處理對(duì)話中的特定任務(wù)或操作。雖然系統(tǒng)角色設(shè)置了AI的總體行為,但功能角色專注于執(zhí)行用戶要求的某些動(dòng)作或命令。這就像AI中的一個(gè)特殊功能,需要時(shí)用于執(zhí)行特定功能,如計(jì)算、獲取數(shù)據(jù)或其他超出僅僅對(duì)話的任務(wù)。這個(gè)角色允許AI除了對(duì)話響應(yīng)之外,還提供實(shí)際幫助。
在Spring AI中,角色以枚舉的形式表示,如下所示:
public enum MessageType {
USER("user"),
ASSISTANT("assistant"),
SYSTEM("system"),
FUNCTION("function");
private final String value;
MessageType(String value) {
this.value = value;
}
public String getValue() {
return value;
}
public static MessageType fromValue(String value) {
for (MessageType messageType : MessageType.values()) {
if (messageType.getValue().equals(value)) {
return messageType;
}
}
throw new IllegalArgumentException("Invalid MessageType value: " + value);
}
}
提示模板
Spring AI中提示模板的關(guān)鍵組件是PromptTemplate類。這個(gè)類使用由Terence Parr開發(fā)的StringTemplate引擎來構(gòu)建和管理提示。
PromptTemplate類旨在便于創(chuàng)建結(jié)構(gòu)化的提示,然后將這些提示發(fā)送給AI模型進(jìn)行處理。
public class PromptTemplate implements PromptTemplateActions, PromptTemplateMessageActions {
// Other methods to be discussed later
}
這個(gè)類實(shí)現(xiàn)的接口支持提示創(chuàng)建的不同方面:
PromptTemplateStringActions專注于創(chuàng)建和渲染提示字符串,代表了最基本的提示生成形式。
PromptTemplateMessageActions專門用于通過生成和操作Message對(duì)象來創(chuàng)建提示。
PromptTemplateActions旨在返回Prompt對(duì)象,該對(duì)象可以傳遞給ChatClient以生成響應(yīng)。
雖然這些接口在許多項(xiàng)目中可能不會(huì)廣泛使用,但它們展示了提示創(chuàng)建的不同方法。
實(shí)現(xiàn)的接口是:
public interface PromptTemplateStringActions {
String render();
String render(Map<String, Object> model);
}
方法String render():將提示模板渲染成最終的字符串格式,沒有外部輸入,適用于沒有占位符或動(dòng)態(tài)內(nèi)容的模板。
方法String render(Map<String, Object> model):增強(qiáng)渲染功能以包括動(dòng)態(tài)內(nèi)容。它使用一個(gè)Map,其中map鍵是提示模板中的占位符名稱,值是要插入的動(dòng)態(tài)內(nèi)容。
public interface PromptTemplateMessageActions {
Message createMessage();
Message createMessage(Map<String, Object> model);
}
方法Message createMessage():創(chuàng)建一個(gè)沒有額外數(shù)據(jù)的Message對(duì)象,用于靜態(tài)或預(yù)定義的消息內(nèi)容。
方法Message createMessage(Map<String, Object> model):擴(kuò)展消息創(chuàng)建功能以整合動(dòng)態(tài)內(nèi)容,接受一個(gè)Map,其中每個(gè)條目代表消息模板中的占位符及其相應(yīng)的動(dòng)態(tài)值。
public interface PromptTemplateActions extends PromptTemplateStringActions {
Prompt create();
Prompt create(Map<String, Object> model);
}
方法Prompt create():生成一個(gè)沒有外部數(shù)據(jù)輸入的Prompt對(duì)象,適用于靜態(tài)或預(yù)定義的提示。
方法Prompt create(Map<String, Object> model):擴(kuò)展提示創(chuàng)建功能以包括動(dòng)態(tài)內(nèi)容,接受一個(gè)Map,其中每個(gè)map條目是提示模板中的占位符及其相關(guān)的動(dòng)態(tài)值。
示例使用
以下是一個(gè)簡(jiǎn)單的示例,取自AI Workshop on PromptTemplates。
PromptTemplate promptTemplate = new PromptTemplate("Tell me a {adjective} joke about {topic}");
Prompt prompt = promptTemplate.create(Map.of("adjective", adjective, "topic", topic));
return chatClient.call(prompt).getResult();
另一個(gè)示例取自AI Workshop on Roles。
String userText = "Tell me about three famous pirates from the Golden Age of Piracy and why they did. Write at least a sentence for each pirate.";
Message userMessage = new UserMessage(userText);
String systemText = "You are a helpful AI assistant that helps people find information. Your name is {name}. You should reply to the user's request with your name and also in the style of a {voice}.";
SystemPromptTemplate systemPromptTemplate = new SystemPromptTemplate(systemText);
Message systemMessage = systemPromptTemplate.createMessage(Map.of("name", name, "voice", voice));
Prompt prompt = new Prompt(List.of(userMessage, systemMessage));
List response = chatClient.call(prompt).getResults();
這展示了如何通過使用SystemPromptTemplate創(chuàng)建具有系統(tǒng)角色的消息并傳遞占位符值來構(gòu)建Prompt實(shí)例。然后,將具有用戶角色的消息與具有系統(tǒng)角色的消息結(jié)合起來形成提示。然后將提示傳遞給ChatClient以獲得生成性響應(yīng)。
使用資源而不是原始字符串
Spring AI支持org.springframework.core.io.Resource抽象,因此您可以將提示數(shù)據(jù)放在文件中,這些文件可以直接在PromptTemplates中使用。例如,您可以在Spring管理的組件中定義一個(gè)字段來檢索Resource。
@Value("classpath:/prompts/system-message.st")
private Resource systemResource;
然后將該資源直接傳遞給SystemPromptTemplate。
SystemPromptTemplate systemPromptTemplate = new SystemPromptTemplate(systemResource);
提示工程
在生成性AI中,創(chuàng)建提示是開發(fā)者的關(guān)鍵任務(wù)。這些提示的質(zhì)量和結(jié)構(gòu)顯著影響AI輸出的有效性。投入時(shí)間和精力設(shè)計(jì)周到的提示可以極大地改善AI的結(jié)果。
在AI社區(qū)中分享和討論提示是一種常見做法。這種協(xié)作方法不僅創(chuàng)建了一個(gè)共享的學(xué)習(xí)環(huán)境,而且還導(dǎo)致了高效提示的識(shí)別和使用。
這個(gè)領(lǐng)域的研究通常涉及分析和比較不同的提示,以評(píng)估它們?cè)诟鞣N情況下的有效性。例如,一個(gè)重要研究表明,以“深呼吸,一步一步解決這個(gè)問題”開始提示顯著提高了解決問題的效率。這突顯了精心選擇的語言對(duì)生成性AI系統(tǒng)性能的影響。
掌握提示的有效使用,特別是隨著AI技術(shù)的快速發(fā)展,是一個(gè)持續(xù)的挑戰(zhàn)。您應(yīng)該認(rèn)識(shí)到提示工程的重要性,并考慮使用社區(qū)和研究的見解來改進(jìn)提示創(chuàng)建策略。
創(chuàng)建有效的提示
在開發(fā)提示時(shí),重要的是整合幾個(gè)關(guān)鍵組件,以確保清晰和有效性:
指令:向AI提供清晰直接的指令,類似于您如何與人交流。這種清晰度
對(duì)于幫助AI“理解”預(yù)期非常重要。
外部上下文:在必要時(shí)包括相關(guān)的背景信息或?qū)I響應(yīng)的具體指導(dǎo)。這種“外部上下文”為提示提供了框架,并幫助AI把握整體場(chǎng)景。
用戶輸入:這是直接的部分——用戶直接的請(qǐng)求或問題構(gòu)成了提示的核心。
輸出指示:這個(gè)方面可能有些棘手。它涉及指定AI響應(yīng)的期望格式,例如JSON。但是,請(qǐng)注意,AI可能不總是嚴(yán)格遵循這種格式。例如,它可能在實(shí)際JSON數(shù)據(jù)之前加上一個(gè)短語,如“這是你的JSON”,或者有時(shí)生成一個(gè)類似JSON的結(jié)構(gòu),但不是準(zhǔn)確的。在制作提示時(shí),提供AI預(yù)期問題和答案格式的示例可能非常有益。這種做法幫助AI“理解”您的查詢的結(jié)構(gòu)和意圖,從而產(chǎn)生更精確和相關(guān)的響應(yīng)。雖然這份文檔沒有深入探討這些技術(shù),但它們?yōu)檫M(jìn)一步探索AI提示工程提供了起點(diǎn)。
以下是一些資源列表,供進(jìn)一步調(diào)查。
簡(jiǎn)單技術(shù)
文本摘要:+ 將大量文本縮減為簡(jiǎn)潔的摘要,捕捉關(guān)鍵點(diǎn)和主要思想,同時(shí)省略較不重要的細(xì)節(jié)。
問題回答:+ 專注于從提供的文本中得出特定答案,基于用戶提出的問題。它是關(guān)于根據(jù)查詢精確定位和提取相關(guān)信息。
文本分類:+ 系統(tǒng)地將文本分類到預(yù)定義的類別或組中,分析文本并根據(jù)其內(nèi)容將其分配給最合適的類別。
對(duì)話:+ 創(chuàng)建交互式對(duì)話,AI可以與用戶進(jìn)行來回溝通,模擬自然的對(duì)話流程。
代碼生成:+ 根據(jù)特定用戶需求或描述生成功能性代碼片段,將自然語言指令翻譯成可執(zhí)行代碼。
高級(jí)技術(shù)
[Few-shot Learning](https://www.promptingguide.ai/techniques/zeroshot[Zero-shot], https://www.promptingguide.ai/techniques/fewshot):+ 使模型能夠在對(duì)特定問題類型的示例最少或沒有的情況下進(jìn)行準(zhǔn)確的預(yù)測(cè)或響應(yīng),利用學(xué)習(xí)的概括來理解和處理新任務(wù)。
Chain-of-Thought:+ 將多個(gè)AI響應(yīng)鏈接起來,創(chuàng)建一個(gè)連貫且具有上下文意識(shí)的對(duì)話。它幫助AI保持討論的線索,確保相關(guān)性和連續(xù)性。
ReAct (Reason + Act):+ 在這種方法中,AI首先分析(思考)輸入,然后確定最合適的行動(dòng)或響應(yīng)。它結(jié)合了理解與決策。
微軟指導(dǎo)
提示創(chuàng)建和優(yōu)化框架:
微軟提供了一個(gè)結(jié)構(gòu)化的方法來開發(fā)和完善提示。這個(gè)框架指導(dǎo)用戶創(chuàng)建有效的提示,從AI模型中引出期望的響應(yīng),優(yōu)化交互以實(shí)現(xiàn)清晰和高效。
標(biāo)記
標(biāo)記在AI模型處理文本的方式中至關(guān)重要,它們作為一座橋梁,將單詞(按我們的理解)轉(zhuǎn)換為AI模型可以處理的格式。這種轉(zhuǎn)換分為兩個(gè)階段:?jiǎn)卧~在輸入時(shí)被轉(zhuǎn)換為標(biāo)記,然后這些標(biāo)記在輸出時(shí)再轉(zhuǎn)換回單詞。
將文本分解為標(biāo)記的過程是AI模型理解和處理語言的基礎(chǔ)。AI模型使用這種標(biāo)記化格式來理解和響應(yīng)提示。
為了更好地理解標(biāo)記,可以將它們視為單詞的部分。通常,一個(gè)標(biāo)記代表大約四分之三的單詞。例如,莎士比亞的全部作品,總計(jì)約90萬字,將轉(zhuǎn)換為大約120萬個(gè)標(biāo)記。
嘗試使用OpenAI Tokenizer UI,看看單詞是如何轉(zhuǎn)換為標(biāo)記的。
標(biāo)記除了在AI處理中的技術(shù)角色之外,還具有實(shí)際影響,特別是關(guān)于計(jì)費(fèi)和模型能力:
計(jì)費(fèi):AI模型服務(wù)通常根據(jù)標(biāo)記使用情況進(jìn)行計(jì)費(fèi)。輸入(提示)和輸出(響應(yīng))都貢獻(xiàn)了總標(biāo)記計(jì)數(shù),使較短的提示更具成本效益。
模型限制:不同的AI模型有不同的標(biāo)記限制,定義了它們的“上下文窗口”——它們一次能夠處理的最大信息量。例如,GPT-3的限制是4K標(biāo)記,而其他模型如Claude 2和Meta Llama 2的限制是100K標(biāo)記,一些研究模型可以處理高達(dá)1百萬標(biāo)記。
上下文窗口:模型的標(biāo)記限制決定了它的上下文窗口。超過此限制的輸入不會(huì)被模型處理。重要的是只發(fā)送最小有效集的信息進(jìn)行處理。例如,當(dāng)詢問“哈姆雷特”時(shí),無需包括莎士比亞其他作品的所有標(biāo)記。文章來源:http://www.zghlxwxcb.cn/news/detail-850523.html
響應(yīng)元數(shù)據(jù):AI模型響應(yīng)的元數(shù)據(jù)包括使用的標(biāo)記數(shù)量,這是管理使用情況和成本的重要信息。文章來源地址http://www.zghlxwxcb.cn/news/detail-850523.html
到了這里,關(guān)于第七章 Spring AI API中文版 - prompts的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!