Skip to content

Commit a554036

Browse files
agoncalsinedied
authored andcommitted
Adds Qdant search
1 parent 925de80 commit a554036

File tree

3 files changed

+85
-16
lines changed

3 files changed

+85
-16
lines changed

src/backend-java-quarkus/pom.xml

+35-10
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
<quarkiverse.quinoa.version>2.3.5</quarkiverse.quinoa.version>
2121
<skipITs>true</skipITs>
2222
<surefire-plugin.version>3.2.5</surefire-plugin.version>
23+
<langchain4j.version>0.28.0</langchain4j.version>
2324
</properties>
2425
<dependencyManagement>
2526
<dependencies>
@@ -30,14 +31,16 @@
3031
<type>pom</type>
3132
<scope>import</scope>
3233
</dependency>
34+
<dependency>
35+
<groupId>dev.langchain4j</groupId>
36+
<artifactId>langchain4j-bom</artifactId>
37+
<version>${langchain4j.version}</version>
38+
<type>pom</type>
39+
<scope>import</scope>
40+
</dependency>
3341
</dependencies>
3442
</dependencyManagement>
3543
<dependencies>
36-
<dependency>
37-
<groupId>io.quarkiverse.langchain4j</groupId>
38-
<artifactId>quarkus-langchain4j-core</artifactId>
39-
<version>${quarkiverse.langchain4j.version}</version>
40-
</dependency>
4144
<dependency>
4245
<groupId>io.quarkus</groupId>
4346
<artifactId>quarkus-resteasy-reactive</artifactId>
@@ -50,15 +53,37 @@
5053
<groupId>io.quarkus</groupId>
5154
<artifactId>quarkus-smallrye-openapi</artifactId>
5255
</dependency>
53-
<dependency>
54-
<groupId>io.quarkiverse.langchain4j</groupId>
55-
<artifactId>quarkus-langchain4j-azure-openai</artifactId>
56-
<version>0.8.0</version>
57-
</dependency>
5856
<dependency>
5957
<groupId>io.quarkus</groupId>
6058
<artifactId>quarkus-arc</artifactId>
6159
</dependency>
60+
<dependency>
61+
<groupId>dev.langchain4j</groupId>
62+
<artifactId>langchain4j</artifactId>
63+
</dependency>
64+
<dependency>
65+
<groupId>dev.langchain4j</groupId>
66+
<artifactId>langchain4j-open-ai</artifactId>
67+
</dependency>
68+
<dependency>
69+
<groupId>dev.langchain4j</groupId>
70+
<artifactId>langchain4j-qdrant</artifactId>
71+
</dependency>
72+
<dependency>
73+
<groupId>dev.langchain4j</groupId>
74+
<artifactId>langchain4j-embeddings-all-minilm-l6-v2</artifactId>
75+
<version>${langchain4j.version}</version>
76+
</dependency>
77+
<dependency>
78+
<groupId>org.tinylog</groupId>
79+
<artifactId>tinylog-impl</artifactId>
80+
<version>2.6.2</version>
81+
</dependency>
82+
<dependency>
83+
<groupId>org.tinylog</groupId>
84+
<artifactId>slf4j-tinylog</artifactId>
85+
<version>2.6.2</version>
86+
</dependency>
6287
<dependency>
6388
<groupId>io.quarkus</groupId>
6489
<artifactId>quarkus-junit5</artifactId>
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,67 @@
11
package ai.azure.openai.rag.workshop.backend;
22

3+
import dev.langchain4j.data.embedding.Embedding;
4+
import dev.langchain4j.data.message.AiMessage;
5+
import dev.langchain4j.data.message.ChatMessage;
6+
import dev.langchain4j.data.message.SystemMessage;
7+
import dev.langchain4j.data.message.UserMessage;
8+
import dev.langchain4j.data.segment.TextSegment;
39
import dev.langchain4j.model.chat.ChatLanguageModel;
10+
import dev.langchain4j.model.embedding.AllMiniLmL6V2EmbeddingModel;
11+
import dev.langchain4j.model.embedding.EmbeddingModel;
412
import dev.langchain4j.model.openai.OpenAiChatModel;
513
import dev.langchain4j.model.openai.OpenAiModelName;
14+
import dev.langchain4j.store.embedding.EmbeddingMatch;
15+
import dev.langchain4j.store.embedding.EmbeddingStore;
16+
import dev.langchain4j.store.embedding.qdrant.QdrantEmbeddingStore;
617
import jakarta.ws.rs.Consumes;
718
import jakarta.ws.rs.POST;
819
import jakarta.ws.rs.Path;
920
import jakarta.ws.rs.Produces;
10-
import jakarta.ws.rs.core.Response;
21+
import dev.langchain4j.model.output.Response;
1122
import static java.time.Duration.ofSeconds;
23+
import org.slf4j.Logger;
24+
import org.slf4j.LoggerFactory;
25+
26+
import java.util.ArrayList;
27+
import java.util.List;
1228

1329
@Path("/chat")
1430
public class ChatResource {
1531

32+
private static final Logger log = LoggerFactory.getLogger(ChatResource.class);
33+
1634
@POST
1735
@Consumes({"application/json"})
1836
@Produces({"application/json"})
19-
public Response chat(ChatRequest chatRequest) {
37+
public String chat(ChatRequest chatRequest) {
38+
39+
String question = chatRequest.messages.get(0).content;
40+
41+
log.info("### Embed the question (convert the question into vectors that represent the meaning) using embeddedQuestion model");
42+
EmbeddingModel embeddingModel = new AllMiniLmL6V2EmbeddingModel();
43+
Embedding embeddedQuestion = embeddingModel.embed(question).content();
44+
log.debug("Vector length: {}", embeddedQuestion.vector().length);
45+
46+
log.info("### Find relevant embeddings from Qdrant based on the question");
47+
EmbeddingStore<TextSegment> qdrantEmbeddingStore = QdrantEmbeddingStore.builder()
48+
.collectionName("rag-workshop-collection")
49+
.host("localhost")
50+
.port(6334)
51+
.build();
52+
53+
List<EmbeddingMatch<TextSegment>> relevant = qdrantEmbeddingStore.findRelevant(embeddedQuestion, 3);
54+
55+
log.info("### Builds chat history using the relevant embeddings");
56+
List<ChatMessage> chatMessages = new ArrayList<>();
57+
for (int i = 0; i < relevant.size(); i++) {
58+
EmbeddingMatch<TextSegment> textSegmentEmbeddingMatch = relevant.get(i);
59+
chatMessages.add(SystemMessage.from(textSegmentEmbeddingMatch.embedded().text()));
60+
log.debug("Relevant segment {}: {}", i, textSegmentEmbeddingMatch.embedded().text());
61+
}
62+
63+
log.info("### Invoke the LLM");
64+
chatMessages.add(UserMessage.from(question));
2065

2166
ChatLanguageModel model = OpenAiChatModel.builder()
2267
.apiKey(System.getenv("OPENAI_API_KEY"))
@@ -27,9 +72,8 @@ public Response chat(ChatRequest chatRequest) {
2772
.logResponses(true)
2873
.build();
2974

30-
String response = model.generate(chatRequest.messages.get(0).content);
31-
32-
return Response.ok().entity(response).build();
75+
Response<AiMessage> response = model.generate(chatMessages);
3376

77+
return response.content().text();
3478
}
3579
}

src/ingestion-java/pom.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
<maven.compiler.release>17</maven.compiler.release>
1414
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
1515
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
16-
<langchain4j.version>0.27.1</langchain4j.version>
16+
<langchain4j.version>0.28.0</langchain4j.version>
1717
</properties>
1818
<dependencyManagement>
1919
<dependencies>

0 commit comments

Comments
 (0)