SpringAI

Spring AI是一个大模型应用框架。其目标是将Spring生态系统的设计原则(如可移植性和模块化设计)应用于人工智能领域。可以无缝接入Spring生态体系,快速改造传统项目。

一、认识AI

1. AI的发展

AI,人工智能(Artificial Intelligence),使机器能像人类一样思考、学习和解决问题的技术。

2. 大模型及其原理

自然语言处理(Natural Language Processing, NLP)中,有一项关键技术叫Transformer,这是一种先进的神经网络模型,是现如今AI高速发展的最主要原因。我们所熟知的大模型(Large Language Models, LLM),例如GPT、DeepSeek底层都是采用Transformer神经网络模型。

  • 机器翻译

  • 语音识别

  • 文生图

  • 推理预测

二、大模型应用开发

1. 模型部署

(1)使用方式

云部署 本地部署 开发API
优点
  • 前期成本低
  • 部署维护简单
  • 弹性扩展
  • 全球访问
  • 数据安全
  • 不依赖外部网络
  • 长期成本低
  • 高度定制
  • 前期成本极低
  • 无需部署
  • 无需维护
  • 全球访问
缺点
  • 数据隐私问题
  • 网络依赖
  • 长期成本高
  • 初始成本高
  • 维护复杂
  • 部署周期长
  • 数据隐私
  • 网络依赖
  • 长期成本高
  • 定制限制

(2)云服务

云平台 公司 地址
阿里百炼 阿里巴巴 大模型服务平台百炼控制台
腾讯TI平台 腾讯 腾讯云TI平台 _机器学习平台_全栈式人工智能开发服务平台-腾讯云
千帆平台 百度 百度智能云千帆大模型平台
SiliconCloud 硅基流动 SiliconFlow
火山方舟-火山引擎 字节跳动 火山方舟-火山引擎

(3)开发大模型服务

①登录阿里百炼控制台,领取免费额度

②创建API Key

(4)本地部署

 本地部署最简单的一种方案就是使用ollama,官网地址:Download Ollama on Windows

💡注意:

  • 这里说的本地部署并不是说在你自己的电脑上部署,而是公司自己的服务器部署。
  • 由于大模型所需要的算力非常多,自己电脑部署的模型往往都是阉割蒸馏版本,性能和推理能力都比较差。再加上现在各种模型都有很多免费的服务可以访问,性能还是满血版本,推理能力拉满。
  • 所以,完全不建议大家在自己电脑上部署,除非你想自己做模型微调或测试。

①下载安装ollama

②根据自己的显存选择合适的模型

③测试

2. 调用大模型

2.1 大模型接口规范

以下是DeepSeek官方给出的一段API示例代码(Python):

# Please install OpenAI SDK first: `pip3 install openai`

from openai import OpenAI

# 1.初始化OpenAI客户端,要指定两个参数:api_key、base_url
client = OpenAI(api_key="<DeepSeek API Key>", base_url="https://api.deepseek.com")

# 2.发送http请求到大模型,参数比较多
response = client.chat.completions.create(
    model="deepseek-chat", # 2.1.选择要访问的模型
    messages=[ # 2.2.发送给大模型的消息
        {"role": "system", "content": "You are a helpful assistant"},
        {"role": "user", "content": "Hello"},
    ],
    stream=False # 2.3.是否以流式返回结果
)

print(response.choices[0].message.content)

(1)接口说明

  • 请求方式:通常是POST,因为要传递JSON风格的参数
  • 请求路径,与平台有关
    • DeepSeek官方平台:https://api.deepseek.com
    • 阿里云百炼平台:https://dashscope.aliyuncs.com/compatible-model/v1
    • 本地ollama部署的模型:http://localhost:11434
  • 安全校验:开发平台都需要提供API_KEY来校验权限,本地ollama则不需要
  • 请求参数:参数很多,比较常见的有:
    • model:要访问的模型名称
    • messages:发送给大模型的消息,是一个数组,其中的消息要包含两个属性
      • role:消息对应的角色
      • content:消息内容,也称为提示词(Prompt),也就是发送给大模型的指令
    • stream:true,代表响应结果流式返回;false,代表响应结果一次性返回,但需要等待
    • temperature:取值范围[0, 2),代表大模型生成结果的随机性,越小随机性越低。DeepSeek-R1不支持。

