shusheng007
Published on 2025-04-01 / 19 Visits
0
0

SpringAI开发指南(一):AI技术演进与SpringAI入门

[版权申明] 非商业目的注明出处可自由转载 出自:shusheng007

AI技术概述与发展趋势

AI的概念与核心技术

人工智能(AI)是通过计算机系统模拟人类智能行为的技术集合,其核心包括机器学习(ML)、深度学习(DL)、自然语言处理(NLP)、计算机视觉(CV)等领域。近年来,生成式AI(如GPT系列、Stable Diffusion)和多模态模型(如DALL·E、Gemini)的突破,使得AI能够生成文本、图像、语音甚至视频内容,极大拓展了应用场景。

例如,生成式AI通过预训练模型(如ChatGPT)实现了通用化能力,开发者无需深入机器学习理论即可调用其API完成复杂任务。这一特性使得AI成为“平民化”开发工具,加速了企业智能化转型。

AI的未来发展方向

下面是ChatGpt给出的预测:

1. 自主智能与智能代理

未来的AI将从“工具”向“自主代理”转变,这类系统能够独立规划任务、执行多步骤操作,从而在办公自动化、软件工程、客户服务等领域发挥巨大作用。业内普遍认为,AI代理是生成式AI下一个重要的应用方向

2. 多模态与超个性化

随着技术的进步,AI正逐步打破仅处理单一数据类型的局限。多模态模型将整合文本、图像、语音、视频等多种信息,使人机交互更加自然、智能;同时,超个性化技术将帮助企业提供更加定制化的服务,满足个体需求

3. 边缘智能与低功耗部署

为了应对实时性和成本的挑战,未来AI将更多地向边缘设备延伸,实现在手机、物联网设备甚至家居产品上高效、低延迟的运算,从而推动普及与应用

4. 量子人工智能与新算法突破

量子计算的引入有望极大提升AI在复杂问题求解上的能力。此外,结合强化学习、混合专家模型(MoE)等新算法的不断突破,将使AI在推理和创造性任务上获得更大进步

5. 安全、伦理与治理

随着AI技术影响范围的扩大,其潜在的风险与伦理问题日益受到关注。未来的发展方向中,将建立更完善的监管框架、伦理标准和安全措施,以确保AI在造福社会的同时不会带来负面影响

6. 跨行业深度融合与应用创新

AI技术将进一步渗透到医疗、金融、法律、制造业、自动驾驶等各个领域,通过与传统产业的深度融合,推动产业升级和商业模式创新

AI主流开发生态

说起这个,还的首推人家Python,这几年绝对是当红炸子鸡。我个人认为这货这么火,主要是得益于其长期积累的包罗万象的工具库,跟着出了很多杀手级的框架,例如:PyTorch/TensorFlow/LangChain/LlamaIndex...

不过Java也是有机会的,毕竟其在企业级应用领域还是扛把子的存在,那企业服务要集成AI自然而然的也会想到Java。无论如何啊,我们讲的都是在应用层,而且行业的概念都是相通的,如果java实在是没有机会转到Python也会很顺利

核心概念

首先声明,这些概念背后都有着非常复杂和高深的领域知识,这里只是做了一些浅薄的讲解,目的是为了能从应用层面来更好的使用他们,还有一点就是,本人也是二把刀,也是在不断地学习中...

AI模型(Model)

模型可以简单理解为是一个魔盒,你揭开盖子放进入一块石头,等一会再打开拿出来有可能就变成一块金子了。如果用数学的概念来说,模型就是一个功能特别强大的函数,你给它一个input,它还你一个output。

我们现在接触比较多的有:

  • Large Language Model (LLM), 大语言模型。例如Chat-GPT, deepseek等

  • Image Generation Model,图形生成模型。

  • Embedding Moel。 用于将文本,图形等等转化为向量(vector)的模型

  • ...


Prompts

上面提到AI模型就是一个魔盒,你放入一个东西它就会产出一个东西。那个这个Prompts就是解决放入的是什么,以什么方式放的问题。例如同样是一块石头,你竖着放魔盒给你一块金子,你横着放魔盒给你一泡屎...

