SpringAI+DeepSeek大模型應用開發——2 大模型應用開發架構

目錄

2.大模型開發

2.1 模型部署

2.1.1 云服務-開放大模型API

2.1.2 本地部署

搜索模型

運行大模型

2.2 調用大模型

接口說明

提示詞角色

?編輯

會話記憶問題

2.3 大模型應用開發架構

2.3.1 技術架構

純Prompt模式

FunctionCalling

RAG檢索增強

Fine-tuning

2.3.2 技術選型

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;

    • 阿里云百煉平臺:https://dashscope.aliyuncs.com/compatible-mode/v1;

    • 本地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

大模型雖然可以理解自然語言,更清晰地弄懂用戶意圖,但是確無法直接操作數據庫、執行嚴格的業務規則。這個時候就可以整合傳統應用與大模型的能力了;

  1. 把傳統應用中的部分功能封裝成一個個函數(Function);

  2. 在提示詞中描述用戶的需求,并且描述清楚每個函數的作用,要求AI理解用戶意圖,判斷什么時候需要調用哪個函數,并且將任務拆解為多個步驟(Agent);

  3. 當AI執行到某一步,需要調用某個函數時,會返回要調用的函數名稱、函數需要的參數信息;

  4. 傳統應用接收到這些數據以后,就可以調用本地函數。再把函數執行結果封裝為提示詞,再次發送給AI;

  5. 以此類推,逐步執行,直到達成最終結果。

RAG檢索增強

檢索增強生成(Retrieval-Augmented Generation,簡稱RAG)已成為構建智能問答系統的關鍵技術。

模型從知識角度存在很多限制:

  • 時效性差:大模型訓練比較耗時,其訓練數據都是舊數據,無法實時更新;

  • 缺少專業領域知識:大模型訓練數據都是采集的通用數據,缺少專業數據;

把最新的數據或者專業文檔都拼接到提示詞,一起發給大模型,不就可以了?

現在的大模型都是基于Transformer神經網絡,Transformer的強項就是所謂的注意力機制。它可以根據上下文來分析文本含義

但是,上下文的大小是有限制的,GPT3剛剛出來的時候,僅支持2000個token的上下文。所以海量知識庫數據是無法直接寫入提示詞的;

RAG原理

RAG 的核心原理是將檢索技術與生成模型相結合,結合外部知識庫或私有數據源來檢索相關信息來指導和增強生成模型的輸出,有效解決了傳統大語言模型的知識更新滯后和"幻覺"問題。

其核心工作流程分為三個階段:

  1. 接收請求: 首先,系統接收到用戶的請求(例如提出一個問題)

  2. 信息檢索(R): 系統從一個大型文檔庫中檢索出與查詢最相關的文檔片段。這一步的目標是找到那些可能包含答案或相關信息的文檔。這里不一定是從向量數據庫中檢索,但是向量數據庫能反應相似度最高的幾個文檔(比如說法不同,意思相同),而不是精確查找

    • 文本拆分:將文本按照某種規則拆分為很多片段;

    • 文本嵌入(Embedding):根據文本片段內容,將文本片段歸類存儲;

    • 文本檢索:根據用戶提問的問題,找出最相關的文本片段;

  3. 生成增強(A): 將檢索到的文檔片段與原始查詢一起輸入到大模型(如chatGPT)中,注意使用合適的提示詞,比如原始的問題是XXX,檢索到的信息是YY,給大模型的輸入應該類似于: 請基于YYY回答XXXX。

  4. 輸出生成(G): 大模型LLM 基于輸入的查詢和檢索到的文檔片段生成最終的文本答案,并返回給用戶

由于每次都是從向量庫中找出與用戶問題相關的數據,而不是整個知識庫,所以上下文就不會超過大模型的限制,同時又保證了大模型回答問題是基于知識庫中的內容;

Fine-tuning

模型微調,就是在預訓練大模型(比如DeepSeek、Qwen)的基礎上,通過企業自己的數據做進一步的訓練,使大模型的回答更符合自己企業的業務需求。這個過程通常需要在模型的參數上進行細微的修改,以達到最佳的性能表現;

在進行微調時,通常會保留模型的大部分結構和參數,只對其中的一小部分進行調整。減少了訓練時間和計算資源的消耗。

微調的過程包括以下幾個關鍵步驟:

  1. 選擇合適的預訓練模型:根據任務的需求,選擇一個已經在大量數據上進行過預訓練的模型,如Qwen-2.5;

  2. 準備特定領域的數據集:收集和準備與任務相關的數據集,這些數據將用于微調模型;

  3. 設置超參數:調整學習率、批次大小、訓練輪次等超參數,以確保模型能夠有效學習新任務的特征;

  4. 訓練和優化:使用特定任務的數據對模型進行訓練,通過前向傳播、損失計算、反向傳播和權重更新等步驟,不斷優化模型的性能;

