主题
Kotlin 支持
WARNING
针对 Kotlin 用户的破坏性变更。 ChatModel 现已声明一个 Java 成员 chatAsync(ChatRequest): CompletableFuture<ChatResponse>。在 Kotlin 中,签名相同的成员会优先于扩展函数,因此原先解析到 suspend 扩展(返回 ChatResponse)的单个参数的裸调用,现在会解析到该成员(返回 CompletableFuture<ChatResponse>):
kotlin
// Before - resolved to the suspend extension, returned ChatResponse:
val response: ChatResponse = model.chatAsync(request)
// After - the bare single-arg call resolves to the Java member (a CompletableFuture):
val future: CompletableFuture<ChatResponse> = model.chatAsync(request)
// Migration - await the future...
val response: ChatResponse = model.chatAsync(request).await()
// ...or supply a coroutineContext, which still selects the suspend extension:
val response: ChatResponse = model.chatAsync(request, Dispatchers.IO)Kotlin 是一门面向 JVM(及其他平台)的静态类型语言,能以简洁优雅的方式编写代码,并与 Java 库实现无缝互操作。 LangChain4j 利用 Kotlin 的扩展和类型安全构建器为 Java API 增添 Kotlin 特有的便利,从而允许用户为现有 Java 类扩展出面向 Kotlin 的额外功能。
开始使用
将 langchain4j-kotlin 模块添加到你的项目依赖中:
xml
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-kotlin</artifactId>
<version>[LATEST_VERSION]</version>
</dependency>如果你想使用 data class,请确保你的 classpath 中有 Jackson module kotlin。对于 Maven,添加一个运行时依赖:
xml
<dependency>
<groupId>com.fasterxml.jackson.module</groupId>
<artifactId>jackson-module-kotlin</artifactId>
<version>[LATEST_VERSION]</version>
<scope>runtime</scope>
</dependency>ChatModel 扩展
这段 Kotlin 代码演示了如何使用协程与挂起函数和类型安全构建器,与 LangChain4j 中的一个 ChatModel 交互。
kotlin
val model = OpenAiChatModel.builder()
.apiKey("YOUR_API_KEY")
// more configuration parameters here ...
.build()
CoroutineScope(Dispatchers.IO).launch {
val response = model.chat {
messages += systemMessage("You are a helpful assistant")
messages += userMessage("Hello!")
parameters {
temperature = 0.7
}
}
println(response.aiMessage().text())
}交互通过 Kotlin 的协程异步进行:
CoroutineScope(Dispatchers.IO).launch:在 IO 调度器上执行该流程,它针对网络或文件 I/O 等阻塞任务做了优化。这通过避免阻塞调用线程来确保响应性。model.chat是一个挂起函数,它使用一个构建器块来组织聊天请求。这种做法减少了样板代码,使代码更易读、易维护。
对于高级场景,为支持自定义的 ChatRequestParameters,类型安全的构建器函数接受一个自定义构建器:
kotlin
fun <B : DefaultChatRequestParameters.Builder<*>> parameters(
builder: B = DefaultChatRequestParameters.builder() as B,
configurer: ChatRequestParametersBuilder<B>.() -> Unit
)示例用法:
kotlin
model.chat {
messages += systemMessage("You are a helpful assistant")
messages += userMessage("Hello!")
parameters(OpenAiChatRequestParameters.builder()) {
temperature = 0.7 // DefaultChatRequestParameters.Builder property
builder.seed(42) // OpenAiChatRequestParameters.Builder property
}
}流式使用场景
StreamingChatModel 扩展为那些需要随 AI 模型生成而增量处理响应的场景提供能力。这在需要实时反馈的应用中尤其有用,例如聊天界面、实时编辑器或逐词元流式交互的系统。 借助 Kotlin 协程,chatFlow 扩展函数把来自语言模型的流式响应转换为结构化、可取消的 Flow 序列,从而实现协程友好的非阻塞处理。
下面是你如何用 chatFlow 实现一次完整交互:
kotlin
val flow = model.chatFlow { // similar to non-streaming scenario
messages += userMessage("Can you explain how streaming works?")
parameters { // ChatRequestParameters
temperature = 0.7
maxOutputTokens = 42
}
}
runBlocking { // must run in a coroutine context
flow.collect { reply ->
when (reply) {
is StreamingChatModelReply.PartialResponse -> {
print(reply.partialResponse) // Stream output as it arrives
}
is StreamingChatModelReply.CompleteResponse -> {
println("\nComplete: ${reply.response.aiMessage().text()}")
}
is StreamingChatModelReply.Error -> {
println("Error occurred: ${reply.cause.message}")
}
}
}
}作为示例,请查看这个测试。
编译器兼容性
在 Kotlin 中定义工具时,请确保将 Kotlin 编译配置设为保留元数据,以便 Java 反射能获取方法参数,即将 javaParameters 设为 true。要保持工具规范中正确的参数名,此设置是必需的。
使用 Gradle 时,可通过以下配置实现:
kotlin
kotlin {
compilerOptions {
javaParameters = true
}
}