Skip to content

Commit 03c9dce

Browse files
author
CHANDRAKANT Kumar
committed
Incorporated some review comments on the code.
1 parent c36a6cc commit 03c9dce

8 files changed

Lines changed: 107 additions & 107 deletions

File tree

libraries-llms/src/main/resources/logback.xml

Lines changed: 0 additions & 17 deletions
This file was deleted.

libraries-llms/src/test/java/com/baeldung/langchain/ChainWithDocumentLiveTest.java

Lines changed: 30 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,85 +1,72 @@
11
package com.baeldung.langchain;
22

33
import static dev.langchain4j.data.document.FileSystemDocumentLoader.loadDocument;
4-
import static dev.langchain4j.model.openai.OpenAiModelName.GPT_3_5_TURBO;
54
import static java.time.Duration.ofSeconds;
6-
import static java.util.stream.Collectors.joining;
75

86
import java.io.File;
97
import java.net.MalformedURLException;
108
import java.net.URISyntaxException;
119
import java.net.URL;
1210
import java.nio.file.Path;
1311
import java.nio.file.Paths;
14-
import java.util.HashMap;
15-
import java.util.List;
16-
import java.util.Map;
17-
import java.util.logging.Logger;
1812

1913
import org.junit.Assert;
2014
import org.junit.Test;
15+
import org.slf4j.Logger;
16+
import org.slf4j.LoggerFactory;
2117

18+
import dev.langchain4j.chain.ConversationalRetrievalChain;
2219
import dev.langchain4j.data.document.Document;
23-
import dev.langchain4j.data.document.DocumentSplitter;
2420
import dev.langchain4j.data.document.splitter.DocumentSplitters;
25-
import dev.langchain4j.data.embedding.Embedding;
26-
import dev.langchain4j.data.message.AiMessage;
2721
import dev.langchain4j.data.segment.TextSegment;
22+
import dev.langchain4j.memory.chat.MessageWindowChatMemory;
2823
import dev.langchain4j.model.chat.ChatLanguageModel;
2924
import dev.langchain4j.model.embedding.AllMiniLmL6V2EmbeddingModel;
3025
import dev.langchain4j.model.embedding.EmbeddingModel;
31-
import dev.langchain4j.model.input.Prompt;
3226
import dev.langchain4j.model.input.PromptTemplate;
3327
import dev.langchain4j.model.openai.OpenAiChatModel;
34-
import dev.langchain4j.model.openai.OpenAiTokenizer;
35-
import dev.langchain4j.store.embedding.EmbeddingMatch;
28+
import dev.langchain4j.retriever.EmbeddingStoreRetriever;
3629
import dev.langchain4j.store.embedding.EmbeddingStore;
30+
import dev.langchain4j.store.embedding.EmbeddingStoreIngestor;
3731
import dev.langchain4j.store.embedding.inmemory.InMemoryEmbeddingStore;
3832

3933
public class ChainWithDocumentLiveTest {
34+
35+
Logger logger = LoggerFactory.getLogger(ChainWithDocumentLiveTest.class);
4036

4137
@Test
42-
public void givenChainWithDocument_whenPrompted_thenValidResponse() {
43-
44-
Document document = loadDocument(toPath("src/test/resources/example-files/simpson's_adventures.txt"));
45-
DocumentSplitter splitter = DocumentSplitters.recursive(100, 0, new OpenAiTokenizer(GPT_3_5_TURBO));
46-
List<TextSegment> segments = splitter.split(document);
38+
public void givenDocument_whenPrompted_thenValidResponse() {
4739

4840
EmbeddingModel embeddingModel = new AllMiniLmL6V2EmbeddingModel();
49-
List<Embedding> embeddings = embeddingModel.embedAll(segments)
50-
.content();
51-
EmbeddingStore<TextSegment> embeddingStore = new InMemoryEmbeddingStore<>();
52-
embeddingStore.addAll(embeddings, segments);
5341

54-
String question = "Who is Simpson?";
55-
Embedding questionEmbedding = embeddingModel.embed(question)
56-
.content();
57-
int maxResults = 3;
58-
double minScore = 0.7;
59-
List<EmbeddingMatch<TextSegment>> relevantEmbeddings = embeddingStore.findRelevant(questionEmbedding, maxResults, minScore);
60-
61-
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}}");
42+
EmbeddingStore<TextSegment> embeddingStore = new InMemoryEmbeddingStore<>();
6243

63-
String information = relevantEmbeddings.stream()
64-
.map(match -> match.embedded()
65-
.text())
66-
.collect(joining("\n\n"));
44+
EmbeddingStoreIngestor ingestor = EmbeddingStoreIngestor.builder()
45+
.documentSplitter(DocumentSplitters.recursive(500, 0))
46+
.embeddingModel(embeddingModel)
47+
.embeddingStore(embeddingStore)
48+
.build();
6749

68-
Map<String, Object> variables = new HashMap<>();
69-
variables.put("question", question);
70-
variables.put("information", information);
50+
Document document = loadDocument(toPath("src/test/resources/example-files/simpson's_adventures.txt"));
51+
ingestor.ingest(document);
7152

72-
Prompt prompt = promptTemplate.apply(variables);
7353
ChatLanguageModel chatModel = OpenAiChatModel.builder()
74-
.apiKey(Constants.OPEN_API_KEY)
54+
.apiKey(Constants.OPEN_AI_KEY)
7555
.timeout(ofSeconds(60))
7656
.build();
77-
AiMessage aiMessage = chatModel.generate(prompt.toUserMessage())
78-
.content();
7957

80-
Logger.getGlobal()
81-
.info(aiMessage.text());
82-
Assert.assertNotNull(aiMessage.text());
58+
ConversationalRetrievalChain chain = ConversationalRetrievalChain.builder()
59+
.chatLanguageModel(chatModel)
60+
.retriever(EmbeddingStoreRetriever.from(embeddingStore, embeddingModel))
61+
.chatMemory(MessageWindowChatMemory.withMaxMessages(10))
62+
.promptTemplate(PromptTemplate
63+
.from("Answer the following question to the best of your ability: {{question}}\n\nBase your answer on the following information:\n{{information}}"))
64+
.build();
65+
66+
String answer = chain.execute("Who is Simpson?");
67+
68+
logger.info(answer);
69+
Assert.assertNotNull(answer);
8370

8471
}
8572

libraries-llms/src/test/java/com/baeldung/langchain/ChatWithDocumentLiveTest.java

Lines changed: 46 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,67 +1,87 @@
11
package com.baeldung.langchain;
22

33
import static dev.langchain4j.data.document.FileSystemDocumentLoader.loadDocument;
4+
import static dev.langchain4j.model.openai.OpenAiModelName.GPT_3_5_TURBO;
45
import static java.time.Duration.ofSeconds;
6+
import static java.util.stream.Collectors.joining;
57

68
import java.io.File;
79
import java.net.MalformedURLException;
810
import java.net.URISyntaxException;
911
import java.net.URL;
1012
import java.nio.file.Path;
1113
import java.nio.file.Paths;
12-
import java.util.logging.Logger;
14+
import java.util.HashMap;
15+
import java.util.List;
16+
import java.util.Map;
1317

1418
import org.junit.Assert;
1519
import org.junit.Test;
20+
import org.slf4j.Logger;
21+
import org.slf4j.LoggerFactory;
1622

17-
import dev.langchain4j.chain.ConversationalRetrievalChain;
1823
import dev.langchain4j.data.document.Document;
24+
import dev.langchain4j.data.document.DocumentSplitter;
1925
import dev.langchain4j.data.document.splitter.DocumentSplitters;
26+
import dev.langchain4j.data.embedding.Embedding;
27+
import dev.langchain4j.data.message.AiMessage;
2028
import dev.langchain4j.data.segment.TextSegment;
2129
import dev.langchain4j.model.chat.ChatLanguageModel;
2230
import dev.langchain4j.model.embedding.AllMiniLmL6V2EmbeddingModel;
2331
import dev.langchain4j.model.embedding.EmbeddingModel;
32+
import dev.langchain4j.model.input.Prompt;
33+
import dev.langchain4j.model.input.PromptTemplate;
2434
import dev.langchain4j.model.openai.OpenAiChatModel;
25-
import dev.langchain4j.retriever.EmbeddingStoreRetriever;
35+
import dev.langchain4j.model.openai.OpenAiTokenizer;
36+
import dev.langchain4j.store.embedding.EmbeddingMatch;
2637
import dev.langchain4j.store.embedding.EmbeddingStore;
27-
import dev.langchain4j.store.embedding.EmbeddingStoreIngestor;
2838
import dev.langchain4j.store.embedding.inmemory.InMemoryEmbeddingStore;
2939

3040
public class ChatWithDocumentLiveTest {
41+
42+
Logger logger = LoggerFactory.getLogger(ChatWithDocumentLiveTest.class);
3143

3244
@Test
33-
public void givenDocument_whenPrompted_thenValidResponse() {
45+
public void givenChainWithDocument_whenPrompted_thenValidResponse() {
3446

35-
EmbeddingModel embeddingModel = new AllMiniLmL6V2EmbeddingModel();
47+
Document document = loadDocument(toPath("src/test/resources/example-files/simpson's_adventures.txt"));
48+
DocumentSplitter splitter = DocumentSplitters.recursive(100, 0, new OpenAiTokenizer(GPT_3_5_TURBO));
49+
List<TextSegment> segments = splitter.split(document);
3650

51+
EmbeddingModel embeddingModel = new AllMiniLmL6V2EmbeddingModel();
52+
List<Embedding> embeddings = embeddingModel.embedAll(segments)
53+
.content();
3754
EmbeddingStore<TextSegment> embeddingStore = new InMemoryEmbeddingStore<>();
55+
embeddingStore.addAll(embeddings, segments);
3856

39-
EmbeddingStoreIngestor ingestor = EmbeddingStoreIngestor.builder()
40-
.documentSplitter(DocumentSplitters.recursive(500, 0))
41-
.embeddingModel(embeddingModel)
42-
.embeddingStore(embeddingStore)
43-
.build();
57+
String question = "Who is Simpson?";
58+
Embedding questionEmbedding = embeddingModel.embed(question)
59+
.content();
60+
int maxResults = 3;
61+
double minScore = 0.7;
62+
List<EmbeddingMatch<TextSegment>> relevantEmbeddings = embeddingStore.findRelevant(questionEmbedding, maxResults, minScore);
4463

45-
Document document = loadDocument(toPath("src/test/resources/example-files/simpson's_adventures.txt"));
46-
ingestor.ingest(document);
64+
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}}");
4765

66+
String information = relevantEmbeddings.stream()
67+
.map(match -> match.embedded()
68+
.text())
69+
.collect(joining("\n\n"));
70+
71+
Map<String, Object> variables = new HashMap<>();
72+
variables.put("question", question);
73+
variables.put("information", information);
74+
75+
Prompt prompt = promptTemplate.apply(variables);
4876
ChatLanguageModel chatModel = OpenAiChatModel.builder()
49-
.apiKey(Constants.OPEN_API_KEY)
77+
.apiKey(Constants.OPEN_AI_KEY)
5078
.timeout(ofSeconds(60))
5179
.build();
80+
AiMessage aiMessage = chatModel.generate(prompt.toUserMessage())
81+
.content();
5282

53-
ConversationalRetrievalChain chain = ConversationalRetrievalChain.builder()
54-
.chatLanguageModel(chatModel)
55-
.retriever(EmbeddingStoreRetriever.from(embeddingStore, embeddingModel))
56-
// .chatMemory() // you can override default chat memory
57-
// .promptTemplate() // you can override default prompt template
58-
.build();
59-
60-
String answer = chain.execute("Who is Simpson?");
61-
62-
Logger.getGlobal()
63-
.info(answer);
64-
Assert.assertNotNull(answer);
83+
logger.info(aiMessage.text());
84+
Assert.assertNotNull(aiMessage.text());
6585

6686
}
6787

libraries-llms/src/test/java/com/baeldung/langchain/ChatWithMemoryLiveTest.java

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,35 +9,35 @@
99

1010
import static dev.langchain4j.data.message.UserMessage.userMessage;
1111
import static dev.langchain4j.model.openai.OpenAiModelName.GPT_3_5_TURBO;
12-
13-
import java.util.logging.Logger;
12+
import static org.assertj.core.api.Assertions.assertThat;
1413

1514
import org.junit.Assert;
1615
import org.junit.Test;
16+
import org.slf4j.Logger;
17+
import org.slf4j.LoggerFactory;
1718

1819
public class ChatWithMemoryLiveTest {
20+
21+
Logger logger = LoggerFactory.getLogger(ChatWithMemoryLiveTest.class);
1922

2023
@Test
2124
public void givenMemory_whenPrompted_thenValidResponse() {
2225

23-
ChatLanguageModel model = OpenAiChatModel.withApiKey(Constants.OPEN_API_KEY);
26+
ChatLanguageModel model = OpenAiChatModel.withApiKey(Constants.OPEN_AI_KEY);
2427
ChatMemory chatMemory = TokenWindowChatMemory.withMaxTokens(300, new OpenAiTokenizer(GPT_3_5_TURBO));
2528

2629
chatMemory.add(userMessage("Hello, my name is Kumar"));
2730
AiMessage answer = model.generate(chatMemory.messages())
2831
.content();
29-
Logger.getGlobal()
30-
.info(answer.text());
32+
logger.info(answer.text());
3133
Assert.assertNotNull(answer.text());
3234
chatMemory.add(answer);
3335

3436
chatMemory.add(userMessage("What is my name?"));
3537
AiMessage answerWithName = model.generate(chatMemory.messages())
3638
.content();
37-
Logger.getGlobal()
38-
.info(answerWithName.text());
39-
Assert.assertTrue(answerWithName.text()
40-
.contains("Kumar"));
39+
logger.info(answerWithName.text());
40+
assertThat(answerWithName.text().contains("Kumar"));
4141
chatMemory.add(answerWithName);
4242

4343
}

libraries-llms/src/test/java/com/baeldung/langchain/Constants.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,11 @@
22

33
public class Constants {
44

5-
public static String OPEN_API_KEY = "demo";
5+
/**
6+
* A limited access key for access to OpenAI language models can be generated by first
7+
* registering for free at (https://platform.openai.com/signup) and then by navigating
8+
* to "Create new secret key" page at (https://platform.openai.com/account/api-keys).
9+
*/
10+
public static String OPEN_AI_KEY = "<OPEN_AI_KEY>";
611

712
}

libraries-llms/src/test/java/com/baeldung/langchain/PromptTemplatesLiveTest.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,10 @@
44

55
import java.util.HashMap;
66
import java.util.Map;
7-
import java.util.logging.Logger;
87

98
import org.junit.Test;
9+
import org.slf4j.Logger;
10+
import org.slf4j.LoggerFactory;
1011

1112
import dev.langchain4j.model.chat.ChatLanguageModel;
1213
import dev.langchain4j.model.input.Prompt;
@@ -16,6 +17,8 @@
1617
import org.junit.Assert;
1718

1819
public class PromptTemplatesLiveTest {
20+
21+
Logger logger = LoggerFactory.getLogger(PromptTemplatesLiveTest.class);
1922

2023
@Test
2124
public void givenPromptTemplate_whenSuppliedInput_thenValidResponse() {
@@ -27,14 +30,13 @@ public void givenPromptTemplate_whenSuppliedInput_thenValidResponse() {
2730
Prompt prompt = promptTemplate.apply(variables);
2831

2932
ChatLanguageModel model = OpenAiChatModel.builder()
30-
.apiKey(Constants.OPEN_API_KEY)
33+
.apiKey(Constants.OPEN_AI_KEY)
3134
.modelName(GPT_3_5_TURBO)
3235
.temperature(0.3)
3336
.build();
3437

3538
String response = model.generate(prompt.text());
36-
Logger.getGlobal()
37-
.info(response);
39+
logger.info(response);
3840
Assert.assertNotNull(response);
3941

4042
}

libraries-llms/src/test/java/com/baeldung/langchain/ServiceWithToolsLiveTest.java

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,20 @@
11
package com.baeldung.langchain;
22

3-
import java.util.logging.Logger;
3+
import static org.assertj.core.api.Assertions.assertThat;
44

55
import org.junit.Assert;
66
import org.junit.Test;
7+
import org.slf4j.Logger;
8+
import org.slf4j.LoggerFactory;
79

810
import dev.langchain4j.agent.tool.Tool;
911
import dev.langchain4j.memory.chat.MessageWindowChatMemory;
1012
import dev.langchain4j.model.openai.OpenAiChatModel;
1113
import dev.langchain4j.service.AiServices;
1214

1315
public class ServiceWithToolsLiveTest {
16+
17+
Logger logger = LoggerFactory.getLogger(ServiceWithToolsLiveTest.class);
1418

1519
static class Calculator {
1620

@@ -35,17 +39,16 @@ interface Assistant {
3539
public void givenServiceWithTools_whenPrompted_thenValidResponse() {
3640

3741
Assistant assistant = AiServices.builder(Assistant.class)
38-
.chatLanguageModel(OpenAiChatModel.withApiKey(Constants.OPEN_API_KEY))
42+
.chatLanguageModel(OpenAiChatModel.withApiKey(Constants.OPEN_AI_KEY))
3943
.tools(new Calculator())
4044
.chatMemory(MessageWindowChatMemory.withMaxMessages(10))
4145
.build();
4246

4347
String question = "What is the sum of the numbers of letters in the words \"language\" and \"model\"?";
4448
String answer = assistant.chat(question);
4549

46-
Logger.getGlobal()
47-
.info(answer);
48-
Assert.assertNotNull(answer);
50+
logger.info(answer);
51+
assertThat(answer).contains("13");
4952

5053
}
5154

0 commit comments

Comments
 (0)