2.3.2 技術選型
  • 從開發成本由低到高來看,四種方案的排序:Prompt < Function Calling < RAG < Fine-tuning

  • 所以在選擇技術時通常也應該遵循"在達成目標效果的前提下,盡量降低開發成本"這一首要原則。然后可以參考以下流程來思考:

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/901983.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/901983.shtml
英文地址,請注明出處:http://en.pswp.cn/news/901983.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

藍橋杯12. 日期問題

日期問題 原題目鏈接 題目描述 小明正在整理一批歷史文獻。這些歷史文獻中出現了很多日期。 小明知道這些日期都在 1960 年 1 月 1 日 至 2059 年 12 月 31 日 之間。 令小明頭疼的是&#xff0c;這些日期采用的格式非常不統一&#xff1a; 有的采用 年/月/日有的采用 月…

STM32使用rand()生成隨機數并顯示波形

一、隨機數生成 1、加入頭文件&#xff1a;#include "stdlib.h" 2、定義一個用作生成隨機數種子的變量并加入到滴答定時器中不斷自增&#xff1a;uint32_t run_times 0; 3、設置種子&#xff1a;srand(run_times);//每次生成隨機數前調用一次為佳 4、生成一個隨…

『前端樣式分享』聯系我們卡片式布局 自適應屏幕 hover動效 在wikijs中使用 (代碼拿來即用)

目錄 預覽效果分析要點響應式網格布局卡片樣式&#xff1a;陰影和過渡效果 代碼優化希望 長短不一的郵箱地址在左右居中的同時,做到左側文字對齊(wikijs可用)總結 歡迎關注 『前端布局樣式』 專欄&#xff0c;持續更新中 歡迎關注 『前端布局樣式』 專欄&#xff0c;持續更新中…

【ubuntu】在Linux Yocto的基礎上去適配Ubuntu的wifi模塊

一、修改wifi的節點名 1.找到wifi模塊的PID和VID ifconfig查看wifi模塊網絡節點的名字&#xff0c;發現是wlx44876393bb3a&#xff08;wlxmac地址&#xff09; 通過udevadm info -a /sys/class/net/wlx44876393bba路徑的命令去查看wlx44876393bba的總線號&#xff0c;端口號…

健康養生:開啟活力生活新篇章

在當代社會&#xff0c;熬夜加班、久坐不動、外賣快餐成為許多人的生活常態&#xff0c;隨之而來的是各種亞健康問題。想要擺脫身體的疲憊與不適&#xff0c;健康養生迫在眉睫&#xff0c;它是重獲活力、擁抱美好生活的關鍵。? 應對不良飲食習慣帶來的健康隱患&#xff0c;飲…

【verilog】多個 if 控制同一個變量(后面會覆蓋前面)非阻塞賦值真的并行嗎?

非阻塞賦值 (<) 是“并行”的&#xff0c;但是代碼順序會影響結果&#xff1f;”這正是 Verilog 的硬件描述本質 vs 行為語義之間的微妙之處。 &#x1f4a1;1. 非阻塞賦值真的并行嗎&#xff1f; 是的&#xff01;非阻塞賦值 < 從行為上是并行的&#xff0c;也就是說&a…

前沿篇|CAN XL 與 TSN 深度解讀

引言 1. CAN XL 標準演進與設計目標 2. CAN XL 物理層與幀格式詳解 3. 時間敏感網絡 (TSN) 關鍵技術解析 4. CAN XL + TSN 在自動駕駛領域的典型應用

vscode、cherry studio接入高德mcp服務

最近mcp協議比較火&#xff0c;好多平臺都已經開通了mcp協議&#xff0c;今天來接入下高德的mcp看看效果如何。 話不多說&#xff0c;咱們直接開干。 先來看下支持mcp協議的工具有cusor、cline等等。更新cherrystudio后發現上面也有mcp服務器了。今天咱就來試試添加高德的mcp協…

Triton(2)——Triton源碼接結構

1 triton 3.0.0 源碼結構 triton docs/&#xff1a;項目文檔 cmake/&#xff1a;構建配置相關 bin/&#xff1a;工具、腳本 CmakeLists.txt&#xff1a;cmake 配置文件 LSCENSE README.md Pyproject.toml&#xff1a;python 項目配置文件 utils/&#xff1a;項目配置文…

React 事件處理基礎

React 中最常見的兩個需求&#xff0c;一個是列表渲染&#xff0c;另一個就是綁定點擊事件。 這一篇就是從最基礎的按鈕點擊開始&#xff0c;分四個階段&#xff0c;逐步理解 React 中事件的寫法和參數傳遞方式。 &#x1f4cd;階段一&#xff1a;最簡單的點擊事件 function A…

java的lambda和stream流操作

Lambda 表達式 ≈ 匿名函數 &#xff08;Lambda接口&#xff09;函數式接口&#xff1a;傳入Lambda表達作為函數式接口的參數 函數式接口 只能有一個抽象方法的接口 Lambda 表達式必須賦值給一個函數式接口&#xff0c;比如 Java 8 自帶的&#xff1a; 接口名 作用 Functio…

Dify智能體平臺源碼二次開發筆記(6) - 優化知識庫pdf文檔的識別

目錄 前言 新增PdfNewExtractor類 替換ExtractProcessor類 最終結果 前言 dify的1.1.3版本知識庫pdf解析實現使用pypdfium2提取文本&#xff0c;主要存在以下問題&#xff1a; 1. 文本提取能力有限&#xff0c;對表格和圖片支持不足 2. 缺乏專門的中文處理優化 3. 沒有文檔結…

easyExcel單元格合并

環境 java 1.8 easyexcel 3.1.1 實現方式 自定義WriteHandler&#xff0c;實現AbstractMergeStrategy抽象類&#xff0c;實現merge 方法完成自定義的合并操作。 本測試代碼&#xff0c;實現了eques方法&#xff0c;用于判斷是否需要合并 核心代碼 實現AbstractMergeStrate…

Jenkins 簡易使用記錄

一、Jenkins 核心功能與適用場景 核心功能&#xff1a; 持續集成&#xff08;CI&#xff09;&#xff1a;自動構建代碼、運行單元測試。持續交付&#xff08;CD&#xff09;&#xff1a;自動化部署到測試/生產環境。任務調度&#xff1a;定時執行任務&#xff08;如備份、清理&…

【HFP】藍牙HFP協議音頻連接核心技術深度解析

目錄 一、音頻連接建立的總體要求 1.1 發起主體與時機 1.2 前提條件 1.3 同步連接的建立 1.4 通知機制 二、不同主體發起的音頻連接建立流程 2.1 連接建立觸發矩陣 2.2 AG 發起的音頻連接建立 2.3 HF 發起的音頻連接建立 三、編解碼器連接建立流程 3.1 發起條件 3.…

【卡洛詩】成為平價市場中的標桿西餐廳

近年來&#xff0c;中國餐飲市場在消費分級趨勢下面臨結構性調整&#xff0c;消費者對“質價比”的追求催生了新賽道的崛起。在這一背景下&#xff0c;卡洛詩西餐憑借精準的定位與系統性創新&#xff0c;以“中式西餐”為核心理念&#xff0c;成功打破西餐高價壁壘&#xff0c;…

嵌入式設備網絡的動態ID分配機制實現

文章目錄 前言一、系統設計要點二、核心數據結構2.1 設備唯一標識(DeviceUID)2.2 節點信息(Node)2.3 節點管理器(NodeManager) 三、核心算法實現3.1 初始化與清理3.1.1 初始化節點管理器3.1.2 清理節點管理器 3.2 動態ID分配策略3.2.1 查找最小可用ID3.2.2 ID使用檢查 3.3 心跳…

WebSocket 雙向通信技術詳解

引言 在現代Web應用中&#xff0c;實時通信已經成為不可或缺的一部分。想象一下聊天應用、在線游戲、股票交易平臺或協作工具&#xff0c;這些應用都需要服務器能夠即時將更新推送給客戶端&#xff0c;而不僅僅是等待客戶端請求。WebSocket技術應運而生&#xff0c;它提供了一…

kafka菜鳥教程

一、kafka原理 1、kafka是一個高性能的消息隊列系統&#xff0c;能夠處理大規模的數據流&#xff0c;并提供低延遲的數據傳輸&#xff0c;它能夠以每秒數十萬條消息的速度進行讀寫操作。 二、kafka優點 1、服務解耦 &#xff08;1&#xff09;提高系統的可維護性? 通過服務…

SQLMap工具使用

一、SQLMap介紹 SQLMap 是一款強大的開源自動化 SQL 注入工具&#xff0c;用于檢測和利用 Web 應用程序中的 SQL 注入漏洞。其工作原理是SQLMap 通過向目標 URL 發送帶有特殊構造的 SQL 語句的請求&#xff0c;觀察目標應用程序的響應&#xff0c;來判斷是否存在 SQL 注入漏洞…