1. 1. Başlamadan önce

Hoş geldiniz! Bu codelab'de, popüler LangChain4j çerçevesini ve yeni Google GenAI modülünü kullanarak Java'da ajan tabanlı yapay zeka uygulamaları oluşturmayı öğreneceksiniz.
Ajan tabanlı yapay zeka, büyük dil modellerinin yalnızca istemlere yanıt vermekle kalmayıp karmaşık ve çok adımlı hedefleri bağımsız olarak gerçekleştirmek için araçlar, hafıza ve planlama özellikleriyle donatıldığı sistemleri ifade eder.
Basit yapılandırmalarla başlayacak, yerel araçlar ve yapılandırılmış çıktılarla temsilciler oluşturmaya geçecek ve son olarak hedefe yönelik eylem planlaması (GOAP) temsilci sistemiyle sonuçlanacak şekilde gelişmiş çoklu temsilci düzenleme kalıplarını keşfedeceksiniz.
Yapacaklarınız
- Gemini'a bağlanmak için yeni
GoogleGenAiChatModelcihazını yapılandırın. - Kolay hata ayıklama için istek/yanıt günlük kaydını etkinleştirin.
- Araçlar'ı kullanarak Gemini'a yerel Java koduna erişim izni verin.
- Gemini'dan Yapılandırılmış Çıkış (POJO) biçimini zorunlu kılın.
@Agentek açıklamasıyla tek amaçlı Agent'lar tanımlayın ve oluşturun.- Sıralı ve Paralel çoklu aracı iş akışlarını düzenleyin.
- Temsilci yürütmesini dinamik olarak planlayan bir Hedefe Yönelik Eylem Planlama (GOAP) sistemi oluşturun.
İhtiyacınız olanlar
- Java Development Kit (JDK) 17 veya daha yeni bir sürüm.
- Maven 3.5 veya sonraki bir sürümün yüklü olması gerekir.
- Google AI Studio'dan alınmış bir Gemini API anahtarı.
2. 2. Kurulum: Proje ve API anahtarı
Başlamak için yeni bir Maven projesi oluşturmamız ve Gemini API anahtarımızı yapılandırmamız gerekiyor.
Maven projesi oluşturma
Projeniz için yeni bir dizin oluşturun ve pom.xml dosyasıyla başlatın.
pom.xml dosyanıza aşağıdaki bağımlılıkları ekleyin. LangChain4j Google GenAI ve Agentic modüllerinin en son sürümü 1.16.1-beta26 kullanıldığını unutmayın:
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>gemini-agents-demo</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<langchain4j.version>1.16.1-beta26</langchain4j.version>
</properties>
<dependencies>
<!-- LangChain4j Google GenAI Integration -->
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-google-genai</artifactId>
<version>${langchain4j.version}</version>
</dependency>
<!-- LangChain4j Agentic Framework Core -->
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-agentic</artifactId>
<version>${langchain4j.version}</version>
</dependency>
<!-- LangChain4j Agentic Patterns (needed for GOAP) -->
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-agentic-patterns</artifactId>
<version>${langchain4j.version}</version>
</dependency>
<!-- SLF4J Logger for logging requests/responses -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>2.0.12</version>
</dependency>
</dependencies>
</project>
Gemini API anahtarı alma
- Google AI Studio'ya gidin.
- Get API Key'i (API anahtarı al) tıklayın.
- Yeni bir anahtar oluşturun (veya mevcut bir anahtarı seçin).
- Terminalinizde ortam değişkeni olarak ayarlayın:
export GEMINI_API_KEY="your-api-key-here"
3. 3. Gemini Chat modelini yapılandırma
Şimdi GoogleGenAiChatModel öğesini örnekleyen ve bir test istemi gönderen basit bir "Hello World" uygulaması oluşturalım.
Yeni GoogleGenAiChatModel, Gemini modellerine birleşik erişim sunan birleşik Google GenAI SDK'sını kullanır.
HelloWorld.java adlı bir sınıf oluşturun:src/main/java/com/example/HelloWorld.java
package com.example;
import dev.langchain4j.model.chat.ChatModel;
import dev.langchain4j.model.google.genai.GoogleGenAiChatModel;
public class HelloWorld {
public static void main(String[] args) {
// 1. Configure the Gemini model
ChatModel model = GoogleGenAiChatModel.builder()
.apiKey(System.getenv("GEMINI_API_KEY"))
.modelName("gemini-3.5-flash")
// Enable logging for both requests and responses
.logRequestsAndResponses(true)
.build();
// 2. Invoke the model
String response = model.chat("Hello Gemini! Explain 'Agentic AI' in one sentence.");
// 3. Print response
System.out.println("\n--- Gemini Response ---");
System.out.println(response);
}
}
Bu sınıfı çalıştırın. logRequestsAndResponses(true) etkinleştirildiğinden, Google'ın API'sine gönderilen tam istek yükünü ve alınan ham JSON yanıtını ayrıntılı olarak açıklayan ayrıntılı SLF4J günlüklerini görürsünüz. Ardından, yazdırılan çıktı gösterilir:
--- Gemini Response ---
**Agentic AI** refers to autonomous artificial intelligence systems that can proactively plan, make decisions, use tools, and execute multi-step tasks to achieve specific goals with minimal human supervision.
4. 4. Yerel Java Araçlarını Tanımlama
LLM'ler güçlü olsa da eğitim verileriyle sınırlıdır. Araçlar (işlev çağırma olarak da bilinir) sağlayarak bu modellerin yeteneklerini genişletebiliriz.
LangChain4j'de araçlar, yöntemlerin @Tool ile açıklama eklenmiş olduğu basit Java sınıflarıdır.
İki tarih arasındaki gün sayısını hesaplayan basit bir araç yazalım. src/main/java/com/example/DateTools.java içinde DateTools.java oluşturma:
package com.example;
import dev.langchain4j.agent.tool.P;
import dev.langchain4j.agent.tool.Tool;
import java.time.LocalDate;
import java.time.temporal.ChronoUnit;
public class DateTools {
@Tool("Calculates the number of days between two dates")
public long daysBetween(
@P("The start date in ISO format (YYYY-MM-DD)") String startDate,
@P("The end date in ISO format (YYYY-MM-DD)") String endDate) {
LocalDate start = LocalDate.parse(startDate);
LocalDate end = LocalDate.parse(endDate);
return ChronoUnit.DAYS.between(start, end);
}
}
Bu aracı kullanmak için bir Yapay Zeka Hizmeti tanımlayacağız. LangChain4j Agentic altyapısında, AgenticServices.agentBuilder() kullanarak oluşturabiliriz.
src/main/java/com/example/ToolDemo.java içinde ToolDemo.java oluşturma:
package com.example;
import dev.langchain4j.agentic.Agent;
import dev.langchain4j.agentic.AgenticServices;
import dev.langchain4j.model.chat.ChatModel;
import dev.langchain4j.model.google.genai.GoogleGenAiChatModel;
import dev.langchain4j.service.V;
public class ToolDemo {
public interface DateAssistant {
@Agent
String ask(@V("prompt") String prompt);
}
public static void main(String[] args) {
ChatModel model = GoogleGenAiChatModel.builder()
.apiKey(System.getenv("GEMINI_API_KEY"))
.modelName("gemini-3.5-flash")
.build();
// Build the assistant and register our DateTools
DateAssistant assistant = AiServices.builder(DateAssistant.class)
.chatModel(model)
.tools(new DateTools())
.build();
String response = assistant.ask("How many days are there between 2026-01-01 and 2026-06-30?");
System.out.println("Response: " + response);
}
}
Bu kodu çalıştırdığınızda Gemini istemi analiz eder, daysBetween'ı çağırması gerektiğini anlar, bir araç çağrısı isteği oluşturur, LangChain4j yerel Java yönteminizi yürütür, sonucu Gemini'a geri gönderir ve Gemini nihai doğal dil yanıtını biçimlendirir.
Şuna benzer bir çıkış görürsünüz:
Response: There are 180 days between 2026-01-01 and 2026-06-30.
5. 5. Yapılandırılmış Çıkışı Tanımlama
Çoğu zaman, LLM'nin verileri düz metin yerine belirli bir yapılandırılmış biçimde (ör. bir şemayla eşleşen JSON) döndürmesini istersiniz.
LangChain4j, aracınızın veya hizmet yönteminizin dönüş türü olarak bir POJO ya da Java record belirttiğinizde bunu otomatik olarak işler.
Kitap alıntısını temsil eden bir Java record tanımlayalım:
src/main/java/com/example/Book.java içinde Book.java oluşturma:
package com.example;
public record Book(String title, String author, int publicationYear) {}
Şimdi Book döndüren bir aracı arayüzü oluşturun. src/main/java/com/example/StructuredOutputDemo.java içinde StructuredOutputDemo.java oluşturun:
package com.example;
import dev.langchain4j.agentic.Agent;
import dev.langchain4j.agentic.AgenticServices;
import dev.langchain4j.model.chat.ChatModel;
import dev.langchain4j.model.google.genai.GoogleGenAiChatModel;
import dev.langchain4j.service.UserMessage;
import dev.langchain4j.service.V;
public class StructuredOutputDemo {
public interface BookExtractor {
@UserMessage("Extract book details from: {{text}}")
Book extract(@V("text") String text);
}
public static void main(String[] args) {
ChatModel model = GoogleGenAiChatModel.builder()
.apiKey(System.getenv("GEMINI_API_KEY"))
.modelName("gemini-3.5-flash")
.build();
BookExtractor extractor = AiServices.builder(BookExtractor.class)
.chatModel(model)
.build();
String text = "I just finished reading 'Project Hail Mary' by Andy Weir, published in 2021. It was amazing!";
Book book = extractor.extract(text);
System.out.println("Extracted POJO: " + book);
}
}
Gemini 3.5 Flash, katı JSON şema çıkışını destekler. LangChain4j, Book kaydınızdan JSON şemasını oluşturur, Gemini'a bu şemayı doldurmasını söyler ve JSON yanıtını tekrar Book kaydına seri durumdan çıkarır.
Şuna benzer bir çıkış görürsünüz:
Extracted POJO: Book[title=Project Hail Mary, author=Andy Weir, publicationYear=2021]
6. 6. İlk temsilcinizi oluşturma
langchain4j-agentic çerçevesinde, Agent, arayüzün yönteminde @Agent ek açıklaması kullanılarak tanımlanır. Bu ek açıklama, düzenleme sistemleri (ör. planlayıcılar) tarafından kullanılabilecek bir ad/açıklama sağlar.
Bir konu alıp bu konu hakkında çok kısa bir hikaye taslağı oluşturan basit bir aracı oluşturalım.
src/main/java/com/example/CreativeWriter.java içinde CreativeWriter.java oluşturma:
package com.example;
import dev.langchain4j.agentic.Agent;
import dev.langchain4j.service.SystemMessage;
import dev.langchain4j.service.UserMessage;
import dev.langchain4j.service.V;
public interface CreativeWriter {
@SystemMessage("You are a creative writer. Generate a draft of a story no more than 3 sentences long.")
@UserMessage("Write a story about {{topic}}.")
@Agent(description = "Generates a story based on the given topic", outputKey = "story")
String writeStory(@V("topic") String topic);
}
Bu ajanı ayrı ayrı test edelim. src/main/java/com/example/AgentDemo.java içinde AgentDemo.java oluşturma:
package com.example;
import dev.langchain4j.agentic.AgenticServices;
import dev.langchain4j.model.chat.ChatModel;
import dev.langchain4j.model.google.genai.GoogleGenAiChatModel;
public class AgentDemo {
public static void main(String[] args) {
ChatModel model = GoogleGenAiChatModel.builder()
.apiKey(System.getenv("GEMINI_API_KEY"))
.modelName("gemini-3.5-flash")
.build();
CreativeWriter writer = AgenticServices.agentBuilder(CreativeWriter.class)
.chatModel(model)
.build();
String story = writer.writeStory("a lonely robot on Mars");
System.out.println("Generated Story:\n" + story);
}
}
Şuna benzer bir çıkış görürsünüz:
Generated Story:
For eighty years, the rusty little rover trundled across the crimson dunes, diligently collecting soil samples for a home world that had long since gone dark. Each evening, it pointed its high-gain antenna toward the fading blue speck of Earth and beamed its lonely coordinates into the silent cosmos. Receiving only static in return, the robot tucked its camera arm close against the freezing Martian wind and sang a quiet lullaby to the empty stars.
@Agent ek açıklaması eklendiğinde bu sınıf, sıralı zincirleme gibi daha karmaşık iş akışlarına katılmaya hazır hale gelir.
7. 7. Çok Temsilcili İş Akışlarını Düzenleme: Sıralı
Yaygın bir temsilci kalıbı olan Sıralı İş Akışı'nda temsilciler önceden tanımlanmış bir sırayla çalışır. Bir temsilcinin çıktısı, bir sonraki temsilcinin girişi olarak iletilir.
CreativeWriter tarafından yazılan hikayeyi belirli bir stile (ör. komedi, drama) uyacak şekilde düzenleyecek ikinci bir aracı (StyleEditor) tanımlayalım.
src/main/java/com/example/StyleEditor.java içinde StyleEditor.java oluşturma:
package com.example;
import dev.langchain4j.agentic.Agent;
import dev.langchain4j.service.SystemMessage;
import dev.langchain4j.service.UserMessage;
import dev.langchain4j.service.V;
public interface StyleEditor {
@SystemMessage("You are a professional editor. Analyze and rewrite the story to align with the style requested.")
@UserMessage("Rewrite this story: '{{story}}' into a {{style}} style.")
@Agent(description = "Edits a story to fit a specific style", outputKey = "edited_story")
String editStory(@V("story") String story, @V("style") String style);
}
Şimdi AgenticServices.sequenceBuilder() kullanarak CreativeWriter ve StyleEditor cihazlarını sırayla bağlayalım.
Sırayı temsil eden bir UntypedAgent kullanırız. Bu sayede, girişleri iletebilir ve çıkışları paylaşılan bir harita üzerinden toplayabiliriz.
src/main/java/com/example/SequentialWorkflowDemo.java içinde SequentialWorkflowDemo.java oluşturma:
package com.example;
import dev.langchain4j.agentic.AgenticServices;
import dev.langchain4j.agentic.UntypedAgent;
import dev.langchain4j.model.chat.ChatModel;
import dev.langchain4j.model.google.genai.GoogleGenAiChatModel;
import java.util.Map;
public class SequentialWorkflowDemo {
public static void main(String[] args) {
ChatModel model = GoogleGenAiChatModel.builder()
.apiKey(System.getenv("GEMINI_API_KEY"))
.modelName("gemini-3.5-flash")
.build();
// 1. Build the sub-agents
CreativeWriter writer = AgenticServices.agentBuilder(CreativeWriter.class)
.chatModel(model)
.outputKey("story") // Output goes into AgenticScope as "story"
.build();
StyleEditor editor = AgenticServices.agentBuilder(StyleEditor.class)
.chatModel(model)
.outputKey("edited_story") // Output goes into AgenticScope as "edited_story"
.build();
// 2. Build the sequence
UntypedAgent workflow = AgenticServices.sequenceBuilder()
.subAgents(writer, editor)
.outputKey("edited_story") // Final output of workflow
.build();
// 3. Run the workflow with inputs
Map<String, Object> inputs = Map.of(
"topic", "a cat learning to fly",
"style", "Shakespearean"
);
String result = (String) workflow.invoke(inputs);
System.out.println("Final Edited Story:\n" + result);
}
}
Şuna benzer bir çıkış görürsünüz:
Final Edited Story:
For years had Barnaby with envy watched
The soaring sparrows with a green-eyed spite,
Convinced that heavy gravity was but
An idle law he deigned to tolerate.
But lo! Upon the rare and azure moon,
He scaled the summit of the ancient oak,
Closed fast his eyes, and leapt with blind belief.
While the dread squirrel shrieked in sheer dismay,
No downward plunge befell the daring beast;
For summer's zephyr bore his belly up,
And through the vault of night's celestial sphere,
He rowed his velvet paws among the stars.
AgenticScope ile tanışın
LangChain4j, yürütme sırasında AgenticScope yönetir.
- Giriş haritası
{"topic": "...", "style": "..."}, kapsama yazılır. CreativeWriteryürütülür. Kapsamdan okuduğutopicgerektirir.storyçıkışını verir ve bu çıkış, kapsama geri kaydedilir.StyleEditoryürütülür.story(yazar tarafından üretilen) vestyle(ilk girişlerden alınan) bilgilerini gerektirir. Kapsamaedited_storyçıkışı verir.- İş akışı tamamlanır ve
edited_storydeğerini döndürür.
8. 8. Çoklu aracı iş akışlarını düzenleme: Paralel
Bazı senaryolarda, alt aracılar aynı giriş üzerinde bağımsız olarak çalışabilir ve görevleri paralel olarak yürütülebilir.
Örneğin, bir şehri ziyaret etmek isteyenlere film ve yemek önerileri sunan bir seyahat danışmanı oluşturalım.
src/main/java/com/example/MovieExpert.java içinde MovieExpert.java oluşturma:
package com.example;
import dev.langchain4j.agentic.Agent;
import dev.langchain4j.service.UserMessage;
import dev.langchain4j.service.V;
import java.util.List;
public interface MovieExpert {
@UserMessage("Suggest 2 movies filmed in {{city}}.")
@Agent(description = "Suggests movies filmed in a city")
List<String> findMovies(@V("city") String city);
}
src/main/java/com/example/DiningExpert.java içinde DiningExpert.java oluşturma:
package com.example;
import dev.langchain4j.agentic.Agent;
import dev.langchain4j.service.UserMessage;
import dev.langchain4j.service.V;
import java.util.List;
public interface DiningExpert {
@UserMessage("Suggest 2 local dishes to try in {{city}}.")
@Agent(description = "Suggests local dishes to try in a city")
List<String> findDishes(@V("city") String city);
}
Şimdi paralel yapay sistemini oluşturalım. Üst düzey koordinatörümüz için bir arayüz tanımlayacağız: TravelAdvisorAgent.
src/main/java/com/example/TravelAdvisorAgent.java içinde TravelAdvisorAgent.java oluşturma:
package com.example;
import dev.langchain4j.agentic.Agent;
import dev.langchain4j.service.V;
import java.util.Map;
public interface TravelAdvisorAgent {
@Agent
Map<String, Object> planTrip(@V("city") String city);
}
Her şeyi bir araya getirmek için src/main/java/com/example/ParallelWorkflowDemo.java içinde ParallelWorkflowDemo.java oluşturun:
package com.example;
import dev.langchain4j.agentic.AgenticServices;
import dev.langchain4j.model.chat.ChatModel;
import dev.langchain4j.model.google.genai.GoogleGenAiChatModel;
import java.util.List;
import java.util.Map;
public class ParallelWorkflowDemo {
public static void main(String[] args) {
ChatModel model = GoogleGenAiChatModel.builder()
.apiKey(System.getenv("GEMINI_API_KEY"))
.modelName("gemini-3.5-flash")
.build();
// 1. Build independent agents
MovieExpert movieExpert = AgenticServices.agentBuilder(MovieExpert.class)
.chatModel(model)
.outputKey("movies")
.build();
DiningExpert diningExpert = AgenticServices.agentBuilder(DiningExpert.class)
.chatModel(model)
.outputKey("dishes")
.build();
// 2. Build the Parallel agent
TravelAdvisorAgent travelAdvisor = AgenticServices.parallelBuilder(TravelAdvisorAgent.class)
.subAgents(movieExpert, diningExpert)
.output(scope -> {
// Combine the independent outputs in the AgenticScope
List<String> movies = scope.readState("movies", List.of());
List<String> dishes = scope.readState("dishes", List.of());
return Map.of("movies", movies, "dishes", dishes);
})
.build();
// 3. Invoke
Map<String, Object> plan = travelAdvisor.planTrip("Tokyo");
System.out.println("Tokyo Trip Plan:\n" + plan);
}
}
Şuna benzer bir çıkış görürsünüz:
Tokyo Trip Plan:
{movies=[Lost in Translation, Tokyo Story], dishes=[Monjayaki, Edomae-zushi]}
In this parallel workflow, `movieExpert` and `diningExpert` execute concurrently. The `output(...)` configuration defines how to gather their respective results from the `AgenticScope` and merge them into the final result.
## 9. Build Goal-Oriented Agents (GOAP)
Duration: 07:00
Sequential and Parallel workflows are structured and predictable, but rigid. What if we want the system to figure out the path to the goal autonomously, but in a **deterministic, algorithmic way** rather than trusting an LLM to loop (like ReAct)?
This is where **Goal-Oriented Action Planning (GOAP)** shines.
By looking at the declared inputs and outputs of each agent, the `GoalOrientedPlanner` builds a dependency graph. When you invoke the system with a goal, it calculates the shortest path from the current state (available variables) to that goal.
Let's build a Horoscope & News combined writer. It requires 4 agents:
1. `PersonExtractor`: extracts person details from prompt.
2. `SignExtractor`: extracts zodiac sign from prompt.
3. `HoroscopeGenerator`: generates horoscope given person and sign.
4. `AmusingWriter`: writes a funny story combining a horoscope and a news story.
We will also define a `StoryFinder` that uses a mock search tool.
### 1. Define Model Classes
Create `Person.java` in `src/main/java/com/example/Person.java`:
```java
package com.example;
public record Person(String name) {
@Override public String toString() { return name; }
}
src/main/java/com/example/Sign.java içinde Sign.java oluşturma:
package com.example;
public record Sign(String signName) {
@Override public String toString() { return signName; }
}
2. Alt aracıları tanımlama
src/main/java/com/example/HoroscopeGenerator.java içinde HoroscopeGenerator.java oluşturma:
package com.example;
import dev.langchain4j.agentic.Agent;
import dev.langchain4j.service.UserMessage;
import dev.langchain4j.service.V;
public interface HoroscopeGenerator {
@UserMessage("Generate a funny horoscope for {{person}} who is a {{sign}}.")
@Agent(description = "Generates horoscopes based on name and zodiac sign")
String horoscope(@V("person") Person person, @V("sign") Sign sign);
}
src/main/java/com/example/PersonExtractor.java içinde PersonExtractor.java oluşturma:
package com.example;
import dev.langchain4j.agentic.Agent;
import dev.langchain4j.service.UserMessage;
import dev.langchain4j.service.V;
public interface PersonExtractor {
@UserMessage("Extract the person name from: {{prompt}}")
@Agent(description = "Extracts a person from user's prompt")
Person extractPerson(@V("prompt") String prompt);
}
src/main/java/com/example/SignExtractor.java içinde SignExtractor.java oluşturma:
package com.example;
import dev.langchain4j.agentic.Agent;
import dev.langchain4j.service.UserMessage;
import dev.langchain4j.service.V;
public interface SignExtractor {
@UserMessage("Extract the zodiac sign from: {{prompt}}")
@Agent(description = "Extracts a zodiac sign from user's prompt")
Sign extractSign(@V("prompt") String prompt);
}
src/main/java/com/example/AmusingWriter.java içinde AmusingWriter.java oluşturma:
package com.example;
import dev.langchain4j.agentic.Agent;
import dev.langchain4j.service.UserMessage;
import dev.langchain4j.service.V;
public interface AmusingWriter {
@UserMessage("Create an amusing writeup for {{person}} based on their horoscope: {{horoscope}} and current news story: {{story}}.")
@Agent(description = "Create an amusing writeup combining horoscope and news")
String write(@V("person") Person person, @V("horoscope") String horoscope, @V("story") String story);
}
3. Hikaye Bulma Aracı'nı tanımlama
Basit bir arama aracı sınıfı oluşturacağız. Bu sınıf, sahte bir hikaye döndürür. src/main/java/com/example/MockSearchTool.java içinde MockSearchTool.java oluşturun:
package com.example;
import dev.langchain4j.agent.tool.P;
import dev.langchain4j.agent.tool.Tool;
public class MockSearchTool {
@Tool("Searches the web for news stories related to a zodiac sign")
public String searchNews(@P("The zodiac sign") String sign) {
return "Breaking news: A massive cheese festival was announced for " + sign + " natives today!";
}
}
Bu aracı kullanan src/main/java/com/example/StoryFinder.java aracısında StoryFinder.java oluşturun:
package com.example;
import dev.langchain4j.agentic.Agent;
import dev.langchain4j.service.UserMessage;
import dev.langchain4j.service.V;
public interface StoryFinder {
@UserMessage("Find a funny story for zodiac sign {{sign}} using search tool.")
@Agent(description = "Finds a news story on the internet about a zodiac sign")
String findStory(@V("sign") Sign sign);
}
4. GOAP Agentic System'i oluşturma ve çalıştırma
src/main/java/com/example/GoapDemo.java içinde GoapDemo.java oluşturma:
package com.example;
import dev.langchain4j.agentic.AgenticServices;
import dev.langchain4j.agentic.UntypedAgent;
import dev.langchain4j.agentic.patterns.goap.GoalOrientedPlanner;
import dev.langchain4j.model.chat.ChatModel;
import dev.langchain4j.model.google.genai.GoogleGenAiChatModel;
import java.util.Map;
public class GoapDemo {
public static void main(String[] args) {
ChatModel model = GoogleGenAiChatModel.builder()
.apiKey(System.getenv("GEMINI_API_KEY"))
.modelName("gemini-3.5-flash")
.build();
// Instantiate sub-agents with output keys matching the inputs of other agents
HoroscopeGenerator horoscopeGen = AgenticServices.agentBuilder(HoroscopeGenerator.class)
.chatModel(model).outputKey("horoscope").build();
PersonExtractor personExt = AgenticServices.agentBuilder(PersonExtractor.class)
.chatModel(model).outputKey("person").build();
SignExtractor signExt = AgenticServices.agentBuilder(SignExtractor.class)
.chatModel(model).outputKey("sign").build();
StoryFinder storyFinder = AgenticServices.agentBuilder(StoryFinder.class)
.chatModel(model).tools(new MockSearchTool()).outputKey("story").build();
AmusingWriter writer = AgenticServices.agentBuilder(AmusingWriter.class)
.chatModel(model).outputKey("writeup").build();
// Build the GOAP Planner agentic system
UntypedAgent horoscopeNewsAgent = AgenticServices.plannerBuilder()
.subAgents(horoscopeGen, personExt, signExt, storyFinder, writer)
.outputKey("writeup") // The Goal we want to achieve
.planner(GoalOrientedPlanner::new) // Register the GOAP Planner
.build();
// Input provides only "prompt"
Map<String, Object> inputs = Map.of(
"prompt", "My name is Alice and my zodiac sign is Leo"
);
System.out.println("Invoking GOAP Agentic System...");
String result = (String) horoscopeNewsAgent.invoke(inputs);
System.out.println("\n--- Final Writeup ---");
System.out.println(result);
}
}
GOAP'nin çözümü:
Çağrıldığında:
- Sistem, başlangıç durumunun yalnızca
promptiçerdiğini algılar. - İstenen hedef
writeup. - Bağımlılık grafiği oluşturur ve yolu hesaplar:
prompt->PersonExtractor->personprompt->SignExtractor->signperson+sign->HoroscopeGenerator->horoscopesign->StoryFinder->storyperson+horoscope+story->AmusingWriter->writeup
- Hesaplanan yürütme sırası:
[PersonExtractor, SignExtractor, HoroscopeGenerator, StoryFinder, AmusingWriter]. - Her alt aracıyı sırayla yürütür ve nihai sonucu döndürür.
Şuna benzer bir çıkış görürsünüz:
Invoking GOAP Agentic System...
[com.example.GoapDemo.main()] INFO dev.langchain4j.agentic.patterns.goap.GoalOrientedSearchGraph - Agents path sequence: [extractPerson, extractSign, findStory, horoscope, write]
--- Final Writeup ---
**The Cosmic Registry's Weekly Forecast & Special Event Guide for: Alice, the Leo Lioness**
Alice, the universe looked at your astrological chart this week and frankly, it's asking for your autograph. Your main-character energy is currently so potent that secondary characters are practically fading into the background.
But the biggest cosmic news of the week? The universe has finally recognized your royal status with the announcement of a **Massive Cheese Festival**...
9. 10. Temizleme
Kaynakları temizlemek için:
- Artık kullanmadığınız Google AI Studio'daki API anahtarlarını sildiğinizden emin olun.
- Terminalinizde ortam değişkeninin ayarını kaldırın:
unset GEMINI_API_KEY
10. 11. Tebrikler
Tebrikler! LangChain4j ve yeni Google üretken yapay zeka modülünü kullanarak bir dizi ajan tabanlı yapay zeka uygulaması oluşturmayı başardınız.
Becerilerinizi geliştirmek için resmi LangChain4j Google GenAI modülü dokümanlarına göz atmanızı ve LangChain4j ile aracı oluşturma hakkında daha fazla bilgi edinmenizi öneririz.
Öğrendikleriniz
- Nasıl yapılandırılır?
GoogleGenAiChatModel - Yerel Java araçlarını ve istek/yanıt günlüğünü kullanma
- Yapılandırılmış POJO verileri nasıl çıkışa aktarılır?
@Agentile tek amaçlı temsilciler oluşturma- Sıralı, paralel ve hedef odaklı eylem planlama (GOAP) ajan tabanlı iş akışlarını düzenleme