Learn how to use prompt templates with LangChain4J's AiServices. This guide covers setup, configuration, and customization.
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}}
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?"
Key components:
PromptTemplateFactory
: Gets templates and handles defaultsClasspathPromptTemplateSource
: Loads templates from your classpathSimpleTemplateRenderer
: Replaces{{key}}
placeholders with valuesRenderablePromptTemplate
: Connects everything together
Configure templates in langchain4j-kotlin.properties
:
Setting | Purpose | Default |
---|---|---|
prompt.template.source |
Where templates load from | ClasspathPromptTemplateSource |
prompt.template.renderer |
How templates render | SimpleTemplateRenderer |
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
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
Find complete examples: