
SpringAI+DeepSeek大模型应用开发——2 大模型应用开发架构
中检索出与查询最相关的文档片段。: 将检索到的文档片段与原始查询一起输入到大模型(如chatGPT)中,注意使用合适的提示词,比如原始的问题是XXX,检索到的信息是YY,给大模型的输入应该类似于: 请基于YYY回答XXXX。,就是在预训练大模型(比如DeepSeek、Qwen)的基础上,通过企业自己的数据做进一步的训练,使大模型的回答更符合自己企业的业务需求。由于每次都是从向量库中找出与用户问题相
目录
2.大模型开发
2.1 模型部署
首先大模型应用开发并不是在浏览器中跟AI聊天。而是通过访问模型对外暴露的API接口,实现与大模型的交互;
因此,需要有一个可访问的大模型,通常有三种选择:
2.1.1 云服务-开放大模型API
部署在云服务器上,部署维护简单,部署方案简单,全球访问 ,缺点:数据隐私,网络依赖,长期成本问题
通常发布大模型的官方、大多数的云平台都会提供开放的、公共的大模型服务。以下是一些国内提供大模型服务的云平台
这些开放平台并不是免费,而是按照调用时消耗的token来付费,每百万token通常在几毛~几元钱,而且平台通常都会赠送新用户百万token的免费使用权;
以百炼大模型为例 大模型服务平台百炼_企业级大模型开发平台_百炼AI应用构建-阿里云
注册一个阿里云账号==>然后访问百炼平台,开通服务(首次开通应该会赠送百万token的使用权,包括DeepSeek-R1模型、qwen模型。)
==>申请API_KEY(百炼平台右上角个人中心)==>创建APIKEY==>进入模型广场
选择一个自己喜欢的模型,然后点击API调用示例
,即可进入API文档页===>立即体验==>进入API调用大模型的试验台==>模拟调用大模型接口
2.1.2 本地部署
数据安全,不依赖网络,成本低,缺点:初期成本高,部署麻烦周期长
最简单的方案是使用ollama Download Ollama on macOS,当然这种方式不推荐,阉割版
访问官网下载查看对应模型的本地调用即可
在OllamaSetup.exe
所在目录打开cmd命令行,然后输入命令如下:
OllamaSetup.exe /DIR=你要安装的目录位置
安装完成后,还需要配置一个环境变量,更改Ollama下载和部署模型的位置。配置完成如图:
搜索模型
-
Ollama是一个模型管理工具和平台,它提供了很多国内外常见的模型,可以在其官网上搜索自己需要的模型:Ollama Search;
-
搜索DeepSeek-R1后,进入DeepSeek-R1页面,会发现DeepSeek-R1也有很多版本:
运行大模型
选择自己电脑合适的模型后,Ollama会给出运行模型的命令: 打开cmd运行即可
ollama run deepseek-r1:7b #运行大模型
/bye #退出当前大模型
ollama ps #查看运行的大模型
Ollama是一个模型管理工具,有点像Docker,而且命令也很像,常见命令如下:
ollama serve # Start ollama
ollama create # Create a model from a Modelfile
ollama show # Show information for a model
ollama run # Run a model
ollama stop # Stop a running model
ollama pull # Pull a model from a registry
ollama push # Push a model to a registry
ollama list # List models
ollama ps # List running models
ollama cp # Copy a model
ollama rm # Remove a model
ollama help # Help about any command
2.2 调用大模型
调用大模型并不是在浏览器中跟AI聊天,而是通过访问模型对外暴露的API接口,实现与大模型的交互;所以要学习大模型应用开发,就必须掌握模型的API接口规范;
目前大多数大模型都遵循OpenAI的接口规范,是基于Http协议的接口。因此请求路径、参数、返回值信息都是类似的,可能会有一些小的差别。具体需要查看大模型的官方API文档。
以DeepSeek官方给出的文档为例:
# 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(
# 2.1.选择要访问的模型
model="deepseek-chat",
# 2.2.发送给大模型的消息
messages=[
{"role": "system", "content": "You are a helpful assistant"},
{"role": "user", "content": "Hello"},
],
# 2.3.是否以流式返回结果
stream=False
)
print(response.choices[0].message.content)
接口说明
-
请求方式:通常是POST,因为要传递JSON风格的参数;
-
请求路径:与平台有关
-
DeepSeek官方平台:https://api.deepseek.com;
-
本地ollama部署的模型:http://localhost:11434;
-
-
安全校验:开放平台都需要提供API_KEY来校验权限,本地Ollama则不需要;
-
请求参数:参数很多,比较常见的有:
-
model
:要访问的模型名称;
-
messages
:发送给大模型的消息,是一个数组;
-
stream
:-
true
,代表响应结果流式返回;
-
false
,代表响应结果一次性返回,但需要等待;
-
-
temperature
:取值范围[0:2),代表大模型生成结果的随机性,越小随机性越低。DeepSeek-R1不支持;
-
-
注意,这里请求参数中的messages是一个消息数组,而且其中的消息要包含两个属性:
-
role
:消息对应的角色;
-
content
:消息内容;也被称为提示词(Prompt),也就是发送给大模型的指令。
-
提示词角色
常用的消息的角色有三种:
其中System类型的消息非常重要!影响了后续AI会话的行为模式;
-
比如,当我们询问AI对话产品(文心一言、DeepSeek等)“你是谁” 这个问题的时候,每一个AI的回答都不一样,这是怎么回事呢?
-
这其实是因为AI对话产品并不是直接把用户的提问发送给LLM,通常都会在user提问的前面通过System消息给模型设定好背景
-
所以,当你问问题时,AI就会遵循System的设定来回答了。因此,不同的大模型由于System设定不同,回答的答案也不一样;
## Role
System: 你是邓超
## Example
User: 你是谁
Assisant: 到!gogogo,黑咖啡品味有多浓!我只要汽水的轻松,大热天做个白日梦,梦见我变成了彩虹
我是邓超啊!哈哈,你没看错,就是那个又帅又幽默的邓超!怎么样,是不是被我的魅力惊到了?😎
会话记忆问题
为什么要把历史消息都放入Messages中,形成一个数组呢?
这是因为大模型是没有记忆的,因此在调用API接口与大模型对话时,每一次对话信息都不会保留,但是可以发现AI对话产品却能够记住每一轮对话信息,根据这些信息进一步回答,这是怎么回事呢?
答案就是Messages数组;
只需要每一次发送请求时,都把历史对话中每一轮的User消息、Assistant消息都封装到Messages数组中,一起发送给大模型,这样大模型就会根据这些历史对话信息进一步回答,就像是拥有了记忆一样;
2.3 大模型应用开发架构
2.3.1 技术架构
目前,大模型应用开发的技术架构主要有四种
纯Prompt模式
不同的提示词能够让大模型给出差异巨大的答案;
不断雕琢提示词,使大模型能给出最理想的答案,这个过程就叫做提示词工程(Prompt Engineering);
很多简单的AI应用,仅仅靠一段足够好的提示词就能实现了,这就是纯Prompt模式;流程如图:
FunctionCalling
大模型虽然可以理解自然语言,更清晰地弄懂用户意图,但是确无法直接操作数据库、执行严格的业务规则。这个时候就可以整合传统应用与大模型的能力了;
-
把传统应用中的部分功能封装成一个个函数(Function);
-
在提示词中描述用户的需求,并且描述清楚每个函数的作用,要求AI理解用户意图,判断什么时候需要调用哪个函数,并且将任务拆解为多个步骤(Agent);
-
当AI执行到某一步,需要调用某个函数时,会返回要调用的函数名称、函数需要的参数信息;
-
传统应用接收到这些数据以后,就可以调用本地函数。再把函数执行结果封装为提示词,再次发送给AI;
-
以此类推,逐步执行,直到达成最终结果。
RAG检索增强
检索增强生成(Retrieval-Augmented Generation,简称RAG)已成为构建智能问答系统的关键技术。
模型从知识角度存在很多限制:
-
时效性差:大模型训练比较耗时,其训练数据都是旧数据,无法实时更新;
-
缺少专业领域知识:大模型训练数据都是采集的通用数据,缺少专业数据;
把最新的数据或者专业文档都拼接到提示词,一起发给大模型,不就可以了?
现在的大模型都是基于Transformer神经网络,Transformer的强项就是所谓的注意力机制。它可以根据上下文来分析文本含义
但是,上下文的大小是有限制的,GPT3刚刚出来的时候,仅支持2000个token的上下文。所以海量知识库数据是无法直接写入提示词的;
RAG原理
RAG 的核心原理是将检索技术与生成模型相结合,结合外部知识库或私有数据源来检索相关信息来指导和增强生成模型的输出,有效解决了传统大语言模型的知识更新滞后和"幻觉"问题。
其核心工作流程分为三个阶段:
-
接收请求: 首先,系统接收到用户的请求(例如提出一个问题)
-
信息检索(R): 系统从一个大型文档库中检索出与查询最相关的文档片段。这一步的目标是找到那些可能包含答案或相关信息的文档。这里不一定是从向量数据库中检索,但是向量数据库能反应相似度最高的几个文档(比如说法不同,意思相同),而不是精确查找
-
文本拆分:将文本按照某种规则拆分为很多片段;
-
文本嵌入(Embedding):根据文本片段内容,将文本片段归类存储;
-
文本检索:根据用户提问的问题,找出最相关的文本片段;
-
-
生成增强(A): 将检索到的文档片段与原始查询一起输入到大模型(如chatGPT)中,注意使用合适的提示词,比如原始的问题是XXX,检索到的信息是YY,给大模型的输入应该类似于: 请基于YYY回答XXXX。
-
输出生成(G): 大模型LLM 基于输入的查询和检索到的文档片段生成最终的文本答案,并返回给用户
由于每次都是从向量库中找出与用户问题相关的数据,而不是整个知识库,所以上下文就不会超过大模型的限制,同时又保证了大模型回答问题是基于知识库中的内容;
Fine-tuning
模型微调,就是在预训练大模型(比如DeepSeek、Qwen)的基础上,通过企业自己的数据做进一步的训练,使大模型的回答更符合自己企业的业务需求。这个过程通常需要在模型的参数上进行细微的修改,以达到最佳的性能表现;
在进行微调时,通常会保留模型的大部分结构和参数,只对其中的一小部分进行调整。减少了训练时间和计算资源的消耗。
微调的过程包括以下几个关键步骤:
-
选择合适的预训练模型:根据任务的需求,选择一个已经在大量数据上进行过预训练的模型,如Qwen-2.5;
-
准备特定领域的数据集:收集和准备与任务相关的数据集,这些数据将用于微调模型;
-
设置超参数:调整学习率、批次大小、训练轮次等超参数,以确保模型能够有效学习新任务的特征;
-
训练和优化:使用特定任务的数据对模型进行训练,通过前向传播、损失计算、反向传播和权重更新等步骤,不断优化模型的性能;
2.3.2 技术选型
-
从开发成本由低到高来看,四种方案的排序:
Prompt < Function Calling < RAG < Fine-tuning
-
所以在选择技术时通常也应该遵循"在达成目标效果的前提下,尽量降低开发成本"这一首要原则。然后可以参考以下流程来思考:
更多推荐
所有评论(0)