[{"data":1,"prerenderedAt":827},["ShallowReactive",2],{"navigation_docs":3,"-python-uv":352,"-python-uv-surround":822},[4,54,83,116,125,161,179,200],{"title":5,"path":6,"stem":7,"children":8},"Ai","/ai","ai",[9,12,42,46,50],{"title":10,"path":6,"stem":11},"AI 技術探索","ai/index",{"title":13,"path":14,"stem":15,"children":16,"page":41},"Rag","/ai/rag","ai/RAG",[17,21,25,29,33,37],{"title":18,"path":19,"stem":20},"BM25 演算法深入解析：從 TF-IDF 到現代搜尋引擎的核心技術","/ai/rag/bm25-deep-dive-from-tf-idf-to-rag","ai/RAG/bm25-deep-dive-from-tf-idf-to-rag",{"title":22,"path":23,"stem":24},"Dense Retrieval（向量檢索）深入解析","/ai/rag/dense-retrieval-deep-dive","ai/RAG/dense-retrieval-deep-dive",{"title":26,"path":27,"stem":28},"RAG（Retrieval-Augmented Generation）原理與實作入門","/ai/rag/rag-intro-principles-and-implementation","ai/RAG/rag-intro-principles-and-implementation",{"title":30,"path":31,"stem":32},"RAG Retrieval Strategy 深入解析","/ai/rag/rag-retrieval-strategy-deep-dive","ai/RAG/rag-retrieval-strategy-deep-dive",{"title":34,"path":35,"stem":36},"Reciprocal Rank Fusion（RRF）教學：打造更穩定的檢索融合策略","/ai/rag/rrf-reciprocal-rank-fusion-guide","ai/RAG/rrf-reciprocal-rank-fusion-guide",{"title":38,"path":39,"stem":40},"TF-IDF（Term Frequency–Inverse Document Frequency）深入解析","/ai/rag/tf-idf-deep-dive","ai/RAG/tf-idf-deep-dive",false,{"title":43,"path":44,"stem":45},"Docus AI 功能完整實作指南","/ai/docus-ai-implementation","ai/docus-ai-implementation",{"title":47,"path":48,"stem":49},"llms.txt 是什麼？在 Nuxt 中控制 AI 與搜尋引擎爬蟲的新方式","/ai/llms-txt","ai/llms-txt",{"title":51,"path":52,"stem":53},"MCP（Model Context Protocol）是什麼？用「AI 的 USB-C」理解模型如何安全連接工具與資料","/ai/mcp_concept","ai/mcp_concept",{"title":55,"path":56,"stem":57,"children":58,"page":41},"Data Analysis","/data-analysis","data-analysis",[59,63,67,71,75,79],{"title":60,"path":61,"stem":62},"Exploratory Data Analysis（EDA）資料探索分析入門","/data-analysis/exploratory-data-analysis-eda","data-analysis/exploratory-data-analysis-eda",{"title":64,"path":65,"stem":66},"PR-AUC 深入解析：不平衡分類問題的重要評估指標","/data-analysis/pr-auc-for-imbalanced-classification","data-analysis/pr-auc-for-imbalanced-classification",{"title":68,"path":69,"stem":70},"ROC-AUC 深入解析：理解分類模型的判斷能力","/data-analysis/roc-auc-complete-guide","data-analysis/roc-auc-complete-guide",{"title":72,"path":73,"stem":74},"SHAP（SHapley Additive exPlanations）模型解釋方法深入解析","/data-analysis/shap-model-interpretation-complete-guide","data-analysis/shap-model-interpretation-complete-guide",{"title":76,"path":77,"stem":78},"Social Network Analysis（SNA）深入解析","/data-analysis/social-network-analysis-sna","data-analysis/social-network-analysis-sna",{"title":80,"path":81,"stem":82},"Time-based Split：為什麼時間序列資料不能使用 Random Split？","/data-analysis/time-based-split-vs-random-split","data-analysis/time-based-split-vs-random-split",{"title":84,"path":85,"stem":86,"children":87,"page":41},"MachineLearning","/machine_learning","machine_learning",[88,92,96,100,104,108,112],{"title":89,"path":90,"stem":91},"Confusion Matrix（混淆矩陣）完整解析","/machine_learning/confusion-matrix","machine_learning/confusion-matrix",{"title":93,"path":94,"stem":95},"Decision Tree 模型完整教學：從原理到 Python 實作","/machine_learning/decision-tree-complete-guide","machine_learning/decision-tree-complete-guide",{"title":97,"path":98,"stem":99},"為什麼 Decision Tree 在 Tabular Data 上常常勝過 Deep Learning？","/machine_learning/decision-tree-vs-deep-learning-on-tabular-data","machine_learning/decision-tree-vs-deep-learning-on-tabular-data",{"title":101,"path":102,"stem":103},"LightGBM 模型入門：理解高效能的 Gradient Boosting 演算法","/machine_learning/lightgbm-intro-for-tabular-data","machine_learning/lightgbm-intro-for-tabular-data",{"title":105,"path":106,"stem":107},"Logistic Regression（Logit 回歸）完整教學","/machine_learning/logistic-regression-complete-guide","machine_learning/logistic-regression-complete-guide",{"title":109,"path":110,"stem":111},"為什麼模型訓練需要 Train / Validation / Test Dataset？","/machine_learning/train-validation-test-dataset","machine_learning/train-validation-test-dataset",{"title":113,"path":114,"stem":115},"XGBoost 原理與實務教學","/machine_learning/xgboost-complete-guide","machine_learning/xgboost-complete-guide",{"title":117,"path":118,"stem":119,"children":120,"page":41},"Network","/network","network",[121],{"title":122,"path":123,"stem":124},"DNS 設定入門：CNAME vs A Record 完整解析","/network/dns-cname-vs-a-record-guide","network/dns-cname-vs-a-record-guide",{"title":126,"path":127,"stem":128,"children":129},"Nuxt","/nuxt","nuxt",[130,133,137,141,145,149,153,157],{"title":131,"path":127,"stem":132},"Nuxt 實戰指南","nuxt/index",{"title":134,"path":135,"stem":136},"Abstraction Layer 與 Adapter 的差別，一次搞懂設計角色","/nuxt/adapter_abstraction_layer","nuxt/adapter_abstraction_layer",{"title":138,"path":139,"stem":140},"Nuxt 4 全面理解 — 專案檔案結構解析","/nuxt/directory_structure","nuxt/directory_structure",{"title":142,"path":143,"stem":144},"Nuxt 前端 build 流程完整解析","/nuxt/frontend_build","nuxt/frontend_build",{"title":146,"path":147,"stem":148},"Nitro 是什麼？從 Nuxt 專案到 Server 與 Edge 的關鍵引擎","/nuxt/nitro","nuxt/nitro",{"title":150,"path":151,"stem":152},"深入理解 Nuxt 的 .nuxt 與 .output：為什麼部署時一定要分清楚？","/nuxt/nuxt_and_output","nuxt/nuxt_and_output",{"title":154,"path":155,"stem":156},"Nuxt 中 dev、build、preview 的差異一次搞懂","/nuxt/nuxt_dev_build_preview","nuxt/nuxt_dev_build_preview",{"title":158,"path":159,"stem":160},"Nuxt Image vs \u003Cimg>：為什麼 Nuxt 3 專案幾乎都該用 \u003CNuxtImg>？","/nuxt/nuxt_image","nuxt/nuxt_image",{"title":162,"path":163,"stem":164,"children":165},"Python 程式開發","/python","python/index",[166,167,171,175],{"title":162,"path":163,"stem":164},{"title":168,"path":169,"stem":170},"如何在 FastAPI 中調用記憶體 Buffer 回傳圖片 (附實例)","/python/memory_buffer","python/memory_buffer",{"title":172,"path":173,"stem":174},"Python 單元測試教學：如何為你的程式撰寫 Test","/python/python-unit-testing-unittest-pytest","python/python-unit-testing-unittest-pytest",{"title":176,"path":177,"stem":178},"如何使用 uv 取代 pip：改善 Python 專案的開發流程","/python/uv","python/uv",{"title":180,"path":181,"stem":182,"children":183,"page":41},"Statistic","/statistic","statistic",[184,188,192,196],{"title":185,"path":186,"stem":187},"卡方檢定（Chi-Square Test）入門教學","/statistic/chi-square-test-intro","statistic/chi-square-test-intro",{"title":189,"path":190,"stem":191},"常見抽樣方法（Sampling Methods）教學：Stratified、Quota、Convenience、Systematic、Simple Random","/statistic/common-sampling-methods-guide","statistic/common-sampling-methods-guide",{"title":193,"path":194,"stem":195},"Cramér’s V 指標介紹：如何衡量兩個類別變數之間的關聯","/statistic/cramers-v-for-categorical-association","statistic/cramers-v-for-categorical-association",{"title":197,"path":198,"stem":199},"Mann–Whitney U 與 Kolmogorov–Smirnov（KS）檢定：非參數統計檢定的入門指南","/statistic/mann-whitney-u-and-ks-test-intro","statistic/mann-whitney-u-and-ks-test-intro",{"title":201,"path":202,"stem":203,"children":204},"WebDev","/web_dev","web_dev",[205,208,234,248,282,312,334],{"title":206,"path":202,"stem":207},"Web 前端開發","web_dev/index",{"title":209,"path":210,"stem":211,"children":212},"瀏覽器與渲染","/web_dev/browser","web_dev/browser/index",[213,214,218,222,226,230],{"title":209,"path":210,"stem":211},{"title":215,"path":216,"stem":217},"瀏覽器儲存空間完整解析：Cookie、localStorage、IndexedDB 到 Cache Storage","/web_dev/browser/browser-storage-comprehensive-guide","web_dev/browser/browser-storage-comprehensive-guide",{"title":219,"path":220,"stem":221},"DOM (Document Object Model) 深入解析","/web_dev/browser/dom","web_dev/browser/dom",{"title":223,"path":224,"stem":225},"Service Worker Request Flow 深入解析","/web_dev/browser/service-worker-request-flow","web_dev/browser/service-worker-request-flow",{"title":227,"path":228,"stem":229},"CSR、SSR 與 SSG 是什麼？前端渲染策略完整比較","/web_dev/browser/ssr_csr_ssg","web_dev/browser/ssr_csr_ssg",{"title":231,"path":232,"stem":233},"Virtual DOM 深入解析：為什麼它能優化前端效能？","/web_dev/browser/virtual_dom","web_dev/browser/virtual_dom",{"title":235,"path":236,"stem":237,"children":238},"圖形技術","/web_dev/graphics","web_dev/graphics/index",[239,240,244],{"title":235,"path":236,"stem":237},{"title":241,"path":242,"stem":243},"為什麼 Three.js 專案幾乎都選擇 CSR？從 SSR 問題談起","/web_dev/graphics/threejs_csr","web_dev/graphics/threejs_csr",{"title":245,"path":246,"stem":247},"WebGL 是什麼？為什麼前端 3D 幾乎都靠它？","/web_dev/graphics/webgl","web_dev/graphics/webGL",{"title":249,"path":250,"stem":251,"children":252},"架構與配置","/web_dev/infrastructure","web_dev/infrastructure/index",[253,254,258,262,266,270,274,278],{"title":249,"path":250,"stem":251},{"title":255,"path":256,"stem":257},"Zeabur + K3s + Nuxt 部署架構完整解析","/web_dev/infrastructure/k3s-zeabur","web_dev/infrastructure/K3s-zeabur",{"title":259,"path":260,"stem":261},"ECS vs Docker vs Kubernetes：從部署堆疊理解三層架構","/web_dev/infrastructure/ecs-docker-kubernetes-stack","web_dev/infrastructure/ecs-docker-kubernetes-stack",{"title":263,"path":264,"stem":265},"ECS vs VPS 是什麼？從部署網站的角度一次搞懂差別","/web_dev/infrastructure/ecs-vs-vps","web_dev/infrastructure/ecs-vs-vps",{"title":267,"path":268,"stem":269},"Zeabur 內網服務連線完整入門指南","/web_dev/infrastructure/k3s-internal-networking","web_dev/infrastructure/k3s-internal-networking",{"title":271,"path":272,"stem":273},"使用 Microservices 架構設計系統的優勢解析","/web_dev/infrastructure/microservices-architecture-advantages","web_dev/infrastructure/microservices-architecture-advantages",{"title":275,"path":276,"stem":277},"Nginx 入門教學：從反向代理到與 Kubernetes 的架構比較","/web_dev/infrastructure/nginx-intro","web_dev/infrastructure/nginx-intro",{"title":279,"path":280,"stem":281},"YAML 配置是什麼？為什麼現代開發都在用它","/web_dev/infrastructure/yaml-configuration","web_dev/infrastructure/yaml-configuration",{"title":283,"path":284,"stem":285,"children":286},"網絡與通訊","/web_dev/network","web_dev/network/index",[287,288,292,296,300,304,308],{"title":283,"path":284,"stem":285},{"title":289,"path":290,"stem":291},"HTTP Request 結構完整解析：從 Request Line 到 Header 一次看懂","/web_dev/network/http-request-structure","web_dev/network/http-request-structure",{"title":293,"path":294,"stem":295},"OSI 模型（Open Systems Interconnection Model）完整解析","/web_dev/network/osi-model","web_dev/network/osi-model",{"title":297,"path":298,"stem":299},"RESTful API 設計原則與實務解析","/web_dev/network/restful-api","web_dev/network/restful-api",{"title":301,"path":302,"stem":303},"RESTful API 五大設計原則深入解析","/web_dev/network/restful-api-principles","web_dev/network/restful-api-principles",{"title":305,"path":306,"stem":307},"Server-Sent Events (SSE) 深入解析與實作教學","/web_dev/network/sse-introduction","web_dev/network/sse-introduction",{"title":309,"path":310,"stem":311},"WebSocket 入門教學：從概念到 Node.js 實作","/web_dev/network/websocket-introduction","web_dev/network/websocket-introduction",{"title":313,"path":314,"stem":315,"children":316},"認證與安全","/web_dev/security","web_dev/security/index",[317,318,322,326,330],{"title":313,"path":314,"stem":315},{"title":319,"path":320,"stem":321},"使用 Cookie 與 Session 建立使用者驗證（完整新手教學）","/web_dev/security/cookie-session-authentication","web_dev/security/cookie-session-authentication",{"title":323,"path":324,"stem":325},"JWT 驗證機制完整解析：從登入流程到實務應用","/web_dev/security/jwt-authentication","web_dev/security/jwt-authentication",{"title":327,"path":328,"stem":329},"Secret Key 簽名是什麼？從零理解資料簽名的本質","/web_dev/security/secret-key-signing","web_dev/security/secret-key-signing",{"title":331,"path":332,"stem":333},"SSH（Secure Shell）是什麼？從遠端登入到安全通道的核心概念","/web_dev/security/ssh","web_dev/security/ssh",{"title":335,"path":336,"stem":337,"children":338},"SEO 與規範","/web_dev/seo","web_dev/seo/index",[339,340,344,348],{"title":335,"path":336,"stem":337},{"title":341,"path":342,"stem":343},"Canonical URL 是什麼？用生活化方式搞懂前端 SEO 的基本保命符","/web_dev/seo/canonical_link","web_dev/seo/canonical_link",{"title":345,"path":346,"stem":347},"robots.txt 是什麼？SEO 的第一道守門員","/web_dev/seo/robot_txt","web_dev/seo/robot_txt",{"title":349,"path":350,"stem":351},"Nuxt SEO 中的 Meta 與 SEO 工具是如何運作的？","/web_dev/seo/seo","web_dev/seo/seo",{"id":353,"title":176,"body":354,"description":810,"extension":811,"links":812,"meta":813,"navigation":819,"path":177,"seo":820,"stem":178,"__hash__":821},"docs/python/uv.md",{"type":355,"value":356,"toc":797},"minimark",[357,370,377,394,397,400,408,411,432,438,441,458,461,473,486,492,494,501,504,522,525,530,533,545,552,556,562,598,601,608,611,627,633,644,647,649,656,662,674,677,683,686,694,697,708,714,734,741,743,747,750,758,761,767,770,772,776,779,793],[358,359,360,361,365,366,369],"p",{},"在學 Python 的過程中，很多人都會遇到一個共同的痛點：\n",[362,363,364],"strong",{},"「套件裝了，但專案卻很容易壞掉」","，或是\n",[362,367,368],{},"「我這台電腦可以跑，你那台卻不行」","。",[358,371,372,376],{},[373,374,375],"code",{},"uv"," 正是為了解決這類問題而誕生的一套工具。\n這篇文章會用「初學者友善」的方式，帶你理解三個最常用、也最重要的指令：",[378,379,380],"blockquote",{},[358,381,382],{},[362,383,384,387,388,387,391],{},[373,385,386],{},"uv init"," → ",[373,389,390],{},"uv add",[373,392,393],{},"uv sync",[358,395,396],{},"你可以把它們想成一條完整又安全的 Python 專案流程。",[398,399],"hr",{},[401,402,404,405,407],"h2",{"id":403},"一uv-init建立一個正式的-python-專案","一、",[373,406,386],{},"：建立一個正式的 Python 專案",[358,409,410],{},"當你第一次進入一個資料夾，想要「開始寫一個 Python 專案」時，第一步就是：",[412,413,418],"pre",{"className":414,"code":415,"language":416,"meta":417,"style":417},"language-bash shiki shiki-themes github-dark","uv init\n","bash","",[373,419,420],{"__ignoreMap":417},[421,422,425,428],"span",{"class":423,"line":424},"line",1,[421,426,375],{"class":427},"svObZ",[421,429,431],{"class":430},"sU2Wk"," init\n",[358,433,434,435],{},"這個指令的目的很單純：\n👉 ",[362,436,437],{},"告訴 uv：「這裡是一個 Python 專案」",[358,439,440],{},"執行後，uv 會幫你做幾件基礎但很重要的事：",[442,443,444,448,455],"ul",{},[445,446,447],"li",{},"建立 Python 專案的基本結構",[445,449,450,451,454],{},"產生一個 ",[373,452,453],{},"pyproject.toml"," 檔案",[445,456,457],{},"設定專案名稱、Python 版本等基本資訊",[358,459,460],{},"你可以把它理解成 Python 世界裡的：",[412,462,464],{"className":414,"code":463,"language":416,"meta":417,"style":417},"git init\n",[373,465,466],{"__ignoreMap":417},[421,467,468,471],{"class":423,"line":424},[421,469,470],{"class":427},"git",[421,472,431],{"class":430},[358,474,475,476,479,480,482,483,369],{},"差別只在於，",[373,477,478],{},"git init"," 是在初始化版本控制，\n而 ",[373,481,386],{}," 是在初始化 ",[362,484,485],{},"Python 專案本身",[358,487,488,489,369],{},"從這一步開始，uv 才知道你接下來做的套件安裝、環境管理，",[362,490,491],{},"都是屬於同一個專案的行為",[398,493],{},[401,495,497,498,500],{"id":496},"二uv-add安裝套件並且記錄在專案中","二、",[373,499,390],{},"：安裝套件，並且記錄在專案中",[358,502,503],{},"當你需要使用第三方套件時（例如 AI、爬蟲、工具庫），就會用到：",[412,505,507],{"className":414,"code":506,"language":416,"meta":417,"style":417},"uv add deepagents tavily-python\n",[373,508,509],{"__ignoreMap":417},[421,510,511,513,516,519],{"class":423,"line":424},[421,512,375],{"class":427},[421,514,515],{"class":430}," add",[421,517,518],{"class":430}," deepagents",[421,520,521],{"class":430}," tavily-python\n",[358,523,524],{},"這一行其實同時完成了兩件事。",[526,527,529],"h3",{"id":528},"_1️⃣-安裝套件到目前環境","1️⃣ 安裝套件到目前環境",[358,531,532],{},"uv 會幫你下載並安裝：",[442,534,535,540],{},[445,536,537],{},[373,538,539],{},"deepagents",[445,541,542],{},[373,543,544],{},"tavily-python",[358,546,547,548,551],{},"這一點看起來跟 ",[373,549,550],{},"pip install"," 很像，但真正的差別在下一步。",[526,553,555],{"id":554},"_2️⃣-把套件寫進專案設定","2️⃣ 把套件「寫進專案設定」",[358,557,558,559,561],{},"uv 會自動更新 ",[373,560,453],{},"，清楚記錄：",[412,563,567],{"className":564,"code":565,"language":566,"meta":417,"style":417},"language-toml shiki shiki-themes github-dark","[project]\ndependencies = [\n  \"deepagents\",\n  \"tavily-python\"\n]\n","toml",[373,568,569,574,580,586,592],{"__ignoreMap":417},[421,570,571],{"class":423,"line":424},[421,572,573],{},"[project]\n",[421,575,577],{"class":423,"line":576},2,[421,578,579],{},"dependencies = [\n",[421,581,583],{"class":423,"line":582},3,[421,584,585],{},"  \"deepagents\",\n",[421,587,589],{"class":423,"line":588},4,[421,590,591],{},"  \"tavily-python\"\n",[421,593,595],{"class":423,"line":594},5,[421,596,597],{},"]\n",[358,599,600],{},"這代表一個非常重要的概念：",[378,602,603],{},[358,604,605],{},[362,606,607],{},"這不是「我現在裝了什麼」，而是「這個專案需要什麼」",[358,609,610],{},"和傳統的：",[412,612,614],{"className":414,"code":613,"language":416,"meta":417,"style":417},"pip install 套件名稱\n",[373,615,616],{"__ignoreMap":417},[421,617,618,621,624],{"class":423,"line":424},[421,619,620],{"class":427},"pip",[421,622,623],{"class":430}," install",[421,625,626],{"class":430}," 套件名稱\n",[358,628,629,630,632],{},"相比，",[373,631,390],{}," 更像是一種「宣告」。\n未來不管是：",[442,634,635,638,641],{},[445,636,637],{},"你自己換電腦",[445,639,640],{},"其他人 clone 你的專案",[445,642,643],{},"專案丟到 CI / Server 上跑",[358,645,646],{},"只要有這份宣告，環境就可以被正確重建。",[398,648],{},[401,650,652,653,655],{"id":651},"三uv-sync讓實際環境與專案設定一致","三、",[373,654,393],{},"：讓實際環境與專案設定一致",[358,657,658,659,661],{},"當專案的依賴都寫在 ",[373,660,453],{}," 之後，接下來最關鍵的一步是：",[412,663,665],{"className":414,"code":664,"language":416,"meta":417,"style":417},"uv sync\n",[373,666,667],{"__ignoreMap":417},[421,668,669,671],{"class":423,"line":424},[421,670,375],{"class":427},[421,672,673],{"class":430}," sync\n",[358,675,676],{},"這個指令的工作是：",[358,678,679,680],{},"👉 ",[362,681,682],{},"讓目前的 Python 環境，完全「照著專案設定來」",[358,684,685],{},"uv 會檢查：",[442,687,688,691],{},[445,689,690],{},"專案宣告需要哪些套件",[445,692,693],{},"實際環境現在裝了哪些套件",[358,695,696],{},"然後自動幫你處理以下狀況：",[442,698,699,702,705],{},[445,700,701],{},"少裝的套件 → 補上",[445,703,704],{},"版本不對的套件 → 調整",[445,706,707],{},"多裝、但專案沒用到的套件 → 移除",[358,709,710,711,713],{},"你可以把 ",[373,712,393],{}," 想成 Python 版的：",[412,715,717],{"className":414,"code":716,"language":416,"meta":417,"style":417},"npm install\npoetry install\n",[373,718,719,727],{"__ignoreMap":417},[421,720,721,724],{"class":423,"line":424},[421,722,723],{"class":427},"npm",[421,725,726],{"class":430}," install\n",[421,728,729,732],{"class":423,"line":576},[421,730,731],{"class":427},"poetry",[421,733,726],{"class":430},[358,735,736,737,740],{},"差別在於，uv 的速度更快，而且結果是 ",[362,738,739],{},"可重現的","，不容易出現「環境歪掉」的問題。",[398,742],{},[401,744,746],{"id":745},"四把三個指令串起來的完整理解方式","四、把三個指令串起來的完整理解方式",[358,748,749],{},"如果用一句話來記：",[412,751,756],{"className":752,"code":754,"language":755,"meta":417},[753],"language-text","uv init   → 建立專案\nuv add    → 宣告專案需要的套件\nuv sync   → 讓環境照宣告執行\n","text",[373,757,754],{"__ignoreMap":417},[358,759,760],{},"或是用流程來想：",[412,762,765],{"className":763,"code":764,"language":755,"meta":417},[753],"我開始一個 Python 專案\n↓\n告訴 uv 這是專案（uv init）\n↓\n告訴專案需要哪些套件（uv add）\n↓\n讓電腦環境完全照規格來（uv sync）\n",[373,766,764],{"__ignoreMap":417},[358,768,769],{},"只要記住這個順序，uv 的使用邏輯其實非常單純。",[398,771],{},[401,773,775],{"id":774},"五為什麼現在很多-ai-專案都選擇-uv","五、為什麼現在很多 AI 專案都選擇 uv？",[358,777,778],{},"在 AI、Agent、自動化專案中，環境穩定性非常重要，而 uv 特別適合這類場景：",[442,780,781,784,787,790],{},[445,782,783],{},"安裝與同步速度快",[445,785,786],{},"不容易出現「在我電腦可以跑」的問題",[445,788,789],{},"依賴關係清楚，適合自動化工具操作",[445,791,792],{},"可以鎖定版本，避免套件更新導致專案爆炸",[794,795,796],"style",{},"html pre.shiki code .svObZ, html code.shiki .svObZ{--shiki-default:#B392F0}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":417,"searchDepth":576,"depth":576,"links":798},[799,801,806,808,809],{"id":403,"depth":576,"text":800},"一、uv init：建立一個正式的 Python 專案",{"id":496,"depth":576,"text":802,"children":803},"二、uv add：安裝套件，並且記錄在專案中",[804,805],{"id":528,"depth":582,"text":529},{"id":554,"depth":582,"text":555},{"id":651,"depth":576,"text":807},"三、uv sync：讓實際環境與專案設定一致",{"id":745,"depth":576,"text":746},{"id":774,"depth":576,"text":775},"介紹 uv 及其基礎指令 (init, add, sync)，幫助初學者理解如何利用 uv 進行高效且穩定的 Python 環境與套件管理。","md",null,{"tags":814,"category":815,"date":818},[375,815,620,816,817],"python","package-management","environment-management","2026-02-03",true,{"title":176,"description":810},"N0nWDXxxvlpTfSNHImRq7Im9Ju7FERl5vIFFMiC5puk",[823,825],{"title":172,"path":173,"stem":174,"description":824,"children":-1},"介紹 Python 中常見的單元測試方法，包含 unittest 與 pytest 的基本概念、撰寫方式與實際範例，幫助你建立可靠的程式品質。",{"title":185,"path":186,"stem":187,"description":826,"children":-1},"以直觀的方式理解卡方檢定（Chi-Square Test）的概念、原理與實際應用，學習如何判斷兩個分類變數是否存在關聯。",1776690843810]