Zero-configuration RAG package that bundles document parsing, embedding, and splitting for easy Retrieval-Augmented Generation in Java applications
—
Quality
Pending
Does it follow best practices?
Impact
Pending
No eval scenarios have been run
Types for chat models and AI services used in RAG applications.
Interface for chat/completion models.
package dev.langchain4j.model.chat;
public interface ChatModel {
// Main chat API
default ChatResponse chat(ChatRequest chatRequest)
// Convenience methods
default String chat(String userMessage)
default ChatResponse chat(ChatMessage... messages)
default ChatResponse chat(List<ChatMessage> messages)
// Configuration
default ChatRequestParameters defaultRequestParameters()
default Set<Capability> supportedCapabilities()
}Main Method:
chat(chatRequest) - Send chat request, get full responseConvenience Methods:
chat(userMessage) - Quick string-in, string-outchat(messages...) - Chat with message arraychat(messageList) - Chat with message listConfiguration:
defaultRequestParameters() - Get default parameterssupportedCapabilities() - Get model capabilitiesExample:
import dev.langchain4j.model.chat.ChatModel;
import dev.langchain4j.model.openai.OpenAiChatModel;
ChatModel model = OpenAiChatModel.builder()
.apiKey(System.getenv("OPENAI_API_KEY"))
.modelName("gpt-4o-mini")
.build();
// Simple usage
String response = model.chat("What is RAG?");
// With RAG - use via AiServices
Assistant assistant = AiServices.builder(Assistant.class)
.chatModel(model)
.contentRetriever(retriever)
.build();OpenAI implementation of ChatModel.
package dev.langchain4j.model.openai;
public class OpenAiChatModel implements ChatModel {
// Static builder method
public static OpenAiChatModelBuilder builder()
// Builder class
public static class OpenAiChatModelBuilder {
// Essential configuration
public OpenAiChatModelBuilder apiKey(String apiKey)
public OpenAiChatModelBuilder modelName(String modelName)
public OpenAiChatModelBuilder baseUrl(String baseUrl)
public OpenAiChatModelBuilder organizationId(String organizationId)
// Request parameters
public OpenAiChatModelBuilder temperature(Double temperature)
public OpenAiChatModelBuilder maxTokens(Integer maxTokens)
public OpenAiChatModelBuilder topP(Double topP)
public OpenAiChatModelBuilder timeout(Duration timeout)
// Build
public OpenAiChatModel build()
}
}Essential Configuration:
apiKey(key) - OpenAI API key (required)modelName(name) - Model to use (e.g., "gpt-4o-mini")baseUrl(url) - Custom API endpointorganizationId(id) - OpenAI organization IDParameters:
temperature(temp) - Randomness 0.0-2.0 (default: 0.7)maxTokens(tokens) - Max response tokenstopP(p) - Nucleus sampling parametertimeout(duration) - Request timeoutExample:
import dev.langchain4j.model.openai.OpenAiChatModel;
import java.time.Duration;
ChatModel model = OpenAiChatModel.builder()
.apiKey(System.getenv("OPENAI_API_KEY"))
.modelName("gpt-4o-mini")
.temperature(0.7)
.maxTokens(500)
.timeout(Duration.ofSeconds(30))
.build();Interface for embedding models.
package dev.langchain4j.model.embedding;
public interface EmbeddingModel {
// Embed single text
default Response<Embedding> embed(String text)
default Response<Embedding> embed(TextSegment textSegment)
// Embed multiple (primary method)
Response<List<Embedding>> embedAll(List<TextSegment> textSegments)
// Model info
default int dimension()
default String modelName()
}Single Embedding:
embed(text) - Embed stringembed(textSegment) - Embed text segmentBatch Embedding:
embedAll(textSegments) - Embed multiple segments (more efficient)Model Info:
dimension() - Embedding vector dimensionmodelName() - Model identifierNote: When using easy-rag, BGE-small-en-v1.5 is automatically provided via SPI.
Example:
import dev.langchain4j.model.embedding.EmbeddingModel;
import dev.langchain4j.data.embedding.Embedding;
import dev.langchain4j.model.output.Response;
// With easy-rag, model loaded automatically
// Or use explicit model
EmbeddingModel model = new BgeSmallEnV15QuantizedEmbeddingModel();
// Embed single text
Response<Embedding> response = model.embed("Some text");
Embedding embedding = response.content();
// Embed multiple
List<TextSegment> segments = Arrays.asList(
TextSegment.from("Text 1"),
TextSegment.from("Text 2")
);
Response<List<Embedding>> batchResponse = model.embedAll(segments);Generic response wrapper for model outputs.
package dev.langchain4j.model.output;
public class Response<T> {
// Constructors
public Response(T content)
public Response(T content, TokenUsage tokenUsage, FinishReason finishReason)
public Response(T content, TokenUsage tokenUsage, FinishReason finishReason, Map<String, Object> metadata)
// Static factory methods
public static <T> Response<T> from(T content)
public static <T> Response<T> from(T content, TokenUsage tokenUsage)
public static <T> Response<T> from(T content, TokenUsage tokenUsage, FinishReason finishReason)
// Instance methods
public T content()
public TokenUsage tokenUsage()
public FinishReason finishReason()
public Map<String, Object> metadata()
}Type Parameter:
T - Type of content (e.g., Embedding, List<Embedding>, String)Constructors & Factories:
Accessors:
content() - Get the main contenttokenUsage() - Get token usage statisticsfinishReason() - Get completion reasonmetadata() - Get additional metadataExample:
Response<Embedding> response = embeddingModel.embed("text");
Embedding embedding = response.content();
TokenUsage usage = response.tokenUsage();
System.out.println("Used " + usage.inputTokenCount() + " tokens");Base interface for chat messages.
package dev.langchain4j.data.message;
public interface ChatMessage {
ChatMessageType type()
}Method:
type() - Get message typeImplementations:
UserMessage - User inputAiMessage - AI responseSystemMessage - System instructionsToolExecutionResultMessage - Tool resultsEnum for message types.
package dev.langchain4j.data.message;
public enum ChatMessageType {
SYSTEM, // System instructions
USER, // User input
AI, // AI response
TOOL_EXECUTION_RESULT, // Tool execution result
CUSTOM // Custom type
}Values:
SYSTEM - System/instruction messagesUSER - User messagesAI - AI-generated responsesTOOL_EXECUTION_RESULT - Results from tool callsCUSTOM - Custom message typesAI-generated message.
package dev.langchain4j.data.message;
public class AiMessage implements ChatMessage {
// Constructor
public AiMessage(String text)
// Static factory methods
public static AiMessage from(String text)
public static AiMessage aiMessage(String text)
// Methods
public String text()
public ChatMessageType type()
}Constructor & Factories:
Methods:
text() - Get message texttype() - Returns ChatMessageType.AIExample:
AiMessage message = AiMessage.from("This is the AI response");
String text = message.text();Request for chat completion.
package dev.langchain4j.model.chat.request;
public class ChatRequest {
// Static builder
public static Builder builder()
// Accessors
public List<ChatMessage> messages()
public ChatRequestParameters parameters()
public String modelName()
public Double temperature()
public Integer maxOutputTokens()
// Builder
public static class Builder {
public Builder messages(List<ChatMessage> messages)
public Builder messages(ChatMessage... messages)
public Builder parameters(ChatRequestParameters parameters)
public Builder modelName(String modelName)
public Builder temperature(Double temperature)
public Builder maxOutputTokens(Integer maxOutputTokens)
public ChatRequest build()
}
}Builder:
messages(list) - Set conversation messagesmessages(varargs) - Set messages as varargsparameters(params) - Set request parametersmodelName(name) - Override modeltemperature(temp) - Set temperaturemaxOutputTokens(tokens) - Set max tokensAccessors:
Response from chat completion.
package dev.langchain4j.model.chat.response;
public class ChatResponse {
// Static builder
public static Builder builder()
// Accessors
public AiMessage aiMessage()
public TokenUsage tokenUsage()
public FinishReason finishReason()
public String id()
public String modelName()
// Builder
public static class Builder {
public Builder aiMessage(AiMessage aiMessage)
public Builder tokenUsage(TokenUsage tokenUsage)
public Builder finishReason(FinishReason finishReason)
public Builder id(String id)
public Builder modelName(String modelName)
public ChatResponse build()
}
}Accessors:
aiMessage() - Get AI's response messagetokenUsage() - Get token usagefinishReason() - Get why generation stoppedid() - Get response IDmodelName() - Get model usedExample:
ChatResponse response = chatModel.chat(messages);
String responseText = response.aiMessage().text();
TokenUsage usage = response.tokenUsage();
FinishReason reason = response.finishReason();Enum for completion finish reasons.
package dev.langchain4j.model.output;
public enum FinishReason {
STOP, // Completed normally
LENGTH, // Hit token limit
TOOL_EXECUTION, // Needs tool execution
CONTENT_FILTER, // Content filtered
OTHER // Other reason
}Values:
STOP - Model completed naturallyLENGTH - Reached max token limitTOOL_EXECUTION - Tool call neededCONTENT_FILTER - Content policy triggeredOTHER - Other/unknown reasonBuilder for creating AI service interfaces with RAG.
package dev.langchain4j.service;
public class AiServices {
public static <T> AiServicesBuilder<T> builder(Class<T> aiServiceClass)
}Usage:
interface Assistant {
String chat(String userMessage);
}
Assistant assistant = AiServices.builder(Assistant.class)
.chatModel(chatModel)
.contentRetriever(retriever) // Enable RAG
.build();
String answer = assistant.chat("What are the requirements?");Key Features:
contentRetrieverimport dev.langchain4j.data.document.Document;
import dev.langchain4j.data.document.loader.FileSystemDocumentLoader;
import dev.langchain4j.data.segment.TextSegment;
import dev.langchain4j.model.chat.ChatModel;
import dev.langchain4j.model.openai.OpenAiChatModel;
import dev.langchain4j.rag.content.retriever.EmbeddingStoreContentRetriever;
import dev.langchain4j.service.AiServices;
import dev.langchain4j.store.embedding.EmbeddingStore;
import dev.langchain4j.store.embedding.EmbeddingStoreIngestor;
import dev.langchain4j.store.embedding.inmemory.InMemoryEmbeddingStore;
import java.nio.file.Paths;
public class RagAssistant {
interface Assistant {
String chat(String message);
}
public static void main(String[] args) {
// 1. Load and ingest documents
Document doc = FileSystemDocumentLoader.loadDocument(
Paths.get("knowledge-base.pdf")
);
EmbeddingStore<TextSegment> store = new InMemoryEmbeddingStore<>();
EmbeddingStoreIngestor.ingest(doc, store);
// 2. Configure chat model
ChatModel chatModel = OpenAiChatModel.builder()
.apiKey(System.getenv("OPENAI_API_KEY"))
.modelName("gpt-4o-mini")
.temperature(0.7)
.build();
// 3. Create RAG-enabled assistant
Assistant assistant = AiServices.builder(Assistant.class)
.chatModel(chatModel)
.contentRetriever(EmbeddingStoreContentRetriever.from(store))
.build();
// 4. Use assistant
String answer = assistant.chat("What is covered in the knowledge base?");
System.out.println(answer);
}
}Install with Tessl CLI
npx tessl i tessl/maven-dev-langchain4j--langchain4j-easy-rag@1.11.0