AI Agent開發入門:Semantic Kernel構建智能郵件助手

點擊AladdinEdu,同學們用得起的【H卡】算力平臺”,H卡級別算力80G大顯存按量計費靈活彈性頂級配置學生更享專屬優惠


引言:AI Agent——下一代人機交互范式

在人工智能技術飛速發展的今天,基于大語言模型(LLM)的AI Agent正在成為人機交互的新范式。與傳統的單一功能AI應用不同,AI Agent能夠理解復雜指令、規劃執行路徑、使用工具解決問題,真正扮演"智能助手"的角色。微軟推出的Semantic Kernel作為一款輕量級SDK,為開發者提供了構建此類AI Agent的強大框架。

本文將指導你使用Semantic Kernel構建一個智能郵件助手,重點講解任務規劃鏈設計和工具函數集成兩大核心概念。通過這篇教程,你不僅將掌握一個實用項目的開發過程,更將理解AI Agent開發的核心范式,為構建更復雜的智能應用打下堅實基礎。

第一部分:Semantic Kernel核心概念解析

1.1 什么是Semantic Kernel?

Semantic Kernel(SK)是一個輕量級的SDK,它將大型語言模型(如GPT-4)、傳統編程語言(如C#、Python)和外部數據源與服務連接起來。通過SK,開發者可以創建能夠理解語義、執行復雜任務的AI應用。

SK的核心優勢包括:

  • 插件架構:將代碼作為插件提供給LLM調用
  • 規劃器:將復雜目標分解為可執行步驟
  • 記憶管理:短期與長期記憶結合
  • 模板化:使用模板動態生成提示詞

1.2 AI Agent開發的核心組件

構建一個完整的AI Agent需要以下核心組件:

  1. 任務理解:解析用戶意圖和需求
  2. 規劃能力:將復雜任務分解為步驟序列
  3. 工具使用:調用API、函數等外部資源
  4. 結果合成:將執行結果整合為連貫響應

1.3 環境準備與安裝

開始之前,確保你的開發環境已就緒:

# 創建并進入項目目錄
mkdir semantic-kernel-mail-assistant
cd semantic-kernel-mail-assistant# 創建虛擬環境(可選但推薦)
python -m venv .venv
source .venv/bin/activate  # Linux/MacOS
# 或
.venv\Scripts\activate      # Windows# 安裝Semantic Kernel
pip install semantic-kernel

此外,你需要準備一個LLM API密鑰(如OpenAI或Azure OpenAI服務):

import semantic_kernel as sk
from semantic_kernel.connectors.ai.open_ai import OpenAIChatCompletion# 初始化內核
kernel = sk.Kernel()# 配置LLM服務
api_key = "your_openai_api_key"
model_id = "gpt-3.5-turbo"  # 或 "gpt-4"kernel.add_chat_service("chat_completion", OpenAIChatCompletion(model_id, api_key)
)

第二部分:智能郵件助手設計與規劃

2.1 需求分析與功能設計

我們的智能郵件助手將具備以下核心功能:

  1. 郵件內容生成:根據主題和關鍵點撰寫郵件
  2. 郵件分類與優先級判斷:識別郵件重要程度
  3. 郵件回復建議:針對收到郵件生成回復建議
  4. 日程關聯:從郵件內容提取日程信息

2.2 任務規劃鏈設計原理

任務規劃是AI Agent的核心能力,它使Agent能夠將復雜用戶請求分解為一系列可執行步驟。在Semantic Kernel中,規劃器主要有兩種類型:

  1. 順序規劃器:將目標分解為線性步驟序列
  2. 行動規劃器:根據上下文動態選擇下一步行動

我們的郵件助手將采用順序規劃器處理大多數任務,以下是規劃鏈設計示例:

用戶請求:"幫我給團隊發郵件通知下周項目評審會,時間周三下午3點,需要準備材料"
↓
任務分解:
1. 提取關鍵信息:時間、地點、要求
2. 生成郵件主題
3. 撰寫郵件正文
4. 添加提醒標記(如需)
5. 請求用戶確認發送

2.3 定義技能(Skills)與函數(Functions)

在Semantic Kernel中,功能被組織為技能(Skills),每個技能包含多個函數(Functions)。我們的郵件助手需要以下技能:

  • EmailSkill:核心郵件處理功能
  • CalendarSkill:日程相關功能
  • PrioritySkill:優先級判斷功能