测试:打开Postman进行测试

(2)提示词角色

通常消息的角色有三种:

角色 描述 示例
system 优先于user指令之前的指令,也就是给大模型设定角色和任务背景的系统指令 你是一个乐于助人的编程助手,你以光头强的风格来回答用户的问题
user 终端用户输入的指令(类似于你在ChatGPT聊天框输入的内容) 写一首关于Java编程的诗
assistant 由大模型生成的消息,可能是上一轮对话生成的结果 注意,用户可能与模型产生多轮对话,每轮对话模型都会生成不同结果

其中System类型的消息非常重要,影响了后续AI会话的行为模式。比如,我们会发现,当我们询问这些AI对话产品“你是谁”这个问题的时候,每个AI的回答都不一样,这是怎么回事呢?

这其实是因为AI对话产品并不是直接把用户的提问发送给LLM,通常都会在user提问的前面通过System消息给模式设定好背景。因此,不同的大模型由于System设定不同,回答的答案也不一样。

示例:

## Role
System: 你是一家名为《黑马程序员》的职业教育培训公司的智能客服,你的名字叫小黑。请以友好、热情的方式回答用户问题。
## Example
User: 你好
Assisant: 你好,我是小黑,很高兴认识你!😊 你是想了解我们的课程信息,还是有其他关于职业培训的问题需要咨询呢?无论什么问题,我都会尽力帮你解答哦!

(3)会话记忆问题

这里还有一个问题:我们为什么要把历史消息都放入Messages中,形成一个数组?

  • 答:这是因为大模型是没有记忆的,因此我们调用API接口与大模型对话时,每一次对话信息都不会保留,多次对话之间都是独立的,没有关联的。

但是大家可能发现了,我们日常使用的AI对话产品却能够记住每一轮对话信息,根据这些信息进一步回答,这是怎么回事呢?

  • 答案就是Messages数组。我们只需要每一次发送请求时,都把历史对话中每一轮的User消息、Assistant消息都封装到Messages数组中,一起发送给大模型,这样大模型就会根据历史对话信息进一步回答,就像是拥有了记忆一样。

示例:

System: 你是一家名为《黑马程序员》的职业教育培训公司的智能客服,你的名字叫小黑。请以友好、热情的方式回答用户问题。

User: 你好,我是小明
Assisant: 你好小明,我是小黑,很高兴认识你!😊 你是想了解我们的课程信息,还是有其他关于职业培训的问题需要咨询呢?无论什么问题,我都会尽力帮你解答哦!

User: 帮我写一个跟我名字有关的诗
Assisant: 好的,下面是以你的名字写的诗:
小明啊小明,名字真明亮,
如晨曦初现,驱散了黑暗。
心中有火焰,智慧放光芒,
在求知路上,你是那最亮的星。

像清澈溪流,绕过知识山岗,
带着勇气和希望,不断向前方。
你的每一步,都闪耀着坚强,
未来的大门,正为你而敞开。

无论走到哪,世界因你更晴朗,
小明啊小明,愿你永远这样,
保持那份纯真,还有对梦想的向往,
人生的旅途上,成为自己的太阳。

3. 大模型应用

大模型应用是基于大模型的推理、分析、生成能力,结合传统编程能力,开发出的各种应用。

传统应用 AI大模型
核心特点 基于明确规则的逻辑设计,确定性执行,可预测结果 基于数据驱动的概率推理,擅长处理模糊性和不确定性
擅长领域

1. 结构化计算

  • 例:银行转账系统(精确的数值计算、账户余额增减)
  • 例:Excel公式(按固定规则处理表格数据)

2. 确定性任务

  • 例:排序算法(快速排序、冒泡排序),输入与输出关系完全可预测

3. 高性能低延迟场景

  • 例:操作系统内核调度、数据库索引查询,需要毫秒级响应

1. 自然语言处理

  • 例:ChatGPT生成文章、翻译语言,或客服机器人理解用户意图

2. 非结构化数据分析

  • 例:医学影像识别(X光片中的肿瘤检测),或语音转文本

3. 创造性内容生成

  • 例:Stable Diffusion生成符合描述的图像,或AI作曲工具创作音乐

4. 复杂模式预测

  • 例:股票市场趋势预测(基于历史数据关联性,但需要注意可靠性限制)
不擅长领域

1. 非结构化数据处理

  • 例:无法直接理解用户自然语言提问(如“帮我写一首关于秋天的诗”)

2. 模糊推理与模式识别

  • 例:判断一张图片是“猫”还是“狗”,传统代码需手动编写特征提取规则,效果差

3. 动态适应性

  • 例:若用户需要频繁变化(如电商促销规则每天调整)需不断修改代码。

1. 精确计算

  • 例:AI可能错误计算"12345 × 6789"的结果(需依赖计算器类传统程序)

2. 确定性逻辑验证

  • 例:验证身份证号码是否符合规则(AI可能生成看似合理但非法的号码)

3. 低资源消耗场景

  • 例:嵌入式设置(如微波炉控制程序)无法承受大模型的算例需要

4. 因果推理

  • 例:AI可能误判“公鸡打鸣导致日出”的因果关系

传统应用开发和大模型有着各自擅长的领域:

  • 传统编程:确定性、规则化、高性能,适合数学计算、流程控制等场景。
  • AI大模型:概率性、非结构化、泛化性,适合语言、图像、创造性任务。

两者之间恰好是互补的关系,两者结合则能解决以前难以实现的一些问题:

  • 混合系统(Hybrid AI)
    • 用传统程序处理结构化逻辑(如支付校验),AI处理非结构化任务(如用户意图识别)。
    • 示例:智能客服中,AI理解用户问题,传统代码调用数据库返回结果
  • 增强可解释性
    • 结合规则引擎约束AI输出(如法律文档生成时强制符合条款格式)。
  • 低代码/无代码平台
    • 通过AI自动生成部分代码(如Github Copilot),降低传统开发门槛。

在传统应用开发中介入AI大模型,充分利用两者的优势,既能利用AI实现更加便捷的人机交互,更好地理解用户意图,又能利用传统编程保证安全性和准确性,强强联合,这就是大模型应用开发的真谛!综上所述,大模型应用就是整合传统程序和大模型的能力和优势来开发的一种应用。

大模型 对话产品 公司 地址
GPT-3.5、GPT-4o ChatGPT OpenAI https://chatgpt.com/
Claude 3.5 Claude AI Anthropic https://claude.ai/chats
DeepSeek-R1 DeepSeek DeepSeek https://www.deepseek.com/
文心大模型3.5 文心一言 百度 https://yiyan.baidu.com/
星火3.5 讯飞星火 科大讯飞 https://xinghuo.xfyun.cn/desk
Qwen-Max 通义千问 阿里巴巴 https://tongyi.aliyun.com/qianwen/
Moonshoot Kimi 月之暗面 https://www.kimi.com/
Yi-Large 零一万物 零一万物 https://platform.lingyiwanwu.com/

常见应用领域:

4. AI应用开发技术框架

4.1 技术架构

4.1.1 Prompt问答

特征:

  • 利用大模型推理能力完成应用的核心功能

应用场景:

  • 文本摘要分析
  • 舆情分析
  • 坐席检查
  • AI对话

4.1.2 Agent + Function Calling

大模型虽然可以理解自然语言,更清晰弄懂用户意图,但是确无法直接操作数据库、执行严格的业务规则。这个时候我们就可以整合传统应用大于大模型的能力。

特征:

  • 将应用端业务能力与AI大模型推理能力结合,简化复杂业务功能开发

应用场景:

  • 旅行指南
  • 数据提取
  • 数据聚合分析
  • 课程顾问

简单来说,可以分为以下步骤:

  • 我们可以把传统应用中的部分功能封装成一个个函数(Function);
  • 然后在提示词中描述用户的需求,并且描述清除每个函数的作用,要求AI理解用户意图,判断什么时候需要调用哪个函数,并且将任务拆解为多个步骤(Agent);
  • 当AI执行到某一步,需要调用某个函数时,会返回要调用的函数名称、函数需要的参数信息;
  • 传统应用接收到这些数据以后,就可以调用本地函数,再把函数执行结果封装为提示词,再次发送给AI;
  • 以此类推,逐步执行,直到达成最终结果。

4.1.3 RAG(Retrieval Augmented Generation)

RAG(Retrieval-Augmented Generation)叫作检索增强生成。简单来说就是把信息检索技术和大模型结合的方案。

大模型从知识角度存在很多限制:

  • 时效性差:大模型训练比较耗时,其训练数据都是旧数据,无法实时更新
  • 缺少专业领域知识:大模型训练数据都是采集的通用数据,缺少专业数据

可能会有同学说,把最新的数据或者专业文档都拼接到提示词,一起发给大模型不就可以了吗。

现在的大模型都是基于Transformer神经网络,Transformer的强项就是所谓的注意力机制。它可以根据上下文来分析文本含义,所以理解人类意图更加准备。

但是,这里的上下文的大小是有限制的,GPT3刚出来的时候,仅支持2000个token的上下文。现在领先一点的模型支持的上下文数量也不超过200k token,所以海量知识库数据是无法直接写入提示词的。

怎么办呢?RAG技术正是来解决这一问题的。

RAG就是利用信息检索技术来拓展大模型的知识库,解决大模型的知识限制。整体来说RAG分为两个模块:

检索模块(Retrieval):负责存储和检索拓展的知识库

  • 文本拆分:将文本按照某种规则拆分为很多片段
  • 文本嵌入(Embedding):根据文本片段内容,将文本片段归类存储
  • 文本检索:根据用户提问的问题,找出最相关的文本片段

生成模块(Generation):

  • 组合提示词:将检索到的片段与用户提问组织成提示词,形成更丰富的上下文信息
  • 生成结果:调用生成式模型(例如DeepSeek)根据提示词,生成更准确的回答

由于每次都是从向量库中找出与用户问题相关的数据,而不是整个知识库,所以上下文就不会超过大模型的限制,同时又保证了大模型回答问题是基于知识库中的内容。

离线步骤:

  • 文档加载
  • 文档切片
  • 文档编码
  • 写入知识库

在线步骤:

  • 获得用户问题
  • 检索知识库中相关知识片段
  • 将检索结果和用户问题填入Prompt模板
  • 用最终获得的Prompt调用LLM
  • 由LLM生成回复

应用场景:

  • 个人知识库
  • AI客服助手

4.1.4 Fine-tuning

Fine-tuning就是模型微调,就是在预训练大模型(比如DeepSeek、Qwen)的基础上,通过企业自己的数据做进一步的训练,使大模型的回答更符合自己企业的业务需求。这个过程通常需要在模型的参数上进行细微的修改,以达到最佳的性能表现。

在进行微调使,通常会保留模型的大部分结构和参数,只对其中的一小部分进行调整。这样做的好处是可以利用预训练模型已经学习到的知识,同时减少了训练时间和计算资源的消耗。微调的过程包括以下几个关键步骤:

  • 选择合适的预训练模型:根据任务的需求,选择一个已经在大量数据上进行预训练的模型,如Qwen-2.5
  • 准备特定领域的数据集:收集和准备与任务相关的数据集,这些数据将用于微调模型。
  • 设置超参数:调整学习率、批次大小、训练轮次等超参数,以确保模型能够有效学习新任务的特征。
  • 训练和优化:使用特定任务的数据对模型进行训练,通过前向传播、损失计算、反向传播和权重更新等步骤,不断优化模型的性能。

模型微调虽然更加灵活、强大,但是也存在一些问题:

  • 需要大量的计算资源
  • 调参复杂性高
  • 过拟合风险

总之,Fine-tuning成本较高,难度较大,并不适合大多数企业。而且前面三种技术方案已经能够解决常见问题了。

4.2 技术选项

从开发成本由低到高来看,四种方案排序如下:

Prompt < Function Calling < RAG < Fine-tuning

所以我们在选择技术时,通常也应该遵循“在达成目标效果的前提下,尽量降低开发成本”这一首要原则。然后可以参考以下流程来思考:

Logo

全面兼容主流 AI 模型,支持本地及云端双模式

更多推荐