现代 Web 应用越来越多地与大型语言模型(LLM)集成,以构建解决方案。
DeepSeek 是一家中国的 AI 研究公司,致力于开发功能强大的 LLM,最近凭借其 DeepSeek-V3 和 DeepSeek-R1 模型颠覆了人工智能世界。DeepSeek-V3 和 DeepSeek-R1 模型揭示了它的思维链(CoT),让我们了解了 AI 模型是如何解释和处理给定提示的。
本文将带你了解如何将 DeepSeek 模型与 Spring AI 集成,以构建一个能够进行多轮文本对话的简单聊天机器人。
有多种方法可以将 DeepSeek 模型集成到我们的应用中。
DeepSeek 模型与 OpenAI API 完全兼容,可以使用任何 OpenAI 客户端或库进行访问。
首先,在项目的 文件中添加 Spring AI 的 OpenAI Starter 依赖:
由于当前的 1.0.0-M6 版本是里程碑版本,因此还需要在 中添加 Spring Milestones Repository:
该 Repository 是发布里程碑版本的地方,而不是标准的 Maven Central Repository。无论我们选择哪种配置选项,都需要添加这个里程碑 Repository。
接下来,在 文件中配置 DeepSeek API Key 和 聊天模型:
此外,还指定了 DeepSeek API 的 base URL 并禁用了 embedding(嵌入),因为 DeepSeek 目前还没有提供任何与 embedding 兼容的模型。
配置上述属性后,Spring AI 会自动创建一个 类型的 Bean,允许我们与指定的模型交互。接下来,我们将使用它为聊天机器人定义其他几个 Bean。
或者,也可以使用 Amazon Bedrock Converse API 将 DeepSeek R1 模型集成到我们的应用中。
要进行这一配置,我们需要一个 AWS 账户。DeepSeek-R1 模型可通过 Amazon Bedrock Marketplace 购买,并可使用 Amazon SageMaker 托管。可以参考 本部署指南 进行设置。
首先,在 中添加 Bedrock Converse starter 依赖:
接下来,为了与亚马逊 Bedrock 交互,我们需要在 文件中配置用于身份验证的 AWS 凭证和 DeepSeek 模型所在的区域():
使用 属性占位符从环境变量中加载属性值。
此外,我们还指定了托管 DeepSeek 模型的 SageMaker 端点 URL ARN。要记得用实际值替换 REGION、ACCOUNT_ID 和 ENDPOINT_NAME 占位符。
最后,为了与模型交互,我们需要为应用中配置的 IAM 用户分配以下 IAM 策略:
同样,要记得用 ARN 中的实际值替换 和 占位符。
为了进行本地开发和测试,我们可以通过 Ollama 运行 DeepSeek 模型,这是一个开源工具,可以让我们在本地机器上运行 LLM。
在项目的 文件中导入必要的依赖:
Ollama starter 依赖 会帮助我们建立与 Ollama 服务的连接。
接下来,在 文件中配置聊天模型:
如上,我们指定了 deepseek-r1 模型,不过,你也可以尝试使用 其他可用模型 来实现这一功能。
此外,我们还将 pull-model-strategy 设置为 when_missing。这样就能确保 Spring AI 在本地没有指定模型的情况下拉取该模型。
Spring AI 在 上运行时会自动连接到 Ollama,默认端口为 。不过,我们可以使用 属性覆盖连接 URL。或者,也可以使用 Testcontainers 来设置 Ollama 服务。
同样,Spring AI 会自动为我们创建 Bean。如果由于某种原因,我们的类路径上同时存在 OpenAI API、Bedrock Converse 和 Ollama 这三个依赖项,我们可以分别使用 、 或 的限定符来引用我们想要的特定 Bean。
在熟悉了各种配置选项之后,让我们使用配置好的 DeepSeek 模型构建一个简单的聊天机器人。
首先,定义聊天机器人所需的 Bean:
首先,我们使用 实现定义了一个 Bean,它将聊天历史记录存储在内存中,以保持对话上下文。
接下来,使用 和 Bean 创建一个 Bean。 类是与我们配置的 DeepSeek 模型交互的主要入口。
如前所述,DeepSeek-R1 模型的响应包括其 CoT,我们得到的响应格式如下:
不幸的是,由于这种独特的格式,当我们尝试将响应解析为 Java 类时,当前版本 Spring AI 中的所有结构化输出转换器(Converter)都会失败并抛出异常。
因此,需要创建自己的自定义结构化输出转换器()实现,分别解析 AI 模型的答案和 CoT:
如上,我们的 Converter 会从 AI 模型的响应中提取思维链和答案,并将它们作为 record 返回。
如果 AI 回复不包含 标记,我们就会将整个回复视为答案。这确保了与其他不在回复中包含 CoT 的 DeepSeek 模型的兼容性。
配置就绪后,创建一个 类,并注入之前定义的 Bean,以便与指定的 模型交互。
首先,定义两个简单的 来表示聊天请求和响应:
包含用户的问题和一个可选的 ,用于识别正在进行的对话。
同样, 包含 以及聊天机器人的 (思维链)和 (回答)。
现在,让我们来实现预期的功能:
如果收到的请求不包含 ,我们就会生成一个新的 。这样,用户就可以开始新对话或继续现有对话。
我们将用户的 (问题)传递给 Bean,并将 参数设置为已解析的 ,以维护对话历史记录。
最后,我们创建自定义 类的实例,并将其传递给 方法,以便将 AI 模型的响应解析为 记录。然后,我们从中提取 (思维链)和 (答案),并连同 一起返回。
实现了 Service 层后,创建 REST API:
使用 HTTPie CLI 来调用上述 API 端点并开始新对话:
如上,我们向聊天机器人发送了一个简单的问题,其回复如下:
回复包含一个唯一的 、聊天机器人的 和对我们问题的回答。我们可以看到 AI 模型是如何使用 属性推理和处理给定提示的。
继续对话,使用上述回复中的 发送一个后续问题:
看看聊天机器人能否保持我们对话的上下文,并提供相关的回复:
可以看到,聊天机器人确实保持了对话上下文。 保持不变,表明后续回答是同一对话的继续。
本文介绍了将 DeepSeek 模型集成到应用中的各种方案,首先是直接使用 OpenAI API(因为 DeepSeek 与之兼容),然后是使用亚马逊的 Bedrock Converse API,最后是使用 Ollama 建立本地测试环境。
Ref:
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/218343.html