第三部分:實現智能郵件助手

3.1 創建工具函數

首先實現基礎工具函數,這些函數將被封裝為Semantic Kernel的本地函數:

import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
import datetime
from semantic_kernel.skill_definition import sk_functionclass EmailSkill:"""郵件處理技能"""def __init__(self, smtp_server, smtp_port, email_address, email_password):self.smtp_server = smtp_serverself.smtp_port = smtp_portself.email_address = email_addressself.email_password = email_password@sk_function(description="發送電子郵件",name="send_email")async def send_email_async(self, recipient: str, subject: str, body: str) -> str:"""發送郵件工具函數"""try:msg = MIMEMultipart()msg['From'] = self.email_addressmsg['To'] = recipientmsg['Subject'] = subjectmsg.attach(MIMEText(body, 'plain'))with smtplib.SMTP(self.smtp_server, self.smtp_port) as server:server.starttls()server.login(self.email_address, self.email_password)server.send_message(msg)return f"郵件已成功發送至 {recipient}"except Exception as e:return f"發送郵件時出錯: {str(e)}"@sk_function(description="生成郵件正文",name="generate_email_content")async def generate_email_content_async(self, context: sk.SKContext) -> str:"""生成郵件內容的語義函數"""# 從上下文中獲取變量topic = context.variables.get("topic")key_points = context.variables.get("key_points")tone = context.variables.get("tone", "professional")# 使用LLM生成郵件內容prompt = f"""根據以下信息撰寫一封{tone}風格的郵件:主題:{topic}關鍵點:{key_points}請生成完整郵件正文,包括適當的問候語和結束語。"""# 調用LLM生成內容response = await kernel.create_semantic_function(prompt)(context=context)return response.result

3.2 集成語義函數

語義函數使用自然語言描述功能,由LLM執行:

# 創建郵件分類語義函數
classify_email_prompt = """
分析以下郵件內容,判斷其類別和優先級。
可選類別:['工作', '個人', '營銷', '通知', '垃圾郵件']
優先級:['高', '中', '低']郵件內容:{{$email_content}}請以JSON格式返回結果,包含category和priority字段。
"""classify_email_function = kernel.create_semantic_function(classify_email_prompt,function_name="classify_email",skill_name="EmailSkill",description="對郵件進行分類和優先級判斷"
)

3.3 構建任務規劃鏈

實現完整的郵件處理任務規劃鏈:

from semantic_kernel.planning import SequentialPlanner
from semantic_kernel.planning.sequential_planner import SequentialPlannerConfigasync def process_email_request(user_request):"""處理郵件請求的完整規劃鏈"""# 創建規劃器實例planner = SequentialPlanner(kernel)# 定義目標goal = f"""根據用戶請求處理郵件相關任務:{user_request}可能需要的步驟:1. 理解用戶意圖和需求2. 提取關鍵信息(收件人、主題、內容要點等)3. 生成適當的郵件內容4. 判斷是否需要設置優先級或提醒5. 發送郵件或提供預覽"""# 創建計劃plan = await planner.create_plan_async(goal)# 執行計劃result = await plan.invoke_async()return result.result

3.4 添加記憶與上下文管理

為了使AI Agent能夠處理多輪對話和上下文相關任務,需要實現記憶管理:

from semantic_kernel import ContextVariables, MemoryStorageBase
from semantic_kernel.memory.volatile_memory_store import VolatileMemoryStore# 初始化記憶存儲
kernel.register_memory_store(VolatileMemoryStore())async def save_conversation_context(user_id, conversation_context):"""保存對話上下文"""await kernel.memory.save_information_async(collection="conversations",text=conversation_context,id=user_id,additional_metadata={"timestamp": datetime.datetime.now().isoformat()})async def recall_conversation_context(user_id):"""回憶對話上下文"""memories = await kernel.memory.search_async(collection="conversations",query="最近對話",filter=lambda metadata: metadata["id"] == user_id,limit=1)if memories:return memories[0].textreturn None

第四部分:高級功能與優化

4.1 實現郵件處理工作流

創建一個完整的郵件處理工作流,集成多個技能:

