Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/
.env

### STS ###
.apt_generated
Expand Down
25 changes: 22 additions & 3 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.3.0</version>
<version>3.5.9</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>dev.danvega</groupId>
Expand All @@ -28,16 +28,27 @@
</scm>
<properties>
<java.version>21</java.version>
<spring-ai.version>1.1.0</spring-ai.version>
<spring-ai.version>1.1.2</spring-ai.version>
</properties>
<dependencies>
<dependency>
<dependency>
<groupId>me.paulschwarz</groupId>
<artifactId>spring-dotenv</artifactId>
<version>4.0.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-model-openai</artifactId>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-model-ollama</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.ai</groupId>
Expand Down Expand Up @@ -91,6 +102,14 @@
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- Testcontainers BOM -->
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>testcontainers-bom</artifactId>
<version>1.21.1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

Expand Down
17 changes: 17 additions & 0 deletions src/main/java/dev/danvega/workshop/Application.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,13 @@
package dev.danvega.workshop;

import org.springframework.ai.chat.model.ChatModel;
import org.springframework.ai.embedding.EmbeddingModel;
import org.springframework.ai.openai.OpenAiChatModel;
import org.springframework.ai.openai.OpenAiEmbeddingModel;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Primary;

import java.io.IOException;

Expand All @@ -12,4 +18,15 @@ public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}

@Bean
@Primary
public ChatModel primaryChatModel(OpenAiChatModel openAiChatModel) {
return openAiChatModel;
}

@Bean
@Primary
public EmbeddingModel primaryEmbeddingModel(OpenAiEmbeddingModel openAiEmbeddingModel) {
return openAiEmbeddingModel;
}
}
3 changes: 2 additions & 1 deletion src/main/java/dev/danvega/workshop/SimpleChatController.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package dev.danvega.workshop;

import org.springframework.ai.chat.client.ChatClient;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

Expand All @@ -17,7 +18,7 @@ public SimpleChatController(ChatClient.Builder builder) {
@GetMapping("/java")
public String chat() {
return chatClient.prompt()
.user("Tell me an intresting fact about Java")
.user("Tell me an interesting fact about Java")
.call()
.content();
}
Expand Down
13 changes: 8 additions & 5 deletions src/main/java/dev/danvega/workshop/evals/ReviewService.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
import org.springframework.ai.openai.OpenAiChatOptions;
import org.springframework.stereotype.Service;

import java.util.Objects;

@Service
public class ReviewService {

Expand All @@ -20,11 +22,12 @@ public Sentiment classifySentiment(String review) {
Classify the sentiment of the following text as POSITIVE, NEGATIVE, or NEUTRAL. \
Your response must be only one of these three words.""";

return chatClient.prompt()
.system(systemPrompt)
.user(review)
.call()
.entity(Sentiment.class);
return Objects.requireNonNull(chatClient.prompt()
.system(systemPrompt)
.user(review)
.call()
.entity(SentimentResponse.class))
.getSentiment();
}

}
16 changes: 16 additions & 0 deletions src/main/java/dev/danvega/workshop/evals/SentimentResponse.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package dev.danvega.workshop.evals;


public class SentimentResponse {
private Sentiment sentiment;

public SentimentResponse() {}

public Sentiment getSentiment() {
return sentiment;
}

public void setSentiment(Sentiment sentiment) {
this.sentiment = sentiment;
}
}
6 changes: 3 additions & 3 deletions src/main/resources/application.properties
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
spring.application.name=ai-workshop
spring.ai.openai.api-key=${OPENAI_API_KEY}
spring.ai.openai.chat.options.model=gpt-4o
spring.ai.openai.chat.options.model=gpt-4o-mini
spring.threads.virtual.enabled=true

spring.ai.ollama.chat.model=bespokeai/minicheck
spring.ai.ollama.chat.temperature=0.1
spring.ai.ollama.chat.options.temperature=0.1
spring.ai.ollama.base-url=http://localhost:11434

logging.level.dev.danvega.workshop=DEBUG
12 changes: 12 additions & 0 deletions src/test/java/dev/danvega/workshop/evals/ChatClientTestConfig.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,13 @@
package dev.danvega.workshop.evals;

import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.evaluation.FactCheckingEvaluator;
import org.springframework.ai.chat.model.ChatModel;
import org.springframework.ai.ollama.OllamaChatModel;
import org.springframework.boot.test.context.TestConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.Primary;

@TestConfiguration
class ChatClientTestConfig {
Expand All @@ -11,4 +16,11 @@ class ChatClientTestConfig {
ChatClient chatClient(ChatClient.Builder builder) {
return builder.build();
}


@Bean
public FactCheckingEvaluator factCheckingEvaluator(ChatClient.Builder chatClientBuilder) {
return FactCheckingEvaluator.builder(chatClientBuilder)
.build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,11 @@
import org.springframework.ai.evaluation.EvaluationRequest;
import org.springframework.ai.evaluation.EvaluationResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.testcontainers.service.connection.ServiceConnection;
import org.springframework.context.annotation.Import;
import org.springframework.test.context.ActiveProfiles;
import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers;
import org.testcontainers.ollama.OllamaContainer;
Expand All @@ -20,7 +23,9 @@
import static org.junit.jupiter.api.Assertions.assertTrue;

@SpringBootTest
@ActiveProfiles("test")
@Testcontainers
@Import(ChatClientTestConfig.class)
public class FactCheckingEvaluatorTest {

private static final String OLLAMA_IMAGE = "ollama/ollama:0.1.48";
Expand All @@ -30,12 +35,13 @@ public class FactCheckingEvaluatorTest {
@ServiceConnection(name = "spring.ai.ollama.base-url")
static final OllamaContainer ollama = new OllamaContainer(OLLAMA_IMAGE);

@Autowired
private FactCheckingEvaluator factCheckingEvaluator;

@BeforeEach
void setUp(@Autowired ChatClient.Builder builder) {
factCheckingEvaluator = new FactCheckingEvaluator(builder);
}
// @BeforeEach
// void setUp(@Autowired FactCheckingEvaluator evaluator) {
// factCheckingEvaluator = evaluator;
// }

@Test
void passes_when_claim_is_true() {
Expand Down