手擼一個 deepseek 數據庫對話,打造一個企業智能通訊錄(ollama + deepseek + langchain)

前言
由于 deepseek 等大語言模型數據時效性問題,無法跟上現實世界信息的動態變化,企業內部信息更是無法理解,為了將 deepseek 應用到企業內部,之前有寫過通過聯網搜索、上傳文件、搭建知識等檢索增強生成(RAG)方式,現在繼續探討如何通過結合數據庫來實現問答。

一、準備環境

  1. ollama,用于在本地運行、部署和管理大型語言模型(LLMs)。
  2. deepseek 模型,本文用的 deepseek-r1:14b。
  3. langchain,大語言模型應用程序的開發框架,主要 python 實現。
  4. Mysql,這里建議單獨部署一個專門用來數據庫問答,避免影響生產環境。

二、開發思路

本文打算通過三張表,用戶基本信息表,公司/部門信息表,一個用戶與公司/部門關聯表,再結合 deepseek 根據用戶問答使用自然語言流暢問答,打造一個企業智能通訊錄。

  1. 使用 deepseek 生成可執行的 sql 語句,langchain 自帶了一些模塊,比如:
  • create_sql_query_chain:基于用戶自然語言問題構建SQL查詢
  • SQLDatabaseChain:使用鏈進行查詢、創建和執行來查詢SQL數據庫
  • create_sql_agent:使用代理進行健壯和靈活的與SQL數據庫交互

發現還是不太理想,決定還是讓 deepseek 根據”表結構 + 提示詞 + 使用示例“來生成 sql 語句。

  1. 對生成的 sql 語句進行清洗,比如推理思考過程、markdown標簽、其他無關信息等,提取出可直接執行的純 sql 。
  2. 執行 sql 獲取結果,在讓 deepseek 根據”表結構 + 提示詞 + 執行的SQL + 執行結果",來回答。

三、代碼解讀

  1. 準備好用戶、組織架構方面的表,注意以下幾點:
  • 去掉用不著的字段,防止干擾 deepseek 思考
  • 去掉敏感字段,比如密碼、身份證
  • 每個字段用自然語言添加注釋
  • 有關聯關系的字段,注釋清楚
  • 每張表用自然語言添加注釋
  • 由于表結構后續還會用到,建議單獨放一個文件

新建一個文件 “table_schema”,寫入表結構信息,這是我準備的表:

- 用戶信息表
CREATE TABLE `uc_user` (`ID` varchar(192) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT '主鍵,用戶ID',`USER_NAME` varchar(192) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL COMMENT '名稱',`ACCOUNT` varchar(192) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL COMMENT '賬號',`GENDER` varchar(96) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL COMMENT '性別 男:F-男 女:F-女',`EMAIL` varchar(192) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL COMMENT '郵箱',`PHONE` varchar(48) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL COMMENT '手機號碼',`ADDRSS` text CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci COMMENT '地址',`CREATE_DATE` datetime DEFAULT NULL COMMENT '創建時間',`MODIFY_DATE` datetime DEFAULT NULL COMMENT '修改時間',`STATUS` varchar(6) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL COMMENT '狀態 1:正常 0:禁用',`REMARK` text CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci COMMENT '備注',`CREATE_ID` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL COMMENT '創建人id,用戶表主鍵',`into_date` varchar(50) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL COMMENT '入職日期',PRIMARY KEY (`ID`) USING BTREE,KEY `idx_user_name` (`USER_NAME`) USING BTREE,KEY `idx_account` (`ACCOUNT`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COMMENT='用戶信息表';- 公司/部門信息表
CREATE TABLE `uc_organization` (`ID` varchar(192) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT '主鍵',`ORG_CODE` varchar(60) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL COMMENT '部門編碼',`ORG_NAME` text CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci COMMENT '部門或公司名稱',`PARENT_ORG_ID` text CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci COMMENT '上級部門/公司ID,公司/部門信息表主鍵',`ORG_PATH_NAME` text CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci COMMENT '組織架構全路徑',`SORT` int DEFAULT NULL COMMENT '排序號',`ORG_TYPE` varchar(150) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL COMMENT '組織類型:0.根組 1.分公司 2.子公司 3.部門',`CREATE_ID` varchar(192) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL COMMENT '創建人ID,用戶表的主鍵',`CREATE_DATE` datetime DEFAULT NULL COMMENT '創建時間',`MODIFY_ID` varchar(192) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL COMMENT '修改人ID,用戶表的主鍵',`MODIFY_DATE` datetime DEFAULT NULL COMMENT '修改時間',`STATE` varchar(10) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT '狀態 1:正常 0:禁止',`ADDR` text CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci COMMENT '詳細地址',PRIMARY KEY (`ID`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COMMENT='公司/部門信息表';- 用戶和部門/公司關聯表
CREATE TABLE `uc_user_app_relation` (`USER_ID` varchar(192) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL COMMENT '用戶ID,用戶表的主鍵',`STATUS` varchar(6) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT '狀態 1:正常 0:禁用',`COMPANY_ID` varchar(192) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL COMMENT '公司ID,組織和公司表的主鍵',`ORG_ID` varchar(192) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL COMMENT '部門ID,組織和公司表的主鍵',`CREATE_DATE` datetime DEFAULT NULL COMMENT '創建時間',`MODIFY_DATE` datetime DEFAULT NULL COMMENT '修改時間',`CREATE_ID` varchar(192) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL COMMENT '創建人ID',KEY `idx_user_id` (`USER_ID`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COMMENT='用戶和部門/公司關聯表';

這里的表稍微有點復雜,主要在 uc_organization 表,即有公司又有部門,還有上下級關系,所以接下來寫系統提示詞。

  1. 假如不知道怎么寫系統提示詞的,可以去 deepseek 官網看示例,然后慢慢調整。

官網:https://api-docs.deepseek.com/zh-cn/prompt-library/

在這里插入圖片描述
提示詞:

### 你是一個的 MYSQL 專家給定輸入問題,根據提供的表結構信息,將自然語言查詢需求轉換為準確且可執行的SQL語句。**表結構信息**{table_schema}## 查詢需求
1. 用清晰的自然語言描述查詢需求,包括:
- 需要獲取的數據字段
- 篩選條件
- 排序要求
- 聚合需求(如求和/計數/平均值等)
- 多表關聯需求
2. 生成智能模糊查詢,包括:
- 輸入參數:`[用戶輸入的簡稱片段]` 
- 匹配字段:`[目標字段名]`
- 預期效果:智能匹配包含輸入詞素及其變體的全稱
- 特殊要求:`[分詞處理/同義詞擴展/優先級排序]`## 約束條件
- 嚴格基于提供的表結構生成
- 優先使用標準SQL語法
- 不準捏造字段
- 不要列出系統字段,如主鍵、創建日期、修改日期等
- 每張表查詢都要帶上正常狀態!!!不管單表還是多表查詢,特別多表查詢主表也要加上正常狀態!!!
- 使用規范的SQL格式:關鍵字大寫、適當縮進、使用表別名時保持一致性、避免使用*選擇所有列
- 必須直接輸出SQL語句,不要其他內容,不要分步驟列出
- 只能生成SELECT查詢語句### 不準捏造表和字段!!!
### 主表一定要加上狀態查詢!!!

這里踩的坑有點多,比如:

  • 每張表都有狀態字段,都需要帶上這個查詢條件,類似的很多系統也有軟刪除 is_deleted 字段,要著重強調
  • 我們習慣性的會問公司簡稱,需要加上模糊搜索
  • 有時候 deepseek 會捏造字段,也要特別注意

到這里 deepseek 對于單表生成 sql 還可以,但是多表查詢,特別表結構又復雜,需要引導 deepseek 如何生成,這就體現了參考示例的作用,寫幾個稍微復雜的 sql 查詢示例讓 deepseek 理解,如下:

  • 查詢某個用戶信息
SELECT u.USER_NAME AS 姓名,u.ACCOUNT AS 賬號,u.GENDER AS 性別,u.EMAIL AS 郵箱,u.PHONE AS 手機號碼,u.ADDRSS AS 地址,u.into_date AS 入職日期,o.ORG_NAME AS 公司名稱,d.ORG_NAME AS 部門名稱
FROM uc_user u
LEFT JOIN uc_user_app_relation r ON u.ID = r.USER_ID AND r.STATUS = '1'
LEFT JOIN uc_organization o ON r.COMPANY_ID = o.ID
LEFT JOIN uc_organization d ON r.ORG_ID = d.ID
WHERE u.USER_NAME = '某某某';
GROUP BY u.ID;
  • 查詢某個公司下面人員清單
SELECT u.USER_NAME AS 姓名,u.ACCOUNT AS 賬號,u.GENDER AS 性別,u.EMAIL AS 郵箱,u.PHONE AS 手機號碼,u.ADDRSS AS 地址,u.into_date AS 入職日期,o.ORG_NAME AS 部門名稱,c.ORG_NAME AS 公司名稱
FROM uc_user u
LEFT JOIN uc_user_app_relation r ON u.ID = r.USER_ID
LEFT JOIN uc_organization o ON r.ORG_ID = o.ID
LEFT JOIN uc_organization c ON r.COMPANY_ID = c.ID
WHERE u.STATUS = '1' AND r.STATUS = '1' AND o.STATE = '1' AND c.STATE = '1'  AND c.ORG_NAME LIKE '%某某公司%'
  • 查詢某個公司某個部門下面的人員清單
SELECT u.USER_NAME AS 姓名,u.ACCOUNT AS 賬號,u.GENDER AS 性別,u.EMAIL AS 郵箱,u.PHONE AS 手機號碼,u.ADDRSS AS 地址,u.into_date AS 入職日期,o.ORG_NAME AS 部門名稱,c.ORG_NAME AS 公司名稱
FROM uc_user u
LEFT JOIN uc_user_app_relation r ON u.ID = r.USER_ID
LEFT JOIN uc_organization o ON r.ORG_ID = o.ID
LEFT JOIN uc_organization c ON r.COMPANY_ID = c.ID
WHERE u.STATUS = '1' AND r.STATUS = '1' AND o.STATE = '1' AND c.STATE = '1'  AND c.ORG_NAME LIKE '%某某公司%' AND o.ORG_NAME LIKE '%某某部門%'
  • 某某公司的子公司清單
SELECT c.ORG_NAME AS 公司名稱,p.ORG_NAME AS 上級公司名稱,c.ORG_PATH_NAME AS 組織架構全路徑 
FROM uc_organization c
LEFT JOIN uc_organization p ON c.PARENT_ORG_ID = p.ID 
WHERE c.STATE = '1' AND p.STATE = '1' AND c.ORG_TYPE < 3 AND p.ORG_NAME LIKE '%某某公司%'
ORDER BY c.ORG_PATH_NAME;
  • 某某公司的部門清單
SELECT c.ORG_NAME AS 部門名稱,p.ORG_NAME AS 上級部門名稱,c.ORG_PATH_NAME AS 組織架構全路徑 
FROM uc_organization c
LEFT JOIN uc_organization p ON c.PARENT_ORG_ID = p.ID 
WHERE c.STATE = '1' AND p.STATE = '1' AND c.ORG_TYPE = 3 AND p.ORG_NAME LIKE '%某某公司%'
ORDER BY c.ORG_PATH_NAME;

直接將參考示例放到提示詞下面就好了(代碼有 ```sql 標簽貼出格式就亂了,大家自己搞一下)

在這里插入圖片描述

  1. deepseek 生成的內容帶了推理過程和標簽,直接用正則過濾一下。

代碼:

def extract_sql_blocks(text):# 使用正則表達式匹配非貪婪模式,并包含換行符pattern = r'```sql(.*?)```'matches = re.findall(pattern, text, re.DOTALL)# 去除每個匹配項兩端的空白字符return [match.strip() for match in matches]def remove_think_tags(text):"""移除文本中<think>標簽及其內容"""pattern = re.compile(r'<think>.*?</think>', re.DOTALL)  # 非貪婪匹配 + 跨行匹配return pattern.sub('', text)

過濾之前:

在這里插入圖片描述
過濾之后:

在這里插入圖片描述
4. 執行 sql 獲取查詢結果

mysql_uri = "mysql+mysqlconnector://test:123456@127.0.0.1:3306/test"
db = SQLDatabase.from_uri(mysql_uri)
query_result = db.run(query_sql)
  1. 將表結構、提示詞、執行sql、返回結果全都給 deepseek 回答,提示詞模板如下:
**指令**
你是一個數據庫專家,根據表結構、查詢sql、查詢結果,回答用戶問題,如果查詢結果為空,直接回復”暫未找到您要的信息“。**數據庫表結構**
{query_tables}**查詢sql**
{query_sql}**查詢結果**
{query_result}## 要求:
1. 用自然語言總結查詢結果,回答用戶的問題,不允許在回答中添加編造成分,回答請使用中文。
2. 字段請用中文描述,沒有中文注釋的不返回。

代碼:

def start_chat_mysql(query, model):# 根據自定義提示詞寫出SQL語句response = create_query_sql(query)# 過濾推理和無關信息,只保留可執行的SQLsqls = extract_sql_blocks(remove_think_tags(response))query_sql = sqls[0]# print(query_sql)# 初始化數據庫連接db = SQLDatabase.from_uri(mysql_uri)# 執行查詢query_result = db.run(query_sql)# 初始化LLM和鏈llm = get_chat_llm(model)prompt = get_answer_prompt()chain = prompt | llmwith open("table_schema", "r", encoding="utf-8") as file:table_schema = file.read()response = chain.invoke({"query_tables": table_schema,"query_sql": query_sql,"query_result": query_result,"input": query})return response

沒有找到的時候,deepseek 回答:

在這里插入圖片描述

找到的時候, deepseek 回答:

在這里插入圖片描述

完整代碼私信要吧~ 這里貼出來格式沖突不太好看

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

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

相關文章

線段樹SegmentTree

線段樹當中的幾個重要操作 1.PushUp 上推操作&#xff1a;由子節點算父節點的信息 p u s h u p push up pushup 操作的目的是為了維護父子節點之間的邏輯關系。當我們遞歸建樹時&#xff0c;對于每一個節點我們都需要遍歷一遍&#xff0c;并且電腦中的遞歸實際意義是先向底層…

SSH免密登錄服務器方法

Window免密連接Linux系統 生成公匙 ssh-keygen -t rsa一路回車生成公鑰 復制公匙&#xff0c;使用記事本打開復制全部內容 notepad C:\Users\DELL\.ssh\id_rsa.pub內容如"ssh-rsa AAAAB3NzaC1yc2EAAAA…" 遠程登錄服務器將內容寫入~/.ssh/authorized_keys echo …

Go 1.24 新特性解析:泛型類型別名、弱指針與終結器改進

文章精選推薦 1 JetBrains Ai assistant 編程工具讓你的工作效率翻倍 2 Extra Icons&#xff1a;JetBrains IDE的圖標增強神器 3 IDEA插件推薦-SequenceDiagram&#xff0c;自動生成時序圖 4 BashSupport Pro 這個ides插件主要是用來干嘛的 &#xff1f; 5 IDEA必裝的插件&…

MySQL 表 t1 建立聯合索引 (a, b, c),在 where a < ? and b > ? and c < ? 中哪些索引生效

文章目錄 聯合索引 abc 均范圍掃描時的索引生效情況無回表 表數據量非常少無回表 表數據量多有回表總結 聯合索引 abc 均范圍掃描時的索引生效情況 場景&#xff1a;表 t1 建立聯合索引 (a, b, c)&#xff0c;在 where a < ? and b > ? and c < ? 中哪些索引生效…

海外營收占比近4成,泡泡瑪特全球化戰略迎收獲期

3月26日&#xff0c;泡泡瑪特國際集團發布2024全年財報。財報顯示&#xff0c;2024年泡泡瑪特實現營收130.4億元&#xff08;人民幣&#xff0c;下同&#xff09;&#xff0c;同比增長106.9%&#xff0c;經調整凈利潤34.0億元&#xff0c;同比增長185.9%。中國內地營收79.7億元…

ctf-web: 不統一的解析 + sql注入要求輸入與輸出相等 -- tpctf supersqli

# 從 django.shortcuts 模塊導入 render 函數&#xff0c;用于渲染模板 from django.shortcuts import render # 從 django.db 模塊導入 connection 對象&#xff0c;用于數據庫連接 from django.db import connection# 此模塊用于創建視圖函數 # 從 django.http 模塊導入 Http…

LLM推理加速框架有哪些

LLM推理加速框架有哪些 目錄 LLM推理加速框架有哪些1. TensorRT簡介簡單使用示例2. Triton Inference Server簡介簡單使用示例3. SGLang簡介簡單使用示例4. vLLM簡介簡單使用示例1. TensorRT 簡介 TensorRT 是 NVIDIA 推出的一個用于高性能深度學習推理的 SDK。它能夠對訓練好…

【深度學習與實戰】2.1、線性回歸模型與梯度下降法先導案例--最小二乘法(向量形式求解)

為了求解損失函數 對 的導數&#xff0c;并利用最小二乘法向量形式求解 的值&#xff0c;我們按照以下步驟進行&#xff1a; ?1. 損失函數的含義? 這是?線性回歸?的平方誤差損失函數&#xff0c;目標是最小化預測值 與真實值 之間的差距。 ?定義損失函數?&#xf…

S7-1200對V90 PN進行位置控制的三種方法

S7-1200系列PLC通過PROFINET與V90 PN伺服驅動器搭配進行位置控制,實現的方法主要有以下三種: ? 方法一、在PLC中組態位置軸工藝對象,V90使用標準報文3,通過MC_Power、MC_MoveAbsolute等PLC Open標準程序塊進行控制, 這種控制方式屬于中央控制方式(位置控制在PLC中計算,驅…

愛普生FC-135晶振5G手機的極端溫度性能守護者

在5G時代&#xff0c;智能手機不僅需要高速率與低延遲&#xff0c;更需在嚴寒、酷暑、振動等復雜環境中保持穩定運行。作為 5G 手機的核心時鐘源&#xff0c;愛普生32.768kHz晶振FC-135憑借其寬溫適應性、高精度穩定性與微型化設計&#xff0c;成為5G手機核心時鐘源的理想選擇&…

ROS--IMU數據包

IMU慣性測量單元 一&#xff1a;IMU二&#xff1a;ROS中三&#xff1a;IMU數據包三&#xff1a;總結 提示&#xff1a;以下是本篇文章正文內容&#xff0c;下面案例可供參考 一&#xff1a;IMU IMU&#xff08;Inertial Measurement Unit&#xff0c;慣性測量單元&#xff09…

數據文件誤刪除,OceanBase中如何重建受影響的節點

當不慎誤刪數據文件且當前沒有現成的可替換節點時&#xff0c;在OceanBase中&#xff0c;不必急于采取極端措施&#xff0c;可以考慮運用 server_permanent_offline_time 參數&#xff0c;來重建受影響的節點。 原理&#xff1a; server_permanent_offline_time 是 OceanBase數…

Python:匹配多個字符,如何匹配開頭

匹配字符0次或無數次(*)&#xff1a; import re resre.match([A-Z][a-z]*,Lihailu) print(res.group())#提取數據 輸出結果可以全部輸出 匹配字符至少一次()&#xff1a; import re resre.match([A-Za-z]python,apython) print(res.group())#提取數據(后邊只寫python會…

Unity-RectTransform設置UI width

不知道有沒人需要這樣的代碼&#xff0c;就是.sizeDelta //不確定是不是英文翻譯的原因&#xff0c;基本很難理解&#xff0c;sizeDeltaSize&#xff0c;//未必完全正確&#xff0c;但這么寫好像總沒錯過 //image 在一個UnityEngine.UI.Image 的數組內foreach (var image in l…

java學習——函數式編程(1)

函數式編程 Java 的函數式編程是一種以函數為核心構建邏輯的編程范式,強調不可變性、聲明式代碼和無副作用的操作。它通過Lambda表達式、函數式接口(如Function、Predicate、Consumer等)和Stream API等特性實現,將計算過程抽象為函數的組合與轉換,而非傳統的命令式步驟。…

AP CSA FRQ Q2 Past Paper 五年真題匯總 2023-2019

Author(wechat): bigshuang2020 ap csa tutor, providing 1-on-1 tutoring. 國際教育計算機老師, 擅長答疑講解&#xff0c;帶學生實踐學習。 熱愛創作&#xff0c;作品&#xff1a;ap csa原創雙語教案&#xff0c;真題梳理匯總&#xff0c; AP CSA FRQ專題沖刺, AP CSA MCQ小題…

線程池詳解:在SpringBoot中的最佳實踐

線程池詳解&#xff1a;在SpringBoot中的最佳實踐 引言 在Java并發編程中&#xff0c;線程池是一種非常重要的資源管理工具&#xff0c;它允許我們在應用程序中有效地管理和重用線程&#xff0c;從而提高性能并降低資源消耗。特別是在SpringBoot等企業級應用中&#xff0c;正…

2025年IT行業技術革命全景解析:從AI到量子計算的落地實踐

簡介 2025年&#xff0c;全球IT行業正經歷一場由AI、量子計算、物聯網等技術驅動的變革。從BOE的AI制造系統到德易科技的無人機光伏巡檢&#xff0c;從鯤鵬處理器的國產化突破到量子計算的算力革命&#xff0c;技術創新正在重塑產業格局。本文結合最新行業動態與實戰案例&…

JVM - 年輕代和老年代

通過一些問題來討論 JVM 中年輕代和老年代的內容 為什么要區分年輕代和老年代&#xff1f;哪些對像會進入老年代&#xff1f;什么時候會進行年輕代GC&#xff1f;什么時候會進行老年代GC&#xff1f; 1. 為什么要區分年輕代和老年代&#xff1f; 年輕代中的對象大部分都是短期…

【react】在react中async/await一般用來實現什么功能

目錄 基本概念 工作原理 優點 注意事項 底層原理 實際應用場景 1. 數據獲取 (API 請求) 2. 表單提交 3. 異步狀態管理 4. 異步路由切換 5. 異步數據預加載 6. 第三方 API 調用 7. 文件上傳/下載 8. 路由導航攔截 關鍵注意事項 基本概念 async 函數&#xff1a;用…