async def handle_incoming_email(email_content, sender):"""處理收到的工作流"""# 步驟1:分類郵件classification_vars = ContextVariables()classification_vars["email_content"] = email_contentclassification = await classify_email_function.invoke_async(variables=classification_vars)# 解析分類結果import jsontry:classification_result = json.loads(classification.result)category = classification_result.get("category", "未知")priority = classification_result.get("priority", "中")except:category, priority = "未知", "中"# 步驟2:根據分類采取不同行動if category == "工作" and priority == "高":# 提取可能的時間信息time_vars = ContextVariables()time_vars["email_content"] = email_contenttime_extraction = await extract_time_function.invoke_async(variables=time_vars)# 添加到日歷if "時間" in time_extraction.result:calendar_result = await add_to_calendar_async(title="重要工作郵件待處理",description=f"來自{sender}的郵件:{email_content[:100]}...",time_info=time_extraction.result)# 生成回復建議reply_vars = ContextVariables()reply_vars["email_content"] = email_contentreply_suggestion = await generate_reply_suggestion_async(variables=reply_vars)return {"category": category,"priority": priority,"action": "需要及時處理","reply_suggestion": reply_suggestion.result,"calendar_event": calendar_result if calendar_result else None}# 其他分類處理邏輯...return {"category": category, "priority": priority, "action": "已歸檔"}

4.2 錯誤處理與韌性設計

確保AI Agent能夠優雅處理異常情況:

from semantic_kernel import KernelException
import asyncio
from tenacity import retry, stop_after_attempt, wait_exponentialclass ResilientEmailSkill(EmailSkill):"""具有韌性的郵件技能"""@retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=4, max=10))async def send_email_with_retry(self, recipient: str, subject: str, body: str) -> str:"""帶重試機制的郵件發送"""try:return await self.send_email_async(recipient, subject, body)except Exception as e:print(f"郵件發送失敗: {str(e)},進行重試...")raiseasync def safe_send_email(self, recipient: str, subject: str, body: str, max_retries=3) -> dict:"""安全的郵件發送,包含詳細結果"""for attempt in range(max_retries):try:result = await self.send_email_with_retry(recipient, subject, body)return {"success": True, "message": result, "attempts": attempt + 1}except Exception as e:if attempt == max_retries - 1:return {"success": False, "error": str(e), "attempts": attempt + 1}await asyncio.sleep(2 ** attempt)  # 指數退避return {"success": False, "error": "未知錯誤", "attempts": max_retries}

4.3 性能優化與緩存策略

為提高響應速度,實現緩存機制:

from datetime import timedelta
from functools import lru_cache
import hashlibclass OptimizedEmailSkill(EmailSkill):"""性能優化的郵件技能"""def __init__(self, *args, **kwargs):super().__init__(*args, **kwargs)self.response_cache = {}def _generate_cache_key(self, function_name, *args):"""生成緩存鍵"""key_str = function_name + "|" + "|".join(str(arg) for arg in args)return hashlib.md5(key_str.encode()).hexdigest()async def cached_generate_content(self, topic, key_points, tone="professional", expiry_minutes=10):"""帶緩存的郵件內容生成"""cache_key = self._generate_cache_key("generate_content", topic, key_points, tone)# 檢查緩存if cache_key in self.response_cache:cached_time, response = self.response_cache[cache_key]if datetime.datetime.now() - cached_time < timedelta(minutes=expiry_minutes):return response# 生成新內容context_vars = ContextVariables()context_vars["topic"] = topiccontext_vars["key_points"] = key_pointscontext_vars["tone"] = toneresponse = await self.generate_email_content_async(context_vars)# 更新緩存self.response_cache[cache_key] = (datetime.datetime.now(), response)return response

第五部分:測試與部署

5.1 編寫單元測試

確保核心功能的可靠性:

import pytest
from unittest.mock import AsyncMock, patch@pytest.mark.asyncio
async def test_email_classification():"""測試郵件分類功能"""kernel = sk.Kernel()# 配置測試環境...test_email = "尊敬的同事,請于下周一下午2點參加項目評審會議,地點在301會議室。"classification_vars = ContextVariables()classification_vars["email_content"] = test_emailresult = await classify_email_function.invoke_async(variables=classification_vars)# 驗證結果assert "category" in result.resultassert "priority" in result.resultassert "工作" in result.result or "通知" in result.result@pytest.mark.asyncio
async def test_email_send_failure_handling():"""測試郵件發送失敗處理"""with patch('smtplib.SMTP') as mock_smtp:mock_instance = mock_smtp.return_value.__enter__.return_valuemock_instance.send_message.side_effect = Exception("SMTP錯誤")skill = ResilientEmailSkill("smtp.example.com", 587, "test@example.com", "password")result = await skill.safe_send_email("recipient@example.com", "Test", "Test content")assert not result["success"]assert result["attempts"] == 3