这块大家应该花时间学习一下,虽然模型在朝着自然语言交互的方向不断进化,但是你提问的方式至始至终都会很重要。这就像你平时与人交流,如何提高交流的效率怎么重视都不为过。

Embeddings

简单来说,它是一float数组,例[0.638, 0.795, -0.994,...] ,也叫vector(向量) 。那这个数组怎么生成的呢?它就是通过我们前面说的`beddings Model` , 你把一段文本,图片,音视频什么就给你生一个vector。 vector有一个特别重要的信息就是维度(dimension),数组的长度就是维度。例如OpenAi的Embedding模型生成ector的维度就是1536

那至于是怎么生成的那道道就多了,有各种算法,我也不太懂。这里有一篇扫盲的文章讲的特别好,推荐阅读:primer-llm-embedding

,有兴趣的或者工作学习中遇到了再深入学习。

对于我们来说,Embedding主要用在 Retrieval Augmented Generation (RAG)的情景中。当文本转化为Vector后,就可以进行语义查找了,而不是全文比较查找了。例如"I love cuihuaNiu forever"转化为Vector后变为[0.333,0.9455,0.2234,0.13334,...],当我们查询cuihuaNiu的信息时,就可以先将cuihuaNiu转化为Vector,然后进行语义查询,查询到以后再转化为文本。

Token

Token是大语言模型处理文本时的最小语义单元,目前大模型收费都是基于Token的,输入输出都收费,输出费用更高。Token是经过相关算法划分的,例如BPE(Byte-Pair Encoding)与WordPiece(BERT采用)。

一个token的表现形式有很多,例如:模型是一个token,是一个token,一个是一个token...

每种大模型的语义窗口是不一样的,有的竟然能达到丧心病狂的100万token。也就是说100万token以内的语义它都能记住,你在开头说王二狗喜欢吃煎饼果子,中间输入了一本小说,然后末尾你再问他王二狗喜欢吃啥,它还记得!

我们需要知道中英文Token换算比例:

语言

文本长度

等效Token量

等效英文单词量

中文

100个汉字

~180 Tokens

≈138个英文单词

英文

100个单词

~130 Tokens

约等同中文72字


Tool Calling

这是一个极其强大的功能!!!

如果你让DeepSeek帮你在丑团上定个外卖,Deepseek需要做什么呢?首先你的告诉他你要吃啥,送到哪里,然后调用丑团外卖服务平台来完成下单。 调用丑团外卖服务下单这个过程就是Tool Calling。

AI竟然会使用工具了?要知道人与动物最大的区别是人会使用工具!现在AI会使用工具了,那人类离被奴役的日子还远吗?如果现在不采取措施,以后最好的结局也许就是一部分命硬的被圈养在野生自然保护区内... 希望人类的未来是光明的。

SpringAI Tool Calling 如下图所示:

多说一句,这个功能需要大模型去支持,有的大模型不支持。


Retrieval Augmented Generation(RAG)

这又是一个比较重量级的功能,特别是在企业应用中

首先,大语言模型训练所使用的数据是有截止日期的,此日期后产生的数据它是不知道的。其次训练的数据集也是有限的,例如你在8岁那年偷看隔壁李寡妇洗澡这件事只要没出现在互联网上,大模型是铁定不知道的,有人问它的时候它会一脸茫然。每个企业都有自己的私有数据,俗称数据资产,所以说AI要想在企业级应用中发挥作用,必须能利用这些私有数据。

目前有两个方式:

  1. 使用企业的私有数据对现有模型进行训练

  2. 在调用时将企业的私有数据提供给模型

  3. 二者结合

其中第二种就是我们这里谈论的Retrieval Augmented Generation(RAG)。

SpringAI的Retrieval Augmented Generation流程图如下

总体来说RAG是比较复杂的,但是只要明白它的目标和策略,剩下的都是战术。

  • 目标:在请求时将Context数据与问题一起提交给大模型,让大模型可以基于你提供的Context数据来回答问题。

  • 策略:先将数据处理好,然后存起来,请求时再查出来。如图所示,整个RAG分两步。

等到我们单门讲RAG时再详谈。

SpringAI简介

OenAI,DeepSeek等开发出了GPT大模型,这些通用大语言模型瞬间颠覆了人类以往的认知,所以各行各业都想利用他们产生价值。于是这些大模型厂商开始对外提供服务,最常见的就是以API的形式。所以说对于我们来说,AI开发和调用第三方服务的API没有啥区别,例如下面是DeepSeek的API

调用deepseek-r1模型API:

curl --location 'https://api.deepseek.com/chat/completions' \
--header 'Content-Type: application/json' \
--header 'Authorization: ••••••' \
--data '{
    "model": "deepseek-reasoner",
    "messages": [
        {
            "role": "system",
            "content": "You are a helpful assistant."
        },
        {
            "role": "user",
            "content": "小孩不爱写作业怎么办?"
        }
    ],
    "stream": false
}'

可见其就是个HTTPS的Post请求,我将其设定为一个助手(You are a helpful assistant),然后问他"小孩不爱写作业怎么办?"。回答如下:

`{
    "id": "5c2bcfcd-fb92-401f-a47b-cfbe2d7a3de3",
    "object": "chat.completion",
    "created": 1743340773,
    "model": "deepseek-reasoner",
    "choices": [
        {
            "index": 0,
            "message": {
                "role": "assistant",
                "content": "孩子不爱写作业是许多家长面临的挑战,以下是分步解决方案,帮助您有针对性地引导孩子...",
                "reasoning_content": "嗯,用户问的是小孩不爱写作业怎么办,这个问题挺常见的。..."
            },
            "logprobs": null,
            "finish_reason": "stop"
        }
    ],
    "usage": {
        "prompt_tokens": 17,
        "completion_tokens": 909,
        "total_tokens": 926,
        "prompt_tokens_details": {
            "cached_tokens": 0
        },
        "completion_tokens_details": {
            "reasoning_tokens": 332
        },
        "prompt_cache_hit_tokens": 0,
        "prompt_cache_miss_tokens": 17
    },
    "system_fingerprint": "fp_5417b77867_prod0225"
}

由于我使用的是deepseek-r1推理模型,所以返回值里面有"reasoning_content"这个属性。使用deepseek-v3也差不多,就是在request时换个模型名称,然后response中没有推理相关的属性了

request

curl --location 'https://api.deepseek.com/chat/completions' \
--header 'Content-Type: application/json' \
--header 'Authorization: ••••••' \
--header 'Cookie: HWWAFSESID=f10421b478ccdf4acce; HWWAFSESTIME=1742911657329' \
--data '{
    "model": "deepseek-chat",
    "messages": [
        {
            "role": "system",
            "content": "You are a helpful assistant."
        },
        {
            "role": "user",
            "content": "小孩不爱写作业怎么办?"
        }
    ],
    "stream": false
}'

response:

{
    "id": "5e509db2-d841-4570-952c-478273fe1ad9",
    "object": "chat.completion",
    "created": 1742912114,
    "model": "deepseek-chat",
    "choices": [
        {
            "index": 0,
            "message": {
                "role": "assistant",
                "content": "孩子不爱写作业是许多家长面临的常见问题,但通过理解原因、耐心引导和建立合适的习。"
            },
            "logprobs": null,
            "finish_reason": "stop"
        }
    ],
    "usage": {
        "prompt_tokens": 15,
        "completion_tokens": 666,
        "total_tokens": 681,
        "prompt_tokens_details": {
            "cached_tokens": 0
        },
        "prompt_cache_hit_tokens": 0,
        "prompt_cache_miss_tokens": 15
    },
    "system_fingerprint": "fp_3d5141a69a_prod0225"
}

如上可见,就是简单的API调用。但是要将其集成到现有的服务中却需要解决大量的问题,例如如何实现Tool calling, 如何实现RAG,如何实现聊天的memory,如何切换不同的模型等等问题

SpringAI的愿景就是要将这些繁杂的步骤抽象成一套标准流程,屏蔽掉其中的细节,进而协助我们对现有服务高效的实现AI赋能。

总结

本篇介绍了AI的基础概念,下篇开始实践,敬请关注

源码

一如既往,你可以在Github上找到相应的源码:

https://github.com/shusheng007/ai-exploration/tree/master/spring-ai-openai


Comment