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
Creates a content retriever that searches an embedding store for relevant content to answer queries.
import dev.langchain4j.rag.content.retriever.EmbeddingStoreContentRetriever;
public static ContentRetriever from(EmbeddingStore<TextSegment> embeddingStore)Parameters:
embeddingStore - Store containing embedded documentsReturns: ContentRetriever with default settings
Default Configuration:
Example:
ContentRetriever retriever = EmbeddingStoreContentRetriever.from(embeddingStore);
Assistant assistant = AiServices.builder(Assistant.class)
.chatModel(chatModel)
.contentRetriever(retriever)
.build();public EmbeddingStoreContentRetriever(
EmbeddingStore<TextSegment> embeddingStore,
EmbeddingModel embeddingModel
)Creates retriever with defaults (3 max results, 0.0 min score, no filter).
public EmbeddingStoreContentRetriever(
EmbeddingStore<TextSegment> embeddingStore,
EmbeddingModel embeddingModel,
int maxResults
)Creates retriever with custom max results.
public EmbeddingStoreContentRetriever(
EmbeddingStore<TextSegment> embeddingStore,
EmbeddingModel embeddingModel,
Integer maxResults,
Double minScore
)Creates retriever with custom max results and minimum similarity score.
Parameters:
embeddingStore - Store to searchembeddingModel - Model to embed queriesmaxResults - Maximum number of results (default: 3)minScore - Minimum relevance score 0.0-1.0 (default: 0.0)public static EmbeddingStoreContentRetrieverBuilder builder()Returns: Builder for advanced configuration
Example:
ContentRetriever retriever = EmbeddingStoreContentRetriever.builder()
.embeddingStore(store)
.maxResults(5)
.minScore(0.7)
.build();public EmbeddingStoreContentRetrieverBuilder embeddingStore(
EmbeddingStore<TextSegment> embeddingStore
)Sets the embedding store to search. Required.
public EmbeddingStoreContentRetrieverBuilder embeddingModel(
EmbeddingModel embeddingModel
)Sets embedding model for query embedding. Optional - loads from SPI if not provided.
Example:
import dev.langchain4j.model.openai.OpenAiEmbeddingModel;
EmbeddingModel model = OpenAiEmbeddingModel.builder()
.apiKey(apiKey)
.modelName("text-embedding-3-small")
.build();
builder.embeddingModel(model);public EmbeddingStoreContentRetrieverBuilder maxResults(Integer maxResults)Maximum number of results to retrieve. Default: 3.
Example:
builder.maxResults(10); // Return top 10 resultspublic EmbeddingStoreContentRetrieverBuilder minScore(Double minScore)Minimum relevance score threshold (0.0-1.0). Default: 0.0 (no threshold).
Example:
builder.minScore(0.75); // Only return results with score >= 0.75public EmbeddingStoreContentRetrieverBuilder filter(Filter filter)Metadata filter to apply. Default: null (no filtering).
Example:
import static dev.langchain4j.store.embedding.filter.MetadataFilterBuilder.metadataKey;
Filter filter = metadataKey("category").isEqualTo("technical");
builder.filter(filter);public EmbeddingStoreContentRetrieverBuilder displayName(String displayName)Display name for logging/debugging. Default: "Default".
Example:
builder.displayName("ProductDocRetriever");public EmbeddingStoreContentRetrieverBuilder dynamicMaxResults(
Function<Query, Integer> dynamicMaxResults
)Function to determine max results based on query.
Example:
// More results for complex queries
builder.dynamicMaxResults(query -> {
int wordCount = query.text().split("\\s+").length;
return wordCount > 10 ? 10 : 5;
});public EmbeddingStoreContentRetrieverBuilder dynamicMinScore(
Function<Query, Double> dynamicMinScore
)Function to determine min score based on query.
Example:
// Higher threshold for short queries
builder.dynamicMinScore(query -> {
return query.text().length() < 20 ? 0.8 : 0.6;
});public EmbeddingStoreContentRetrieverBuilder dynamicFilter(
Function<Query, Filter> dynamicFilter
)Function to determine filter based on query.
Example:
import static dev.langchain4j.store.embedding.filter.MetadataFilterBuilder.metadataKey;
builder.dynamicFilter(query -> {
if (query.text().contains("technical")) {
return metadataKey("category").isEqualTo("technical");
}
return null; // No filter
});public EmbeddingStoreContentRetriever build()Builds the configured retriever.
Throws: IllegalArgumentException if embeddingStore not set
ContentRetriever retriever = EmbeddingStoreContentRetriever.builder()
.embeddingStore(embeddingStore)
.maxResults(5)
.minScore(0.7)
.build();
Assistant assistant = AiServices.builder(Assistant.class)
.chatModel(chatModel)
.contentRetriever(retriever)
.build();
String answer = assistant.chat("How do I configure the system?");import static dev.langchain4j.store.embedding.filter.MetadataFilterBuilder.metadataKey;
// Only retrieve from specific document types
Filter filter = metadataKey("document_type").isEqualTo("manual");
ContentRetriever retriever = EmbeddingStoreContentRetriever.builder()
.embeddingStore(embeddingStore)
.filter(filter)
.build();// Adjust retrieval based on query characteristics
ContentRetriever retriever = EmbeddingStoreContentRetriever.builder()
.embeddingStore(embeddingStore)
.dynamicMaxResults(query -> {
// Complex queries need more context
int wordCount = query.text().split("\\s+").length;
return wordCount > 15 ? 10 : 5;
})
.dynamicMinScore(query -> {
// Short queries need higher precision
return query.text().length() < 30 ? 0.8 : 0.6;
})
.build();import static dev.langchain4j.store.embedding.filter.MetadataFilterBuilder.metadataKey;
// Filter based on query keywords
ContentRetriever retriever = EmbeddingStoreContentRetriever.builder()
.embeddingStore(embeddingStore)
.dynamicFilter(query -> {
String text = query.text().toLowerCase();
if (text.contains("api") || text.contains("code")) {
return metadataKey("category").isEqualTo("api_docs");
} else if (text.contains("tutorial") || text.contains("guide")) {
return metadataKey("category").isEqualTo("tutorials");
}
return null; // No filter for general queries
})
.build();// Different retrievers for different document types
ContentRetriever technicalRetriever = EmbeddingStoreContentRetriever.builder()
.embeddingStore(technicalStore)
.maxResults(3)
.minScore(0.8)
.displayName("TechnicalDocs")
.build();
ContentRetriever generalRetriever = EmbeddingStoreContentRetriever.builder()
.embeddingStore(generalStore)
.maxResults(5)
.minScore(0.6)
.displayName("GeneralDocs")
.build();
// Use appropriate retriever based on context
ContentRetriever selectedRetriever = isTechnicalQuery(query)
? technicalRetriever
: generalRetriever;Install with Tessl CLI
npx tessl i tessl/maven-dev-langchain4j--langchain4j-easy-rag