首页
/ Kotlin AI 示例项目:使用 Spring AI 与 Kotlin 开发 AI 应用指南

Kotlin AI 示例项目:使用 Spring AI 与 Kotlin 开发 AI 应用指南

2025-06-09 21:30:19作者:段琳惟

前言

在现代应用开发中,人工智能(AI)功能已成为提升用户体验和产品智能化水平的关键要素。本文将详细介绍如何在 Kotlin 项目中利用 Spring AI 框架与大型语言模型(LLM)进行交互,实现各种智能功能。

环境准备

依赖配置

首先需要在项目中添加 Spring AI 相关依赖:

dependencies {
    implementation("org.springframework.ai:spring-ai-openai")
    implementation("com.fasterxml.jackson.module:jackson-module-kotlin:2.18.2")
}

API 密钥设置

使用 OpenAI 服务需要配置 API 密钥,可以通过环境变量或直接赋值:

val apiKey = System.getenv("OPENAI_API_KEY") ?: "YOUR_OPENAI_API_KEY"

基础配置

创建聊天模型

配置 OpenAI 聊天模型的基本参数:

val openAiApi = OpenAiApi.builder().apiKey(apiKey).build()
val openAiChatOptions = OpenAiChatOptions.builder()
    .model(OpenAiApi.ChatModel.GPT_4_O_MINI)
    .temperature(0.7)
    .build()
val chatModel = OpenAiChatModel.builder()
    .openAiApi(openAiApi)
    .defaultOptions(openAiChatOptions)
    .build()

参数说明:

  • model: 指定使用的 AI 模型版本
  • temperature: 控制生成文本的随机性(0-1),值越高结果越多样

基本交互

发送简单提示

val response = chatModel.call("生成一首关于 Kotlin 的俳句")
println(response)

使用 ChatClient 增强交互

可以配置系统角色指令,让 AI 以特定风格响应:

val chatClient = ChatClient.builder(chatModel).defaultSystem(
    """
    你是一位《指环王》专家和可信赖的顾问。
    以中土世界的风格提供明智、简洁的指导,
    借鉴其传说、人物和哲学。
    """.trimIndent()
).build()

val advice = chatClient
    .prompt()
    .user("未来会怎样?")
    .call()
    .content()
println(advice)

高级功能

流式响应处理

对于长文本生成,使用流式响应可以提升用户体验:

import kotlinx.coroutines.reactive.asFlow
import kotlinx.coroutines.runBlocking

val streamingResponse: Flow<String> = chatModel
    .stream("生成一首关于 Kotlin 的俳句")
    .asFlow()

runBlocking {
    streamingResponse.collect { chunk ->
        print(chunk)
    }
}

结构化输出

Spring AI 支持将响应自动转换为 Kotlin 数据类:

  1. 定义数据模型:
data class Movie(
    val title: String,
    val year: Int,
    val director: String,
    val genre: String
)
  1. 配置 JSON 响应格式:
val structuredOutputOptions = OpenAiChatOptions.builder()
    .model(OpenAiApi.ChatModel.GPT_4_O_MINI)
    .responseFormat(ResponseFormat.builder()
        .type(ResponseFormat.Type.JSON_OBJECT)
        .build())
    .build()
  1. 获取结构化响应:
val movie = ChatClient.create(chatModelWithStructuredOutput)
    .prompt()
    .user("1990年获得奥斯卡最佳影片的电影")
    .call()
    .entity<Movie>()

工具集成

Spring AI 支持通过工具扩展模型功能:

  1. 定义模拟天气服务:
fun mockWeatherService(location: String): Double? = when {
    "Paris" in location -> 15.0
    "Tokyo" in location -> 10.0
    "San Francisco" in location -> 30.0
    else -> null
}
  1. 创建工具定义:
val functionTool = OpenAiApi.FunctionTool(
    OpenAiApi.FunctionTool.Type.FUNCTION,
    OpenAiApi.FunctionTool.Function(
        "获取指定位置的当前温度",
        "getCurrentWeather", 
        ModelOptionsUtils.jsonToMap(
            """
            {
                "type": "object",
                "properties": {
                    "location": {
                        "type": "string",
                        "description": "城市和国家,例如:中国北京"
                    }
                },
                "required": ["location"],
                "additionalProperties": false
            }
            """.trimIndent()
        ),
        true
    )
)
  1. 使用工具进行交互:
val initialUserMessage = ChatCompletionMessage(
    "巴黎今天的天气如何?",
    ChatCompletionMessage.Role.USER
)
val chatCompletionRequest = ChatCompletionRequest(
    listOf(initialUserMessage), "gpt-4o",
    listOf(functionTool), ToolChoiceBuilder.AUTO
)

val chatCompletion = openAiApi.chatCompletionEntity(chatCompletionRequest)
val responseFromLLM = chatCompletion.body!!.choices().first().message()

最佳实践

  1. 模型选择:根据需求平衡模型性能和成本,GPT-4 通常比 GPT-3.5 更准确但更昂贵

  2. 错误处理:始终验证 AI 返回的结构化数据,实现回退机制

  3. 性能优化

    • 对于实时交互使用流式响应
    • 缓存常见查询结果
    • 合理设置 temperature 参数
  4. 用户体验

    • 为长时间操作提供加载指示
    • 处理 AI 可能产生的幻觉或不准确信息
    • 实现对话上下文管理

结语

通过 Spring AI 框架,Kotlin 开发者可以轻松地将强大的 AI 功能集成到应用中。本文介绍了从基础配置到高级功能的完整流程,包括流式响应、结构化输出和工具集成等关键特性。随着 AI 技术的快速发展,这些功能将为应用开发带来更多可能性。

登录后查看全文
热门项目推荐

热门内容推荐

最新内容推荐

项目优选

收起
ohos_react_nativeohos_react_native
React Native鸿蒙化仓库
C++
176
261
RuoYi-Vue3RuoYi-Vue3
🎉 (RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue3 & Vite、Element Plus 的前后端分离权限管理系统
Vue
860
511
ShopXO开源商城ShopXO开源商城
🔥🔥🔥ShopXO企业级免费开源商城系统,可视化DIY拖拽装修、包含PC、H5、多端小程序(微信+支付宝+百度+头条&抖音+QQ+快手)、APP、多仓库、多商户、多门店、IM客服、进销存,遵循MIT开源协议发布、基于ThinkPHP8框架研发
JavaScript
93
15
openGauss-serveropenGauss-server
openGauss kernel ~ openGauss is an open source relational database management system
C++
129
182
openHiTLSopenHiTLS
旨在打造算法先进、性能卓越、高效敏捷、安全可靠的密码套件,通过轻量级、可剪裁的软件技术架构满足各行业不同场景的多样化要求,让密码技术应用更简单,同时探索后量子等先进算法创新实践,构建密码前沿技术底座!
C
259
300
kernelkernel
deepin linux kernel
C
22
5
cherry-studiocherry-studio
🍒 Cherry Studio 是一款支持多个 LLM 提供商的桌面客户端
TypeScript
595
57
CangjieCommunityCangjieCommunity
为仓颉编程语言开发者打造活跃、开放、高质量的社区环境
Markdown
1.07 K
0
HarmonyOS-ExamplesHarmonyOS-Examples
本仓将收集和展示仓颉鸿蒙应用示例代码,欢迎大家投稿,在仓颉鸿蒙社区展现你的妙趣设计!
Cangjie
398
371
Cangjie-ExamplesCangjie-Examples
本仓将收集和展示高质量的仓颉示例代码,欢迎大家投稿,让全世界看到您的妙趣设计,也让更多人通过您的编码理解和喜爱仓颉语言。
Cangjie
332
1.08 K