CtrlK
BlogDocsLog inGet started
Tessl Logo

tessl/maven-dev-langchain4j--langchain4j-vertex-ai

LangChain4j integration for Google Vertex AI models including chat, language, embedding, image, and scoring capabilities

Pending

Quality

Pending

Does it follow best practices?

Impact

Pending

No eval scenarios have been run

Overview
Eval results
Files

examples.mddocs/models/embedding/

Embedding Model Examples

Basic Embedding

import dev.langchain4j.model.vertexai.VertexAiEmbeddingModel;
import dev.langchain4j.data.segment.TextSegment;
import dev.langchain4j.data.embedding.Embedding;
import dev.langchain4j.model.output.Response;

VertexAiEmbeddingModel model = VertexAiEmbeddingModel.builder()
    .endpoint("us-central1-aiplatform.googleapis.com:443")
    .project("your-project-id")
    .location("us-central1")
    .publisher("google")
    .modelName("text-embedding-004")
    .build();

TextSegment segment = TextSegment.from("Machine learning is a subset of AI");
Response<Embedding> response = model.embed(segment);
Embedding embedding = response.content();
float[] vector = embedding.vector();
System.out.println("Dimension: " + embedding.dimension());

Embed Multiple Texts

List<TextSegment> segments = List.of(
    TextSegment.from("First document about AI"),
    TextSegment.from("Second document about machine learning"),
    TextSegment.from("Third document about neural networks")
);

Response<List<Embedding>> response = model.embedAll(segments);
List<Embedding> embeddings = response.content();

for (int i = 0; i < embeddings.size(); i++) {
    System.out.println("Document " + i + " embedding: " +
                       embeddings.get(i).dimension() + " dimensions");
}

With Task Type Optimization

// For document indexing
VertexAiEmbeddingModel documentModel = VertexAiEmbeddingModel.builder()
    .endpoint("us-central1-aiplatform.googleapis.com:443")
    .project("your-project-id")
    .location("us-central1")
    .publisher("google")
    .modelName("text-embedding-004")
    .taskType(VertexAiEmbeddingModel.TaskType.RETRIEVAL_DOCUMENT)
    .build();

// For search queries
VertexAiEmbeddingModel queryModel = VertexAiEmbeddingModel.builder()
    .endpoint("us-central1-aiplatform.googleapis.com:443")
    .project("your-project-id")
    .location("us-central1")
    .publisher("google")
    .modelName("text-embedding-004")
    .taskType(VertexAiEmbeddingModel.TaskType.RETRIEVAL_QUERY)
    .build();

Advanced Configuration

VertexAiEmbeddingModel model = VertexAiEmbeddingModel.builder()
    .endpoint("us-central1-aiplatform.googleapis.com:443")
    .project("your-project-id")
    .location("us-central1")
    .publisher("google")
    .modelName("text-embedding-004")
    .taskType(TaskType.SEMANTIC_SIMILARITY)
    .maxSegmentsPerBatch(100)      // Process 100 segments per API call
    .maxTokensPerBatch(10000)       // Max 10k tokens per batch
    .outputDimensionality(256)      // Reduce to 256 dimensions
    .autoTruncate(true)             // Auto-truncate long texts
    .titleMetadataKey("doc_title")  // Custom title metadata key
    .maxRetries(3)
    .build();

Using Predefined Model Names

import dev.langchain4j.model.vertexai.VertexAiEmbeddingModelName;

VertexAiEmbeddingModel model = VertexAiEmbeddingModel.builder()
    .endpoint("us-central1-aiplatform.googleapis.com:443")
    .project("your-project-id")
    .location("us-central1")
    .publisher("google")
    .modelName(VertexAiEmbeddingModelName.TEXT_EMBEDDING_004.toString())
    .build();

// Check dimension
Integer dimension = VertexAiEmbeddingModelName.TEXT_EMBEDDING_004.dimension();
System.out.println("Expected dimension: " + dimension);

Calculate Token Counts

List<TextSegment> segments = List.of(
    TextSegment.from("Short text"),
    TextSegment.from("A much longer text with many more tokens to process")
);

List<Integer> tokenCounts = model.calculateTokensCounts(segments);
for (int i = 0; i < tokenCounts.size(); i++) {
    System.out.println("Segment " + i + " has " + tokenCounts.get(i) + " tokens");
}

Using with Metadata

import dev.langchain4j.data.document.Metadata;

TextSegment segment = TextSegment.from(
    "Document content here",
    Metadata.from("title", "Important Document")
);

Response<Embedding> response = model.embed(segment);

Custom Title Metadata Key

VertexAiEmbeddingModel model = VertexAiEmbeddingModel.builder()
    .endpoint("us-central1-aiplatform.googleapis.com:443")
    .project("your-project-id")
    .location("us-central1")
    .publisher("google")
    .modelName("text-embedding-004")
    .titleMetadataKey("doc_title")  // Custom metadata key
    .build();

TextSegment segment = TextSegment.from(
    "Document content",
    Metadata.from("doc_title", "My Document")  // Use same key
);

