Skip to content

Latest commit

 

History

History
132 lines (100 loc) · 3.34 KB

PromptTemplates.md

File metadata and controls

132 lines (100 loc) · 3.34 KB

Prompt Templates Guide

Learn how to use prompt templates with LangChain4J's AiServices. This guide covers setup, configuration, and customization.

Create Your First Template

Place your prompt templates in the classpath:

System prompt template (path: prompts/default-system-prompt.mustache):

You are helpful assistant using chatMemoryID={{chatMemoryID}}

User prompt template (path: prompts/default-user-prompt.mustache):

Hello, {{userName}}! {{message}}

Quick Start

Here's how to use templates in your code:

// Define your assistant
interface Assistant {
  @UserMessage("prompts/default-user-prompt.mustache")
  fun askQuestion(
    @UserName userName: String, // Compile with javac `parameters=true` 
    @V("message") question: String,
  ): String
}

// Set up the assistant
val assistant: Assistant =
  AiServices
    .builder(Assistant::class.java)
    .systemMessageProvider(
      TemplateSystemMessageProvider("prompts/default-system-prompt.mustache")
    ).chatLanguageModel(model)
    .build()

// Use it
val response = assistant.askQuestion(
  userName = "My friend",
  question = "How are you?"
)

This creates:

  • System prompt: "You are helpful assistant using chatMemoryID=default"
  • User prompt: "Hello, My friend! How are you?"

Under the Hood

Key components:

  • PromptTemplateFactory: Gets templates and handles defaults
  • ClasspathPromptTemplateSource: Loads templates from your classpath
  • SimpleTemplateRenderer: Replaces {{key}} placeholders with values
  • RenderablePromptTemplate: Connects everything together

Customize Your Setup

Configure templates in langchain4j-kotlin.properties:

Setting Purpose Default
prompt.template.source Where templates load from ClasspathPromptTemplateSource
prompt.template.renderer How templates render SimpleTemplateRenderer

Add Custom Template Sources

Create your own source by implementing PromptTemplateSource:

interface PromptTemplateSource {
  fun getTemplate(name: TemplateName): PromptTemplate?
}

Example using Redis:

class RedisPromptTemplateSource(private val jedis: Jedis) : PromptTemplateSource {
  override fun getTemplate(name: TemplateName): PromptTemplate? {
    return jedis.get(name)?.let {
      SimplePromptTemplate(it)
    }
  }
}

Enable it in your properties:

prompt.template.source=com.example.RedisPromptTemplateSource

Create Custom Renderers

Build your own renderer:

interface TemplateRenderer {
  fun render(
    template: TemplateContent,
    variables: Map<String, Any?>
  ): String
}

Example:

class MyTemplateRenderer : TemplateRenderer {
  override fun render(template: TemplateContent, variables: Map<String, Any?>): String {
    TODO("Add implementation here")
  }
}

Enable it:

prompt.template.renderer=com.example.MyTemplateRenderer

Learn More

Find complete examples: