diff --git a/libraries-llms/src/main/resources/logback.xml b/libraries-llms/src/main/resources/logback.xml
deleted file mode 100644
index 23c5605a05..0000000000
--- a/libraries-llms/src/main/resources/logback.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
-
-
- %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} -
- %msg%n
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/libraries-llms/src/test/java/com/baeldung/langchain/ChainWithDocumentLiveTest.java b/libraries-llms/src/test/java/com/baeldung/langchain/ChainWithDocumentLiveTest.java
index b1db486d84..556f394866 100644
--- a/libraries-llms/src/test/java/com/baeldung/langchain/ChainWithDocumentLiveTest.java
+++ b/libraries-llms/src/test/java/com/baeldung/langchain/ChainWithDocumentLiveTest.java
@@ -1,9 +1,7 @@
package com.baeldung.langchain;
import static dev.langchain4j.data.document.FileSystemDocumentLoader.loadDocument;
-import static dev.langchain4j.model.openai.OpenAiModelName.GPT_3_5_TURBO;
import static java.time.Duration.ofSeconds;
-import static java.util.stream.Collectors.joining;
import java.io.File;
import java.net.MalformedURLException;
@@ -11,75 +9,64 @@ import java.net.URISyntaxException;
import java.net.URL;
import java.nio.file.Path;
import java.nio.file.Paths;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.logging.Logger;
import org.junit.Assert;
import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import dev.langchain4j.chain.ConversationalRetrievalChain;
import dev.langchain4j.data.document.Document;
-import dev.langchain4j.data.document.DocumentSplitter;
import dev.langchain4j.data.document.splitter.DocumentSplitters;
-import dev.langchain4j.data.embedding.Embedding;
-import dev.langchain4j.data.message.AiMessage;
import dev.langchain4j.data.segment.TextSegment;
+import dev.langchain4j.memory.chat.MessageWindowChatMemory;
import dev.langchain4j.model.chat.ChatLanguageModel;
import dev.langchain4j.model.embedding.AllMiniLmL6V2EmbeddingModel;
import dev.langchain4j.model.embedding.EmbeddingModel;
-import dev.langchain4j.model.input.Prompt;
import dev.langchain4j.model.input.PromptTemplate;
import dev.langchain4j.model.openai.OpenAiChatModel;
-import dev.langchain4j.model.openai.OpenAiTokenizer;
-import dev.langchain4j.store.embedding.EmbeddingMatch;
+import dev.langchain4j.retriever.EmbeddingStoreRetriever;
import dev.langchain4j.store.embedding.EmbeddingStore;
+import dev.langchain4j.store.embedding.EmbeddingStoreIngestor;
import dev.langchain4j.store.embedding.inmemory.InMemoryEmbeddingStore;
public class ChainWithDocumentLiveTest {
+
+ Logger logger = LoggerFactory.getLogger(ChainWithDocumentLiveTest.class);
@Test
- public void givenChainWithDocument_whenPrompted_thenValidResponse() {
-
- Document document = loadDocument(toPath("src/test/resources/example-files/simpson's_adventures.txt"));
- DocumentSplitter splitter = DocumentSplitters.recursive(100, 0, new OpenAiTokenizer(GPT_3_5_TURBO));
- List segments = splitter.split(document);
+ public void givenDocument_whenPrompted_thenValidResponse() {
EmbeddingModel embeddingModel = new AllMiniLmL6V2EmbeddingModel();
- List embeddings = embeddingModel.embedAll(segments)
- .content();
+
EmbeddingStore embeddingStore = new InMemoryEmbeddingStore<>();
- embeddingStore.addAll(embeddings, segments);
- String question = "Who is Simpson?";
- Embedding questionEmbedding = embeddingModel.embed(question)
- .content();
- int maxResults = 3;
- double minScore = 0.7;
- List> relevantEmbeddings = embeddingStore.findRelevant(questionEmbedding, maxResults, minScore);
+ EmbeddingStoreIngestor ingestor = EmbeddingStoreIngestor.builder()
+ .documentSplitter(DocumentSplitters.recursive(500, 0))
+ .embeddingModel(embeddingModel)
+ .embeddingStore(embeddingStore)
+ .build();
- PromptTemplate promptTemplate = PromptTemplate.from("Answer the following question to the best of your ability:\n" + "\n" + "Question:\n" + "{{question}}\n" + "\n" + "Base your answer on the following information:\n" + "{{information}}");
+ Document document = loadDocument(toPath("src/test/resources/example-files/simpson's_adventures.txt"));
+ ingestor.ingest(document);
- String information = relevantEmbeddings.stream()
- .map(match -> match.embedded()
- .text())
- .collect(joining("\n\n"));
-
- Map variables = new HashMap<>();
- variables.put("question", question);
- variables.put("information", information);
-
- Prompt prompt = promptTemplate.apply(variables);
ChatLanguageModel chatModel = OpenAiChatModel.builder()
- .apiKey(Constants.OPEN_API_KEY)
+ .apiKey(Constants.OPEN_AI_KEY)
.timeout(ofSeconds(60))
.build();
- AiMessage aiMessage = chatModel.generate(prompt.toUserMessage())
- .content();
- Logger.getGlobal()
- .info(aiMessage.text());
- Assert.assertNotNull(aiMessage.text());
+ ConversationalRetrievalChain chain = ConversationalRetrievalChain.builder()
+ .chatLanguageModel(chatModel)
+ .retriever(EmbeddingStoreRetriever.from(embeddingStore, embeddingModel))
+ .chatMemory(MessageWindowChatMemory.withMaxMessages(10))
+ .promptTemplate(PromptTemplate
+ .from("Answer the following question to the best of your ability: {{question}}\n\nBase your answer on the following information:\n{{information}}"))
+ .build();
+
+ String answer = chain.execute("Who is Simpson?");
+
+ logger.info(answer);
+ Assert.assertNotNull(answer);
}
diff --git a/libraries-llms/src/test/java/com/baeldung/langchain/ChatWithDocumentLiveTest.java b/libraries-llms/src/test/java/com/baeldung/langchain/ChatWithDocumentLiveTest.java
index 643c56520e..a7dc89afde 100644
--- a/libraries-llms/src/test/java/com/baeldung/langchain/ChatWithDocumentLiveTest.java
+++ b/libraries-llms/src/test/java/com/baeldung/langchain/ChatWithDocumentLiveTest.java
@@ -1,7 +1,9 @@
package com.baeldung.langchain;
import static dev.langchain4j.data.document.FileSystemDocumentLoader.loadDocument;
+import static dev.langchain4j.model.openai.OpenAiModelName.GPT_3_5_TURBO;
import static java.time.Duration.ofSeconds;
+import static java.util.stream.Collectors.joining;
import java.io.File;
import java.net.MalformedURLException;
@@ -9,59 +11,77 @@ import java.net.URISyntaxException;
import java.net.URL;
import java.nio.file.Path;
import java.nio.file.Paths;
-import java.util.logging.Logger;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
import org.junit.Assert;
import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
-import dev.langchain4j.chain.ConversationalRetrievalChain;
import dev.langchain4j.data.document.Document;
+import dev.langchain4j.data.document.DocumentSplitter;
import dev.langchain4j.data.document.splitter.DocumentSplitters;
+import dev.langchain4j.data.embedding.Embedding;
+import dev.langchain4j.data.message.AiMessage;
import dev.langchain4j.data.segment.TextSegment;
import dev.langchain4j.model.chat.ChatLanguageModel;
import dev.langchain4j.model.embedding.AllMiniLmL6V2EmbeddingModel;
import dev.langchain4j.model.embedding.EmbeddingModel;
+import dev.langchain4j.model.input.Prompt;
+import dev.langchain4j.model.input.PromptTemplate;
import dev.langchain4j.model.openai.OpenAiChatModel;
-import dev.langchain4j.retriever.EmbeddingStoreRetriever;
+import dev.langchain4j.model.openai.OpenAiTokenizer;
+import dev.langchain4j.store.embedding.EmbeddingMatch;
import dev.langchain4j.store.embedding.EmbeddingStore;
-import dev.langchain4j.store.embedding.EmbeddingStoreIngestor;
import dev.langchain4j.store.embedding.inmemory.InMemoryEmbeddingStore;
public class ChatWithDocumentLiveTest {
+
+ Logger logger = LoggerFactory.getLogger(ChatWithDocumentLiveTest.class);
@Test
- public void givenDocument_whenPrompted_thenValidResponse() {
-
- EmbeddingModel embeddingModel = new AllMiniLmL6V2EmbeddingModel();
-
- EmbeddingStore embeddingStore = new InMemoryEmbeddingStore<>();
-
- EmbeddingStoreIngestor ingestor = EmbeddingStoreIngestor.builder()
- .documentSplitter(DocumentSplitters.recursive(500, 0))
- .embeddingModel(embeddingModel)
- .embeddingStore(embeddingStore)
- .build();
+ public void givenChainWithDocument_whenPrompted_thenValidResponse() {
Document document = loadDocument(toPath("src/test/resources/example-files/simpson's_adventures.txt"));
- ingestor.ingest(document);
+ DocumentSplitter splitter = DocumentSplitters.recursive(100, 0, new OpenAiTokenizer(GPT_3_5_TURBO));
+ List segments = splitter.split(document);
+ EmbeddingModel embeddingModel = new AllMiniLmL6V2EmbeddingModel();
+ List embeddings = embeddingModel.embedAll(segments)
+ .content();
+ EmbeddingStore embeddingStore = new InMemoryEmbeddingStore<>();
+ embeddingStore.addAll(embeddings, segments);
+
+ String question = "Who is Simpson?";
+ Embedding questionEmbedding = embeddingModel.embed(question)
+ .content();
+ int maxResults = 3;
+ double minScore = 0.7;
+ List> relevantEmbeddings = embeddingStore.findRelevant(questionEmbedding, maxResults, minScore);
+
+ PromptTemplate promptTemplate = PromptTemplate.from("Answer the following question to the best of your ability:\n" + "\n" + "Question:\n" + "{{question}}\n" + "\n" + "Base your answer on the following information:\n" + "{{information}}");
+
+ String information = relevantEmbeddings.stream()
+ .map(match -> match.embedded()
+ .text())
+ .collect(joining("\n\n"));
+
+ Map variables = new HashMap<>();
+ variables.put("question", question);
+ variables.put("information", information);
+
+ Prompt prompt = promptTemplate.apply(variables);
ChatLanguageModel chatModel = OpenAiChatModel.builder()
- .apiKey(Constants.OPEN_API_KEY)
+ .apiKey(Constants.OPEN_AI_KEY)
.timeout(ofSeconds(60))
.build();
+ AiMessage aiMessage = chatModel.generate(prompt.toUserMessage())
+ .content();
- ConversationalRetrievalChain chain = ConversationalRetrievalChain.builder()
- .chatLanguageModel(chatModel)
- .retriever(EmbeddingStoreRetriever.from(embeddingStore, embeddingModel))
- // .chatMemory() // you can override default chat memory
- // .promptTemplate() // you can override default prompt template
- .build();
-
- String answer = chain.execute("Who is Simpson?");
-
- Logger.getGlobal()
- .info(answer);
- Assert.assertNotNull(answer);
+ logger.info(aiMessage.text());
+ Assert.assertNotNull(aiMessage.text());
}
diff --git a/libraries-llms/src/test/java/com/baeldung/langchain/ChatWithMemoryLiveTest.java b/libraries-llms/src/test/java/com/baeldung/langchain/ChatWithMemoryLiveTest.java
index 5e0057d23c..8f7dcca1cb 100644
--- a/libraries-llms/src/test/java/com/baeldung/langchain/ChatWithMemoryLiveTest.java
+++ b/libraries-llms/src/test/java/com/baeldung/langchain/ChatWithMemoryLiveTest.java
@@ -9,35 +9,35 @@ import dev.langchain4j.model.openai.OpenAiTokenizer;
import static dev.langchain4j.data.message.UserMessage.userMessage;
import static dev.langchain4j.model.openai.OpenAiModelName.GPT_3_5_TURBO;
-
-import java.util.logging.Logger;
+import static org.assertj.core.api.Assertions.assertThat;
import org.junit.Assert;
import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
public class ChatWithMemoryLiveTest {
+
+ Logger logger = LoggerFactory.getLogger(ChatWithMemoryLiveTest.class);
@Test
public void givenMemory_whenPrompted_thenValidResponse() {
- ChatLanguageModel model = OpenAiChatModel.withApiKey(Constants.OPEN_API_KEY);
+ ChatLanguageModel model = OpenAiChatModel.withApiKey(Constants.OPEN_AI_KEY);
ChatMemory chatMemory = TokenWindowChatMemory.withMaxTokens(300, new OpenAiTokenizer(GPT_3_5_TURBO));
chatMemory.add(userMessage("Hello, my name is Kumar"));
AiMessage answer = model.generate(chatMemory.messages())
.content();
- Logger.getGlobal()
- .info(answer.text());
+ logger.info(answer.text());
Assert.assertNotNull(answer.text());
chatMemory.add(answer);
chatMemory.add(userMessage("What is my name?"));
AiMessage answerWithName = model.generate(chatMemory.messages())
.content();
- Logger.getGlobal()
- .info(answerWithName.text());
- Assert.assertTrue(answerWithName.text()
- .contains("Kumar"));
+ logger.info(answerWithName.text());
+ assertThat(answerWithName.text().contains("Kumar"));
chatMemory.add(answerWithName);
}
diff --git a/libraries-llms/src/test/java/com/baeldung/langchain/Constants.java b/libraries-llms/src/test/java/com/baeldung/langchain/Constants.java
index 15645ce68e..149858f351 100644
--- a/libraries-llms/src/test/java/com/baeldung/langchain/Constants.java
+++ b/libraries-llms/src/test/java/com/baeldung/langchain/Constants.java
@@ -2,6 +2,11 @@ package com.baeldung.langchain;
public class Constants {
- public static String OPEN_API_KEY = "demo";
+ /**
+ * A limited access key for access to OpenAI language models can be generated by first
+ * registering for free at (https://platform.openai.com/signup) and then by navigating
+ * to "Create new secret key" page at (https://platform.openai.com/account/api-keys).
+ */
+ public static String OPEN_AI_KEY = "";
}
diff --git a/libraries-llms/src/test/java/com/baeldung/langchain/PromptTemplatesLiveTest.java b/libraries-llms/src/test/java/com/baeldung/langchain/PromptTemplatesLiveTest.java
index 5f155d3dba..31698ee0c7 100644
--- a/libraries-llms/src/test/java/com/baeldung/langchain/PromptTemplatesLiveTest.java
+++ b/libraries-llms/src/test/java/com/baeldung/langchain/PromptTemplatesLiveTest.java
@@ -4,9 +4,10 @@ import static dev.langchain4j.model.openai.OpenAiModelName.GPT_3_5_TURBO;
import java.util.HashMap;
import java.util.Map;
-import java.util.logging.Logger;
import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import dev.langchain4j.model.chat.ChatLanguageModel;
import dev.langchain4j.model.input.Prompt;
@@ -16,6 +17,8 @@ import dev.langchain4j.model.openai.OpenAiChatModel;
import org.junit.Assert;
public class PromptTemplatesLiveTest {
+
+ Logger logger = LoggerFactory.getLogger(PromptTemplatesLiveTest.class);
@Test
public void givenPromptTemplate_whenSuppliedInput_thenValidResponse() {
@@ -27,14 +30,13 @@ public class PromptTemplatesLiveTest {
Prompt prompt = promptTemplate.apply(variables);
ChatLanguageModel model = OpenAiChatModel.builder()
- .apiKey(Constants.OPEN_API_KEY)
+ .apiKey(Constants.OPEN_AI_KEY)
.modelName(GPT_3_5_TURBO)
.temperature(0.3)
.build();
String response = model.generate(prompt.text());
- Logger.getGlobal()
- .info(response);
+ logger.info(response);
Assert.assertNotNull(response);
}
diff --git a/libraries-llms/src/test/java/com/baeldung/langchain/ServiceWithToolsLiveTest.java b/libraries-llms/src/test/java/com/baeldung/langchain/ServiceWithToolsLiveTest.java
index 024c1523e8..6a6144aa21 100644
--- a/libraries-llms/src/test/java/com/baeldung/langchain/ServiceWithToolsLiveTest.java
+++ b/libraries-llms/src/test/java/com/baeldung/langchain/ServiceWithToolsLiveTest.java
@@ -1,9 +1,11 @@
package com.baeldung.langchain;
-import java.util.logging.Logger;
+import static org.assertj.core.api.Assertions.assertThat;
import org.junit.Assert;
import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import dev.langchain4j.agent.tool.Tool;
import dev.langchain4j.memory.chat.MessageWindowChatMemory;
@@ -11,6 +13,8 @@ import dev.langchain4j.model.openai.OpenAiChatModel;
import dev.langchain4j.service.AiServices;
public class ServiceWithToolsLiveTest {
+
+ Logger logger = LoggerFactory.getLogger(ServiceWithToolsLiveTest.class);
static class Calculator {
@@ -35,7 +39,7 @@ public class ServiceWithToolsLiveTest {
public void givenServiceWithTools_whenPrompted_thenValidResponse() {
Assistant assistant = AiServices.builder(Assistant.class)
- .chatLanguageModel(OpenAiChatModel.withApiKey(Constants.OPEN_API_KEY))
+ .chatLanguageModel(OpenAiChatModel.withApiKey(Constants.OPEN_AI_KEY))
.tools(new Calculator())
.chatMemory(MessageWindowChatMemory.withMaxMessages(10))
.build();
@@ -43,9 +47,8 @@ public class ServiceWithToolsLiveTest {
String question = "What is the sum of the numbers of letters in the words \"language\" and \"model\"?";
String answer = assistant.chat(question);
- Logger.getGlobal()
- .info(answer);
- Assert.assertNotNull(answer);
+ logger.info(answer);
+ assertThat(answer).contains("13");
}
diff --git a/pom.xml b/pom.xml
index a391a1c774..cc433f0946 100644
--- a/pom.xml
+++ b/pom.xml
@@ -936,7 +936,7 @@
spring-di-4
spring-kafka-2
- libraries-llms
+ libraries-llms
@@ -1224,7 +1224,7 @@
spring-di-4
spring-kafka-2
- libraries-llms
+ libraries-llms