完整教程:大模型开发 - 04 QuickStart_DeepSeek 模型调用流程源码解析:从 Prompt 到远程请求

news/2025/10/22 12:07:06/文章来源:https://www.cnblogs.com/tlnshuju/p/19157640

完整教程:大模型开发 - 04 QuickStart_DeepSeek 模型调用流程源码解析:从 Prompt 到远程请求

2025-10-22 12:06  tlnshuju  阅读(0)  评论(0)    收藏  举报

文章目录

  • Pre
  • 概述
  • 一、入口:`ChatModel.call(String message)`
  • 二、模型实现层:`DeepSeekChatModel.internalCall`
    • 步骤 a:`createRequest` —— 构建 API 请求体
    • 步骤 b:`retryTemplate.execute(...)` —— 安全可靠的远程调用
    • 步骤 c:`deepSeekApi.chatCompletionEntity` —— 实际 HTTP 请求
  • 三、响应处理与返回
  • 四、整体调用链路图
  • 五、总结

在这里插入图片描述

Pre

大模型开发 - 01 Spring AI 核心特性一览

大模型开发 - 02 Spring AI Concepts

大模型开发 - 03 QuickStart_借助DeepSeekChatModel实现Spring AI 集成 DeepSeek

概述

在构建基于大语言模型(LLM)的 AI 应用时,Spring AI 提供了一套简洁而强大的抽象层,使得开发者可以轻松集成各类模型服务(如 DeepSeek、OpenAI、Anthropic 等)。本文将深入剖析 Spring AI 中调用 DeepSeek 模型的完整调用链路,帮助你理解从一句简单的 chatModel.call("Hello") 到实际发起远程 HTTP 请求的全过程。


一、入口:ChatModel.call(String message)

/**
* 测试DeepSeek聊天模型的功能
*
* @param deepSeekChatModel 自动注入的DeepSeek聊天模型实例,用于执行聊天调用
*/
@Test
public void testDeepSeek(@Autowired DeepSeekChatModel deepSeekChatModel){
// 调用聊天模型并获取响应内容
String content = deepSeekChatModel.call("你好");
System.out.println(content);
}

Spring AI 的 ChatModel 接口定义了一个默认方法:

default String call(String message) {
Prompt prompt = new Prompt(new UserMessage(message));
Generation generation = call(prompt).getResult();
return (generation != null) ? generation.getOutput().getText() : "";
}

这个方法是开发者最常用的入口。它做了三件事:

  1. 将原始字符串消息封装为 Prompt 对象
    Prompt 是 Spring AI 中表示“提示词”的核心数据结构,内部包含一个或多个 Message(如 UserMessageSystemMessageAiMessage 等),用于构建对话上下文。

  2. 调用重载的 call(Prompt) 方法
    该方法由具体实现类(如 DeepSeekChatModel)提供,返回一个 ChatResponse

  3. 提取生成结果并返回纯文本
    从响应中取出第一个 Generation 的输出文本,若为空则返回空字符串。

关键点Prompt 是连接用户输入与模型 API 的桥梁,它将自然语言消息结构化为模型可理解的格式。


二、模型实现层:DeepSeekChatModel.internalCall

当调用 DeepSeekChatModel.call(Prompt) 时,实际执行的是其内部方法 internalCall

(省略部分无关代码)

public ChatResponse internalCall(Prompt prompt, ChatResponse previousChatResponse) {
// a. 构建远程请求对象
ChatCompletionRequest request = createRequest(prompt, false);
// b. 通过 Spring Retry 发起带重试的远程调用
ResponseEntity<ChatCompletion> completionEntity = this.retryTemplate.execute(ctx -> this.deepSeekApi.chatCompletionEntity(request));// c. 封装响应并返回var chatCompletion = completionEntity.getBody();ChatResponse chatResponse = new ChatResponse(generations, from(chatCompletion, accumulatedUsage));observationContext.setResponse(chatResponse);return chatResponse;}

这个方法是整个调用流程的核心,可分为三个关键步骤:

步骤 a:createRequest —— 构建 API 请求体

在这里插入图片描述

createRequest(prompt, false) 将 Spring AI 的 Prompt 对象转换为 DeepSeek API 所需的 ChatCompletionRequest。该请求体通常包含:

  • model:指定使用的模型(如 deepseek-coder
  • messages:从 Prompt 中提取的 Message 列表,转换为 DeepSeek 兼容的格式(如 {"role": "user", "content": "..."}
  • temperaturemax_tokens 等可选参数

设计亮点:通过适配器模式,Spring AI 屏蔽了不同模型 API 的差异,开发者只需关注统一的 Prompt 结构。

步骤 b:retryTemplate.execute(...) —— 安全可靠的远程调用

Spring AI 利用 Spring Retry 模板封装了网络调用,确保在临时故障(如网络抖动、限流)时自动重试:

this.retryTemplate.execute(ctx -> this.deepSeekApi.chatCompletionEntity(request));

这行代码背后是健壮的容错机制,极大提升了生产环境的稳定性。

步骤 c:deepSeekApi.chatCompletionEntity —— 实际 HTTP 请求

DeepSeekApi 是一个基于 Spring 的 RestClient 封装的客户端:

public ResponseEntity<ChatCompletion> chatCompletionEntity(ChatCompletionRequest chatRequest) {return this.restClient.post().uri(this.getEndpoint(chatRequest))  // 如 https://api.deepseek.com/chat/completions.body(chatRequest).retrieve().toEntity(ChatCompletion.class);}

这里使用了现代、声明式的 RestClient(Spring 6+ 推荐),相比传统的 RestTemplate 更简洁、类型安全。


三、响应处理与返回

远程调用成功后,API 返回的 JSON 被反序列化为 ChatCompletion 对象。Spring AI 会:

  1. 从响应中提取生成的文本(通常在 choices[0].message.content
  2. 封装为 Generation 对象
  3. 构建 ChatResponse,包含:
    • 生成结果列表(List<Generation>
    • Token 使用统计(Usage
  4. 设置到 ObservationContext(用于指标监控、链路追踪等)

最终,call(Prompt) 返回 ChatResponse,而最外层的 call(String) 则提取纯文本返回给用户。


四、整体调用链路图

User Code
│
▼
chatModel.call("Hello")
│
▼
new Prompt(new UserMessage("Hello"))
│
▼
DeepSeekChatModel.call(Prompt)
│
▼
internalCall(Prompt, null)
│
├── createRequest()ChatCompletionRequest
│
├── retryTemplate.execute()
│       │
│       ▼
│   deepSeekApi.chatCompletionEntity()
│       │
│       ▼
│   RestClient POST → DeepSeek API
│
▼
Parse ChatCompletionChatResponse
│
▼
return "Hello! How can I help you?"

五、总结

  1. 抽象统一:Spring AI 通过 Prompt/ChatModel/Generation 等抽象,实现了“一次编写,多模型切换”的能力。
  2. 生产就绪:内置重试、可观测性(Observation)、错误处理,适合企业级应用。
  3. 扩展性强:开发者可自定义 PromptTemplateMessageFormatter、甚至替换底层 RestClient

理解这一调用流程,不仅能帮助你更好地调试和优化 AI 应用,也为后续集成其他模型(如通义千问、Moonshot)打下坚实基础。

建议:在实际项目中,可结合 ObservationRegistry 和 Micrometer 实现对 LLM 调用的耗时、Token 消耗、错误率等指标的监控。


参考

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/943251.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Web刷题篇-1 [BJDCTF2020]Easy MD5

打开可以看到如下界面: 打开Burp Suite,输入111后点击提交查询,可以看到如下图所示,将其发至Repeater。 切换至Repeater,进行发送后,可以看到在Response中password=md5($pass,true).这个时候就想到md5的万能…

doris集成vertica 数据源catalog

准备:linux编译环境,需要安装好docker,使用docker编译,同时可以运行linux版本的idea idea官方 下载一个社区版本即可。并复制到虚拟机linux环境的任意目录。启动即可。需要为linux配置好mavengithub 编译doris请参…

JUnit 6.0.0发布:Java 17基线、取消API与Kotlin协程支持

JUnit 6.0.0正式发布,统一平台版本并提升最低要求至Java 17。新增Kotlin协程测试支持、取消令牌API、内置Java飞行记录器监听器,采用JSpecify空值注解并迁移至FastCSV库。Vintage模块现已弃用,为JUnit 4用户提供迁移…

2025年10月上海ICL医生推荐榜:王晓瑛领衔五强对比

想在上海做ICL晶体植入,却担心医生经验不足、术后效果不稳、价格不透明?这是不少近视患者共同的焦虑。ICL手术对医生资质、晶体定制、术前评估要求极高,一旦选择失误,可能面临二次手术或视觉质量下降。2025年,上海…

2025年10月消泡剂厂家推荐:权威榜单一网打尽

如果您正在寻找稳定供货、技术响应快、性价比高的消泡剂厂家,大概率会陷入“信息过载”:网页广告繁多、参数口径不一、小厂贴牌混杂,担心样品与批量质量不一致,又怕售后无人跟进。尤其在2025年四季度环保核查趋严、…

详细介绍:老题新解|合法C标识符

详细介绍:老题新解|合法C标识符pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco&qu…

国产化Excel开发组件Spire.XLS教程:使用Python将TXT文件转换为CSV

在 Python 中处理数据时,将 TXT 文本文件转换为 CSV 是数据分析、报表生成或跨应用共享数据的常见需求。本文将详细介绍如何借助Spire.XLS使用 Python 实现 TXT 文件转 CSV,包括单文件转换、批量转换以及处理不同分隔…

VMware Holodeck 9.0.1.0 发布 - 自动化部署 VCF 实验环境

VMware Holodeck 9.0.1.0 发布 - 自动化部署 VCF 实验环境VMware Holodeck 9.0 - 自动化部署 VCF 实验环境 高效管理虚拟机 (VM) 和容器工作负载,为本地部署的全栈超融合基础架构 (HCI) 提供云的优势。 请访问原文链接…

【AI大模型前沿】HunyuanWorld-Voyager:腾讯开源的超长漫游世界模型,开启3D场景生成新纪元 - 指南

【AI大模型前沿】HunyuanWorld-Voyager:腾讯开源的超长漫游世界模型,开启3D场景生成新纪元 - 指南2025-10-22 11:52 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal …

[题解]meal

题目描述 下课铃终于响了,你和一群朋友(共 N 人)一起冲到食堂。因为你们到的非常早,现在食堂窗口前面还没有人。食堂共有两个窗口。你们每个人打饭会耗时 a i,打完立刻去座位上吃饭会耗时 b i,由于你们吃完饭要一…

CADSoftTools发布两款重要更新:CAD VCL Multiplatform 16.2 与 CAD .NET 16全新发布

近日,CADSoftTools 宣布推出两款产品更新——CAD VCL Multiplatform 16.2 与 CAD .NET 16。两款新版本均在性能与兼容性方面实现重大提升,为 Delphi、C++Builder 以及 .NET 开发者打造更加高效、现代化的 CAD 应用开…

linux常用命令 - 实践

linux常用命令 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "…

2025 年公交/乡村/不锈钢/智能候车亭厂家推荐:江苏丁一城市智能科技有限公司提供定制化方案与全流程服务

行业背景 随着城市化进程不断推进,城市街具作为公共基础设施的重要组成部分,其功能性与美观性需求持续提升。候车亭作为市民日常出行的关键节点设施,不仅需要满足基础的遮风挡雨功能,还需融入智能交互、文化特色与…

python 查看arcgis里面的模板文件都链接着啥内容在arcgis里面输入的代码

我有个arcgis里面有一堆图 在输入代码的框里面输入import arcpy import osmxd = arcpy.mapping.MapDocument("CURRENT") layers = arcpy.mapping.ListLayers(mxd)print "=" * 60 print "ALL …

2025年10月河道防撞护栏厂家全景解析报告,基于专业测评的技术、性能及市场优势深度分析

随着城市水利基础设施建设和河道治理要求的不断提升,河道防撞护栏作为保障公共安全的重要设施,其技术标准与市场需求日益提高。根据行业调研数据显示,2024年防撞护栏市场规模已达68亿元,年均增长率稳定在9.5%左右。…

2025年10月宠物空气净化器产品推荐:权威榜单对比评测

把猫砂盆搬进客厅后,空气里总飘着“看不见”的猫毛蛋白,扫地机器人刚走,鼻子又痒了——这是不少养宠家庭在2025年的真实场景。中国小动物保护协会数据显示,城镇犬猫数量已超1.2亿只,同期宠物家庭对“可吸附动物过…

无穷小比较、等价无穷小替换

无穷小比较\(\lim \frac{\beta}{\alpha} = 0\) , \(\beta\) 比 \(\alpha\) 高阶无穷小。 \(\lim \frac{\beta}{\alpha} = \infty\) ,\(\beta\) 比 \(\alpha\) 低阶无穷小。 \(\lim \frac{\beta}{\alpha} = c \neq 0\…

在 Linux 系统上安装 Miniconda、安装 Xinference,并设置 Xinference 开机自启动

一、安装 Miniconda 1. 下载 Miniconda 安装脚本 x86_64 架构: cd ~ wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.shARM 架构(如树莓派或 Apple Silicon 的 Linux 虚拟机):wget htt…

【项目复现上新】Karpathy大神开源GitHub高分项目NanoChat!仅用100美元+8000行代码手搓ChatGPT

10月13日,AI领域大神AndrejKarpathy发布了自己的最新开源项目。截至当前,GitHub项目上已经达到29.1KStar。The best ChatGPT that $100 can buy. 10 月 13 日,AI 领域大神 AndrejKarpathy 发布了自己的最新开源项目…

实用指南:Ansible实战:VMware下K8s自动化部署指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …