ChatClient, promptit ja rakenteinen tulostus
Kutsu chat-malleja ChatClientin kautta prompt-mallien avulla ja mapita tulokset tyypitettyyn rakenteiseen muotoon.
ChatClient, promptit ja rakenteinen tulostus on ilmainen Spring Boot 4:n kattava opas-oppitunti CoddyKitissä. Tämä on oppitunti 1/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu Spring Boot 4:n kattava opas-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Spring Boot 4:n kattava opas-kurssilla on yhteensä 4 oppituntia.
Miksi ChatClient?
Spring AI tarjoaa sujuvan korkean tason API:n LLM-mallien kanssa viestimiseen: ChatClient-komponentin. Sen sijaan että rakentaisitte HTTP-pyynnöt käsin OpenAI:ta, Anthropiccia tai Ollamaa varten, kuvaatte mitä haluatte ja annatte kehyksen huolehtia siirtokerroksesta, uudelleenyrityksistä ja viestien kokoamisesta.
- ChatClient — sujuva rakennin kertaluonteisia tai suoratoistettavia kutsuja varten.
- Prompt — luettelo viesteistä (järjestelmä, käyttäjä, avustaja) sekä asetukset.
- Jäsennelty tuloste — mallin tekstivastauksen yhdistäminen suoraan tyypitettyyn Java-olioon.
Ratkaisu on siirrettävä: vaihtakaa taustalla oleva ChatModel (OpenAI → Anthropic), niin ChatClient-koodinne pysyy samana.
Automaattinen konfigurointi ja riippuvuudet
Lisätkää Spring AI -mallin starter, niin Spring Boot konfiguroi automaattisesti ChatModel-beanin sekä injektoitavan ChatClient.Builder-rakentimen.
- Starter (esimerkiksi
spring-ai-starter-model-openai) lukee API-avaimen ja mallin ominaisuuksista. - Älkää koskaan luoko
ChatClient-oliota suoraan — injektoikaa rakennin ja kutsukaa.build()-metodia.
Tyypillinen määritys tiedostossa application.yml:
spring:
ai:
openai:
api-key: ${OPENAI_API_KEY}
chat:
options:
model: gpt-4o
temperature: 0.2ChatClientin luominen
Injektoikaa automaattisesti konfiguroitu ChatClient.Builder ja rakentakaa asiakas kerran, yleensä palvelun konstruktorissa. Voitte liittää tässä vaiheessa oletusarvoiset järjestelmäkehotteet tai asetukset, jolloin jokainen kutsu perii ne.
Asiakkaan rakentaminen palvelukohtaisesti (ei pyyntökohtaisesti) pitää konfiguraation yhdessä paikassa ja on kevyttä.
@Service
public class AssistantService {
private final ChatClient chatClient;
public AssistantService(ChatClient.Builder builder) {
this.chatClient = builder
.defaultSystem("You are a concise Spring expert. Answer in one sentence.")
.build();
}
}Ensimmäinen kutsu: prompt().user().content()
Sujuva kutsuketju näyttää lauseelta. Aloittakaa komennolla prompt(), lisätkää user(...)-viesti ja päättäkää ketju komennolla call() synkronoitua vastausta varten sekä komennolla content() pelkän tekstin hakemiseksi.
call()— synkroninen pyyntö ja vastaus.content()— poimii avustajan tekstin.chatResponse()— palauttaa sen sijaan metatiedot (tokenien käytön ja lopetussyyn).
public String ask(String question) {
return chatClient.prompt()
.user(question)
.call()
.content();
}Järjestelmä- ja käyttäjäviestit
LLM-kehote on rooleihin jaettujen viestien sarja:
- Järjestelmä — ohjeet ja persoona; määrittää toiminnan.
- Käyttäjä — loppukäyttäjän varsinainen pyyntö.
- Avustaja — mallin aiemmat vastaukset (monikierroksista kontekstia varten).
Voitte ohittaa oletusjärjestelmäviestin yksittäisen kutsun yhteydessä. Pitäkää epäluotettava käyttäjän syöte kohdassa user(...), älkää koskaan järjestelmäohjeessa, jotta prompt-injektion riski pienenee.
String answer = chatClient.prompt()
.system("You are a senior Java reviewer. Be blunt and specific.")
.user("Review this code: " + snippet)
.call()
.content();Muuttujia sisältävät kehotepohjat
Merkkijonojen kovakoodaus ei skaalaudu. Spring AI käyttää pohjan paikkamerkkejä (oletusarvoinen {name}-syntaksi StringTemplaten kautta), jotka täytetään komennolla param(...). Kehys korvaa arvot ennen pyynnön lähettämistä.
- Määritelkää pohjan teksti kerran käyttämällä
{placeholders}-paikkamerkkejä. - Liittäkää arvot komennolla
.user(u -> u.text(...).param(...)).
Näin sanamuoto erotetaan datasta ja käyttäjän arvot pysyvät selkeästi sidottuina.
String reply = chatClient.prompt()
.user(u -> u
.text("Summarize the topic {topic} for a {level} audience.")
.param("topic", "reactive streams")
.param("level", "beginner"))
.call()
.content();Pohjan korvaamisen toiminta
Spring AI rakentaa taustalla PromptTemplate-olion ja muodostaa siitä tulosteen. Voitte käyttää pohjaa myös suoraan, kun haluatte käyttää sitä uudelleen tai ladata sen resurssitiedostosta.
Tässä sama idea tavallisena Java-ohjelmana, jonka voitte suorittaa nähdäksenne korvaamisen — Springiä ei tarvita, vaan ainoastaan merkkijonojen muotoilu, joka jäljittelee renderöijän toimintaa:
import java.util.Map;
public class TemplateDemo {
static String render(String tmpl, Map<String, String> vars) {
String out = tmpl;
for (var e : vars.entrySet()) {
out = out.replace("{" + e.getKey() + "}", e.getValue());
}
return out;
}
public static void main(String[] args) {
String t = "Summarize {topic} for a {level} audience.";
System.out.println(render(t, Map.of("topic", "reactive streams", "level", "beginner")));
}
}Jäsennelty tuloste: entity()
Usein ette halua proosaa, vaan tyypitetyn olion. Spring AI:n jäsennellyn tulosteen muuntimet tekevät kolme asiaa: lisäävät kehotteeseen muotoiluohjeen, vastaanottavat mallin tekstin ja deserialisoivat sen haluamaanne tyyppiin.
Määritelkää tavallinen Java-tietue ja kutsukaa .entity(MyType.class)-metodia .content()-metodin sijaan.
public record MovieReview(String title, int year, double rating, String verdict) {}
public MovieReview review(String movie) {
return chatClient.prompt()
.user("Give a short structured review of the movie: " + movie)
.call()
.entity(MovieReview.class);
}Geneeriset tyypit käyttäen ParameterizedTypeReference-tyyppiä
Kokoelmissa tai geneerisissä säilöissä Java poistaa tyyppiparametrin ajonaikana, joten List.class ei yksin riitä. Välittäkää ParameterizedTypeReference, jotta Spring AI tietää alkioiden tyypin ja voi muodostaa oikean JSON Schema -ohjeen.
import org.springframework.core.ParameterizedTypeReference;
import java.util.List;
public record Actor(String name, List<String> films) {}
public List<Actor> castOf(String movie) {
return chatClient.prompt()
.user("List the main cast of " + movie)
.call()
.entity(new ParameterizedTypeReference<List<Actor>>() {});
}Miten entity() vaikuttaa kehotteeseen
Mekanismi kannattaa ymmärtää: entity() käyttää BeanOutputConverter-muunninta, joka muodostaa tietueestanne JSON Scheman ja lisää muotoiluohjeen, jossa mallia pyydetään vastaamaan vain vastaavan rakenteen mukaisella JSONilla.
- Malli palauttaa JSON-tekstiä.
- Muunnin jäsentää sen (Jacksonin avulla) tietueeksenne.
- Jos malli lisää ylimääräistä tekstiä, jäsentäminen voi epäonnistua — pienentäkää
temperature-arvoa ja pitäkää tietueet yksinkertaisina luotettavuuden parantamiseksi.
Voitte kutsua muunninta myös itse tarkastellaksenne lisättyä ohjetta:
import org.springframework.ai.converter.BeanOutputConverter;
record Weather(String city, double celsius) {}
var converter = new BeanOutputConverter<>(Weather.class);
String formatInstruction = converter.getFormat();
// This text is appended to your user prompt by entity()
System.out.println(formatInstruction);Suoratoisto ja vastauksen metatiedot
Suoratoistakaa pitkät vastaukset niiden saapuessa käyttämällä stream()-metodia call()-metodin sijaan. Se palauttaa reaktiivisen Flux<String>-tyypin. Havainnoitavuutta varten noutakaa koko ChatResponse, jotta voitte lukea tokenien käytön ja lopetussyyn.
.stream().content()— asteittaisista osista muodostuvaFlux<String>..call().chatResponse().getMetadata().getUsage()— kehotteen ja vastauksen tokenit.
import reactor.core.publisher.Flux;
public Flux<String> streamAnswer(String question) {
return chatClient.prompt()
.user(question)
.stream()
.content();
}Pikatarkistus
Haluatte muuntaa mallin vastauksen muotoon List<Actor>. Mikä päätteen kutsu on oikea?
Kertaus
Opitte kutsumaan LLM-malleja Spring-tyyliin ChatClient-luokan avulla:
- Injektoikaa
ChatClient.Builder, määrittäkäädefaultSystemja kutsukaabuild()kerran palvelua kohden. - Käyttäkää sujuvaa kutsuketjua:
prompt().system(...).user(...).call().content(). - Pidättehän järjestelmäohjeet ja vahvistamattoman käyttäjän syötteen erillisissä viesteissä.
- Käyttäkää
{placeholder}-mallineita yhdessä.param(...)-kutsun kanssa erottaaksenne sanamuodon datasta. - Muuntakaa vastaukset tyypitetyiksi tietueiksi käyttämällä
.entity(Type.class)-kutsua ja käyttäkää geneerisille tyypeille, kutenList<T>,ParameterizedTypeReference-tyyppiä. - Suoratoistakaa vastaukset käyttämällä
.stream().content()-kutsua ja tarkastelkaa tokenien käyttöächatResponse().getMetadata()-kutsulla.
Luotettavan rakenteisen tulosteen saamiseksi pitäkää tietueet yksinkertaisina ja pienentäkää temperature-arvoa.
Opi Java tekoälytuutorin avulla — ilmaiseksi
Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.
- Kurssit
- 21
- Oppitunnit
- 84
Usein kysytyt kysymykset
Onko oppitunti ”ChatClient, promptit ja rakenteinen tulostus” ilmainen?
Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Spring Boot 4:n kattava opas-oppimispolun 3 oppituntia, myös oppitunnin “ChatClient, promptit ja rakenteinen tulostus”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Spring Boot 4:n kattava opas-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”ChatClient, promptit ja rakenteinen tulostus”?
Kutsu chat-malleja ChatClientin kautta prompt-mallien avulla ja mapita tulokset tyypitettyyn rakenteiseen muotoon. Harjoittelet Spring Boot 4:n kattava opas-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni Spring Boot 4:n kattava opas-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin Spring Boot 4:n kattava opas-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 1/4.
Kuinka kauan ”ChatClient, promptit ja rakenteinen tulostus”-oppitunnin suorittaminen kestää?
Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.
Voinko kirjoittaa ja suorittaa koodia tällä Spring Boot 4:n kattava opas-oppitunnilla?
Kyllä. Jokainen Spring Boot 4:n kattava opas-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.
Kaikki tämän kurssin oppitunnit
- ChatClient, promptit ja rakenteinen tulostus
- Upotukset ja vektoritietokannasta haku
- Retrieval-Augmented Generation -putket
- Työkalukutsut ja agenttien advisorit