Response<Embedding> response = model.embed(segment);

Semantic Search Example

// Index documents
List<TextSegment> documents = List.of(
    TextSegment.from("Python is a programming language"),
    TextSegment.from("Java is used for enterprise applications"),
    TextSegment.from("Machine learning uses neural networks")
);

Response<List<Embedding>> docEmbeddings = documentModel.embedAll(documents);

// Search query
TextSegment query = TextSegment.from("programming languages");
Response<Embedding> queryEmbedding = queryModel.embed(query);

// Calculate similarities (cosine similarity)
for (int i = 0; i < docEmbeddings.content().size(); i++) {
    double similarity = cosineSimilarity(
        queryEmbedding.content().vector(),
        docEmbeddings.content().get(i).vector()
    );
    System.out.println("Document " + i + " similarity: " + similarity);
}

Reduced Dimensionality

VertexAiEmbeddingModel model = VertexAiEmbeddingModel.builder()
    .endpoint("us-central1-aiplatform.googleapis.com:443")
    .project("your-project-id")
    .location("us-central1")
    .publisher("google")
    .modelName("text-embedding-004")
    .outputDimensionality(256)  // Reduce from 768 to 256
    .build();

Response<Embedding> response = model.embed(TextSegment.from("Some text"));
System.out.println("Dimension: " + response.content().dimension()); // 256

Auto-Truncate Long Texts

VertexAiEmbeddingModel model = VertexAiEmbeddingModel.builder()
    .endpoint("us-central1-aiplatform.googleapis.com:443")
    .project("your-project-id")
    .location("us-central1")
    .publisher("google")
    .modelName("text-embedding-004")
    .autoTruncate(true)  // Automatically truncate if text too long
    .build();

String veryLongText = "...";  // Text longer than model limit
TextSegment segment = TextSegment.from(veryLongText);
Response<Embedding> response = model.embed(segment);  // No error, auto-truncated

Batch Processing with Limits

// Configure batching
VertexAiEmbeddingModel model = VertexAiEmbeddingModel.builder()
    .endpoint("us-central1-aiplatform.googleapis.com:443")
    .project("your-project-id")
    .location("us-central1")
    .publisher("google")
    .modelName("text-embedding-004")
    .maxSegmentsPerBatch(50)   // Process 50 at a time
    .maxTokensPerBatch(5000)    // Max 5000 tokens per batch
    .build();

// Large list of documents
List<TextSegment> manyDocuments = // ... 1000 documents
Response<List<Embedding>> response = model.embedAll(manyDocuments);
// Automatically batched into multiple API calls

Multilingual Embedding

VertexAiEmbeddingModel multilingualModel = VertexAiEmbeddingModel.builder()
    .endpoint("us-central1-aiplatform.googleapis.com:443")
    .project("your-project-id")
    .location("us-central1")
    .publisher("google")
    .modelName("text-multilingual-embedding-002")
    .build();

List<TextSegment> multilingualTexts = List.of(
    TextSegment.from("Hello world"),           // English
    TextSegment.from("Bonjour le monde"),      // French
    TextSegment.from("Hola mundo")             // Spanish
);

Response<List<Embedding>> response = multilingualModel.embedAll(multilingualTexts);

Error Handling

try {
    Response<List<Embedding>> response = model.embedAll(segments);
    List<Embedding> embeddings = response.content();
} catch (Exception e) {
    System.err.println("Embedding failed: " + e.getMessage());
    // Automatic retries already attempted up to maxRetries
}

RAG Implementation Example

// 1. Create embedding model for documents
VertexAiEmbeddingModel docModel = VertexAiEmbeddingModel.builder()
    .endpoint("us-central1-aiplatform.googleapis.com:443")
    .project("your-project-id")
    .location("us-central1")
    .publisher("google")
    .modelName("text-embedding-004")
    .taskType(TaskType.RETRIEVAL_DOCUMENT)
    .build();

// 2. Index knowledge base
List<TextSegment> knowledgeBase = loadDocuments();
Response<List<Embedding>> docEmbeddings = docModel.embedAll(knowledgeBase);

// 3. Create embedding model for queries
VertexAiEmbeddingModel queryModel = VertexAiEmbeddingModel.builder()
    .endpoint("us-central1-aiplatform.googleapis.com:443")
    .project("your-project-id")
    .location("us-central1")
    .publisher("google")
    .modelName("text-embedding-004")
    .taskType(TaskType.RETRIEVAL_QUERY)
    .build();

// 4. Search
String userQuery = "How does photosynthesis work?";
Response<Embedding> queryEmbedding = queryModel.embed(TextSegment.from(userQuery));

// 5. Find most similar documents
List<TextSegment> relevantDocs = findTopK(
    docEmbeddings.content(),
    queryEmbedding.content(),
    knowledgeBase,
    3  // Top 3
);

Install with Tessl CLI

npx tessl i tessl/maven-dev-langchain4j--langchain4j-vertex-ai@1.11.0

docs

index.md

quick-reference.md

tile.json