5.2 創建演示應用

構建一個簡單的命令行界面展示功能:

async def main_demo():"""主演示函數"""print("智能郵件助手演示")print("=" * 50)while True:print("\n請選擇功能:")print("1. 撰寫新郵件")print("2. 處理收到郵件")print("3. 退出")choice = input("請輸入選項 (1-3): ").strip()if choice == "1":recipient = input("收件人: ")topic = input("主題: ")key_points = input("關鍵要點: ")tone = input("語氣風格 (professional/casual): ") or "professional"print("\n生成郵件內容中...")content = await email_skill.cached_generate_content(topic, key_points, tone)print(f"\n生成的郵件內容:\n{content}")send_confirmation = input("\n是否發送? (y/n): ")if send_confirmation.lower() == 'y':result = await email_skill.safe_send_email(recipient, topic, content)if result["success"]:print("? 郵件發送成功")else:print(f"? 發送失敗: {result['error']}")elif choice == "2":email_content = input("粘貼收到的郵件內容: ")sender = input("發件人: ")print("\n分析郵件中...")result = await handle_incoming_email(email_content, sender)print(f"\n分析結果:")print(f"類別: {result['category']}")print(f"優先級: {result['priority']}")print(f建議操作: {result['action']}")if 'reply_suggestion' in result:print(f"\n回復建議:\n{result['reply_suggestion']}")elif choice == "3":print("感謝使用智能郵件助手!")breakelse:print("無效選項,請重新選擇")if __name__ == "__main__":import asyncioasyncio.run(main_demo())

5.3 部署考慮與最佳實踐

在生產環境部署時需注意:

  1. 安全性:妥善管理API密鑰和郵件憑據
  2. 性能監控:記錄LLM調用耗時和費用
  3. 速率限制:遵守LLM API的調用限制
  4. 用戶體驗:提供適當的加載狀態和錯誤提示
# 生產環境配置示例
class ProductionConfig:"""生產環境配置"""def __init__(self):self.llm_max_retries = 3self.llm_timeout = 30self.email_rate_limit = 10  # 每分鐘最多發送10封郵件self.cache_ttl = 3600  # 緩存1小時def setup_kernel(self):"""生產環境內核配置"""kernel = sk.Kernel()# 添加帶超時和重試的LLM服務kernel.add_chat_service("chat_completion",OpenAIChatCompletion(model_id="gpt-4",api_key=os.getenv("OPENAI_API_KEY"),timeout=self.llm_timeout,max_retries=self.llm_max_retries))return kernel

結語:掌握AI Agent開發范式

通過本教程,你已完成了使用Semantic Kernel構建智能郵件助手的全過程。這個項目展示了AI Agent開發的核心范式:

  1. 任務分解:將復雜需求分解為可執行步驟
  2. 工具集成:將傳統代碼能力暴露給LLM
  3. 規劃能力:使用規劃器動態制定執行計劃
  4. 上下文管理:維護對話狀態和歷史

這種開發模式不僅適用于郵件助手,可以推廣到各種AI Agent應用場景,如客戶服務助手、數據分析助手、代碼開發助手等。

最重要的是,你學會了如何讓LLM與傳統編程優勢互補:LLM負責理解意圖、生成內容、做出決策;傳統代碼負責執行確切操作、訪問外部資源、處理結構化數據。

繼續探索的方向包括:

  1. 集成更多數據源(日歷、任務管理系統等)
  2. 實現多模態能力(處理圖片、文檔等)
  3. 優化提示工程提高可靠性
  4. 添加人工審核環節確保關鍵操作安全

AI Agent開發是一片充滿機遇的新領域,希望本教程為你奠定了堅實的第一步。現在,嘗試用這些概念構建你自己的AI應用吧!


點擊AladdinEdu,同學們用得起的【H卡】算力平臺”,H卡級別算力80G大顯存按量計費靈活彈性頂級配置學生更享專屬優惠

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

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

相關文章

WebAssembly:開啟高性能 Web 應用的新篇章

在互聯網技術飛速發展的浪潮中&#xff0c;Web應用的性能一直是一個重要的優化目標。傳統的JavaScript雖然靈活便捷&#xff0c;但在處理CPU密集型任務時&#xff0c;其性能瓶頸日益凸顯&#xff0c;限制了Web應用在游戲、音視頻編輯、科學計算、圖像處理等高性能領域的深入發展…

001-003 產品經理-ML應用構建-ML應用范圍

001-003 產品經理-ML應用構建-ML應用范圍 時間&#xff1a;2025年09月08日14:48:01 備注&#xff1a;筆記回顧和復習&#xff0c;僅用于分享而非商用&#xff0c;引用內容若侵權請聯系并刪除。 文章目錄001-003 產品經理-ML應用構建-ML應用范圍導引 學習法則1 內容索引 產品經…

軟件測試錯題筆記

1.capitalize()表示將字符串第一個字符轉換為大寫 2.pop()方法&#xff1a;指定一個鍵&#xff08;key&#xff09;作為參數來刪除并返回對應的值&#xff0c;不傳入任何參數報錯。 3.測試方法&#xff1a;黑盒測試&#xff08;等價類劃分法、邊界值分析、因果圖分析&#xf…

【一文分享】安全數據交換系統是什么?哪款產品性價比高?

隨著數據價值的提升&#xff0c;其流動過程中的安全風險也與日俱增。內部核心數據泄露、外部攻擊、不合規傳輸導致的合規風險……這些問題如同懸在企業頭上的“達摩克利斯之劍”。正是在這樣的背景下&#xff0c;安全數據交換系統 應運而生&#xff0c;成為了保障數據安全流動的…

postgresql9.2.4 離線安裝

1、創建用戶[rootvkeep ~]# groupadd postgres [rootvkeep ~]# useradd -g postgres postgres -m -s /bin/bash [rootvkeep ~]# echo "Database123" | passwd --stdin postgres2、安裝依賴包[rootvkeep ~]# yum install gcc gcc-c zlib-devel readline readline-deve…

【C++設計模式】第三篇:觀察者模式(別名:發布-訂閱模式、模型-視圖模式、源-監聽器模式)

C設計模式系列文章目錄 【C設計模式】第一篇 C單例模式–懶漢與餓漢以及線程安全 【C設計模式】第二篇&#xff1a;策略模式&#xff08;Strategy&#xff09;–從基本介紹&#xff0c;內部原理、應用場景、使用方法&#xff0c;常見問題和解決方案進行深度解析 【C設計模式】…

運作管理學習筆記5-生產和服務設施的選址

運作管理-北京交通大學5.1.設施選址概述 設施選址是一個戰略性的決策&#xff0c;做這個決策的時候會投入比較多的資源&#xff0c;而且未來去改變選址的成本和代價也比較大。 5.1.1.設施選址的重要性 設施選址影響企業經營情況 設施選址對設施布局以及投產后的生產經營費用、產…

JUnit 詳解

一、JUnit 簡介&#xff1a;什么是 JUnit&#xff1f;為什么要用它&#xff1f;1.1 核心定義JUnit 是一個開源的、基于 Java 語言的單元測試框架&#xff0c;最初由 Erich Gamma (GoF 設計模式作者之一) 和 Kent Beck (極限編程創始人) 在 1997 年共同開發。作為 xUnit 測試框架…

數據結構造神計劃第三天---數據類型

&#x1f525;個人主頁&#xff1a;尋星探路 &#x1f3ac;作者簡介&#xff1a;Java研發方向學習者 &#x1f4d6;個人專欄&#xff1a;《從青銅到王者&#xff0c;就差這講數據結構&#xff01;&#xff01;&#xff01;》、 《JAVA&#xff08;SE&#xff09;----如此簡單&a…

AI API Tester體驗:API測試工具如何高效生成接口測試用例、覆蓋異常場景?

前陣子幫后端測試支付接口時&#xff0c;我算是徹底明白 “API 測試能磨掉半條命”—— 明明接口文檔里寫了十幾種參數組合&#xff0c;手動寫測試用例時要么漏了 “簽名過期” 的場景&#xff0c;要么忘了校驗 “金額超過限額” 的返回值&#xff0c;測到半夜還被開發吐槽 “你…

音頻驅動數字人人臉模型

1.LatentSync: Taming Audio-Conditioned Latent Diffusion Models for Lip Sync with SyncNet Supervision 字節 2024 文章地址&#xff1a;https://arxiv.org/pdf/2412.09262 代碼地址&#xff1a;https://github.com/bytedance/LatentSync 訓練推理都有 2.wan2.2-s2v …

CentOS部署ELK Stack完整指南

文章目錄&#x1f680; ELK Stack 部署詳解&#xff08;CentOS 7/8&#xff09;&#x1f4e6; 一、環境準備1. 關閉防火墻&#xff08;或開放端口&#xff09;2. 關閉 SELinux3. 安裝基礎依賴4. 驗證 Java&#x1f53d; 二、下載并安裝 ELK 組件1. 導入 Elastic GPG 密鑰2. 創建…

Spring Boot 攔截器(Interceptor)與過濾器(Filter)有什么區別?

在 Spring Boot 項目中&#xff0c;我們經常會遇到需要在請求處理前后執行一些通用邏輯的場景&#xff0c;比如記錄日志、權限校驗、全局異常處理等。此時&#xff0c;我們通常會面臨兩種選擇&#xff1a;過濾器&#xff08;Filter&#xff09; 和 攔截器&#xff08;Intercept…

【技術教程】如何將文檔編輯器集成至基于Java的Web應用程序

在如今的企業協作場景中&#xff0c;“文檔” 早已不是簡單的文字載體&#xff01;從項目需求文檔的多人實時修改&#xff0c;到財務報表的在線批注&#xff0c;再到合同草案的版本追溯&#xff0c;用戶越來越需要在 Web 應用內直接完成 “編輯 - 協作 - 存儲” 全流程。 但很…

多模態大模型Keye-VL-1.5發布!視頻理解能力更強!

近日&#xff0c;快手正式發布了多模態大語言模型Keye-VL-1.5-8B。 與之前的版本相比&#xff0c;Keye-VL-1.5的綜合性能實現顯著提升&#xff0c;尤其在基礎視覺理解能力方面&#xff0c;包括視覺元素識別、推理能力以及對時序信息的理—表現尤為突出。Keye-VL-1.5在同等規模…

洗完頭后根據個人需求選擇合適的自然風干 | 電吹風 (在保護發質的同時,也能兼顧到生活的便利和舒適。)

文章目錄 引言 I 選合適的方式讓頭發變干 時間充裕,不需要做造型,選擇自然風干 使用電吹風,比較推薦的做法 II 自然風干 天冷可能刺激頭皮 III 電吹風吹干 容易造型 影響頭皮健康 損傷發質 科普 頭皮的微觀結構 頭發絲 引言 吹風吹干:容易造型,但損傷發質、影響頭皮健康 …

GPS汽車限速器有哪些功能?主要運用在哪里?

GPS 汽車限速器是一種結合全球衛星定位&#xff08;GPS&#xff09;技術、車速采集技術與車輛控制 / 預警邏輯的設備&#xff0c;核心目標是通過技術手段限制車輛行駛速度&#xff0c;減少超速引發的交通事故&#xff0c;并輔助車輛管理。其功能與應用場景高度匹配不同用戶的 “…

Python從入門到精通_01_python基礎

1 源代碼格式在python文件的第一行&#xff0c;輸入以下語句&#xff0c;可以將python文件的編碼格式設置為utf-8#-*- coding:utf-8 -*-2 輸入輸出input():輸入&#xff0c;無論輸入的是什么類型數據&#xff0c;最后都是字符串類型print(*args, sep , end\n, fileNone, flushF…

使用CI/CD部署項目(前端Nextjs)

寫在前面&#xff1a;在github上使用CI/CD部署Nextjs項目&#xff0c;具體配置可以按照自己的實際的修改 這是我的項目配置&#xff0c;僅供參考 后端項目可以參考&#xff1a;使用CI/CD部署后端項目 正文開始 項目名&#xff08;PROJECT_NAME&#xff09;- CI/CD 部署指南…

Java全棧工程師面試實錄:從基礎到實戰的全面解析

Java全棧工程師面試實錄&#xff1a;從基礎到實戰的全面解析 面試官&#xff1a;李明&#xff08;資深技術負責人&#xff09; 應聘者&#xff1a;張宇&#xff08;28歲&#xff0c;碩士學歷&#xff0c;5年開發經驗&#xff09; 第一輪&#xff1a;Java語言與JVM基礎 李明&…