From 76d3b18699e9e206bbf4772c5791cb078eb474f0 Mon Sep 17 00:00:00 2001 From: Will Date: Tue, 2 Jul 2024 22:35:26 +0800 Subject: [PATCH 1/2] Add zh-tw translations --- 00-course-setup/translations/tw/README.md | 151 ++++ 00-course-setup/translations/tw/SETUP.md | 136 ++++ .../translations/tw/README.md | 147 ++++ .../translations/tw/README.md | 204 ++++++ .../translations/tw/README.md | 134 ++++ .../translations/tw/README.md | 399 +++++++++++ 05-advanced-prompts/translations/tw/README.md | 636 +++++++++++++++++ .../translations/tw/README.md | 656 ++++++++++++++++++ .../translations/tw/README.md | 185 +++++ .../translations/tw/README.md | 164 +++++ .../translations/tw/README.md | 466 +++++++++++++ .../translations/tw/README.md | 245 +++++++ .../translations/tw/assignment.md | 1 + .../translations/tw/README.md | 453 ++++++++++++ .../translations/tw/README.md | 121 ++++ .../translations/tw/README.md | 165 +++++ .../translations/tw/README.md | 87 +++ .../translations/tw/README.md | 268 +++++++ .../translations/tw/README.md | 80 +++ 17-ai-agents/translations/tw/README.md | 161 +++++ 18-fine-tuning/translations/tw/README.md | 98 +++ 18-fine-tuning/translations/tw/RESOURCES.md | 38 + docs/_navbar.md | 3 +- translations/tw/CODE_OF_CONDUCT.md | 10 + translations/tw/CONTRIBUTING.md | 123 ++++ translations/tw/README.md | 101 +++ translations/tw/SECURITY.md | 44 ++ 27 files changed, 5275 insertions(+), 1 deletion(-) create mode 100644 00-course-setup/translations/tw/README.md create mode 100644 00-course-setup/translations/tw/SETUP.md create mode 100644 01-introduction-to-genai/translations/tw/README.md create mode 100644 02-exploring-and-comparing-different-llms/translations/tw/README.md create mode 100644 03-using-generative-ai-responsibly/translations/tw/README.md create mode 100644 04-prompt-engineering-fundamentals/translations/tw/README.md create mode 100644 05-advanced-prompts/translations/tw/README.md create mode 100644 06-text-generation-apps/translations/tw/README.md create mode 100644 07-building-chat-applications/translations/tw/README.md create mode 100644 08-building-search-applications/translations/tw/README.md create mode 100644 09-building-image-applications/translations/tw/README.md create mode 100644 10-building-low-code-ai-applications/translations/tw/README.md create mode 100644 10-building-low-code-ai-applications/translations/tw/assignment.md create mode 100644 11-integrating-with-function-calling/translations/tw/README.md create mode 100644 12-designing-ux-for-ai-applications/translations/tw/README.md create mode 100644 13-securing-ai-applications/translations/tw/README.md create mode 100644 14-the-generative-ai-application-lifecycle/translations/tw/README.md create mode 100644 15-rag-and-vector-databases/translations/tw/README.md create mode 100644 16-open-source-models/translations/tw/README.md create mode 100644 17-ai-agents/translations/tw/README.md create mode 100644 18-fine-tuning/translations/tw/README.md create mode 100644 18-fine-tuning/translations/tw/RESOURCES.md create mode 100644 translations/tw/CODE_OF_CONDUCT.md create mode 100644 translations/tw/CONTRIBUTING.md create mode 100644 translations/tw/README.md create mode 100644 translations/tw/SECURITY.md diff --git a/00-course-setup/translations/tw/README.md b/00-course-setup/translations/tw/README.md new file mode 100644 index 000000000..0e6bfa0da --- /dev/null +++ b/00-course-setup/translations/tw/README.md @@ -0,0 +1,151 @@ +# 開始這門課程 + +我們非常興奮地期待你開始這門課程,看看你會受到什麼啟發來使用生成式 AI 建構! + +為了確保您的成功,本頁概述了設定步驟、技術需求以及在需要時獲取幫助的地方。 + +## 設定步驟 + +要開始這門課程,你需要完成以下步驟。 + +### 1. 複製這個 Repo + +[複製這個整個 repo](https://github.com/microsoft/generative-ai-for-beginners/fork?WT.mc_id=academic-105485-koreyst) 到你自己的 GitHub 帳號,以便更改任何程式碼並完成挑戰。你也可以[標記 (🌟) 這個 repo](https://docs.github.com/en/get-started/exploring-projects-on-github/saving-repositories-with-stars?WT.mc_id=academic-105485-koreyst) 以更容易找到它和相關的 repo。 + +### 2. 建立一個程式碼空間 + +為了避免在執行程式碼時出現任何相依性問題,我們建議在[GitHub Codespaces](https://github.com/features/codespaces?WT.mc_id=academic-105485-koreyst)中執行本課程。 + +這可以通過在您分叉的這個 repo 版本上選擇 `程式碼` 選項並選擇 **Codespaces** 選項來建立。 + +![顯示按鈕以建立程式碼空間的對話框](../../images/who-will-pay.webp?WT.mc_id=academic-105485-koreyst) + +### 3. 儲存您的 API 金鑰 + +保持您的 API 金鑰安全是建構任何類型應用程式時的重要事項。我們建議不要將任何 API 金鑰直接儲存在您的程式碼中。如果將這些詳細資訊提交到公共儲存庫,可能會導致安全問題,甚至在被惡意使用者利用時產生不必要的費用。 + +## 如何在本地電腦上執行 + +要在本機電腦上執行程式碼,你需要安裝某個版本的[Python](https://www.python.org/downloads/?WT.mc_id=academic-105485-koreyst)。 + +要使用這個儲存庫,你需要複製它: + +```shell +git clone https://github.com/microsoft/generative-ai-for-beginners +cd generative-ai-for-beginners +``` + +一旦你檢查完所有內容,就可以開始了! + +### 安裝 Miniconda (可選步驟) + +[Miniconda](https://conda.io/en/latest/miniconda.html?WT.mc_id=academic-105485-koreyst) 是一個輕量級的安裝程式,用於安裝 [Conda](https://docs.conda.io/en/latest?WT.mc_id=academic-105485-koreyst)、Python 以及一些套件。 +Conda 本身是一個套件管理器,使得設定和切換不同的 Python [**虛擬環境**](https://docs.python.org/3/tutorial/venv.html?WT.mc_id=academic-105485-koreyst)和套件變得容易。它也方便用於安裝無法通過 `pip` 獲取的套件。 + +你可以按照[MiniConda 安裝指南](https://docs.anaconda.com/free/miniconda/#quick-command-line-install?WT.mc_id=academic-105485-koreyst)來設定。 + +安裝 Miniconda 後,你需要複製這個[repository](https://github.com/microsoft/generative-ai-for-beginners/fork?WT.mc_id=academic-105485-koreyst) (如果你還沒有的話) + +接下來,你需要建立一個虛擬環境。要使用 Conda 來完成此操作,請繼續建立一個新的環境檔案 (_environment.yml_)。如果你正在使用 Codespaces,請在 `.devcontainer` 目錄中建立此檔案,因此為 `.devcontainer/environment.yml`。 + +請繼續並使用以下程式碼片段填充您的環境文件: + +```yml +name: +channels: + - defaults +dependencies: +- python= +- openai +- python-dotenv +``` + +環境文件指定了我們需要的相依套件。`` 指的是你想用於 Conda 環境的名稱,而 `` 是你想使用的 Python 版本,例如,`3` 是最新的 Python 主要版本。 + +完成後,您可以在命令列/終端機中執行以下命令來建立您的 Conda 環境 + +```bash +conda env create --name ai4beg --file .devcontainer/environment.yml # .devcontainer 子路徑僅適用於 Codespace 設定 +conda activate ai4beg +``` + +請參考[Conda 環境指南](https://docs.conda.io/projects/conda/en/latest/user-guide/tasks/manage-environments.html?WT.mc_id=academic-105485-koreyst)如果你遇到任何問題。 + +### 使用 Visual Studio Code 搭配 Python 支援擴充功能 + +我們建議在本課程中使用安裝了[Python 支援擴充功能](https://marketplace.visualstudio.com/items?itemName=ms-python.python&WT.mc_id=academic-105485-koreyst)的[Visual Studio Code (VS Code)](http://code.visualstudio.com/?WT.mc_id=academic-105485-koreyst)編輯器。不過,這只是建議,並不是絕對的要求。 + +> **注意**: 通過在 VS Code 中打開課程儲存庫,你可以選擇在容器中設定專案。這是因為在課程儲存庫中發現的[特殊 `.devcontainer`](https://code.visualstudio.com/docs/devcontainers/containers?itemName=ms-python.python&WT.mc_id=academic-105485-koreyst)目錄。更多內容稍後介紹。 + +> **注意**: 一旦你複製並在 VS Code 中打開目錄,它會自動建議你安裝一個 Python 支援擴充套件。 + +> **注意**: 如果 VS Code 建議你在容器中重新開啟這個儲存庫,請拒絕此請求以使用本地安裝的 Python 版本。 + +### 在瀏覽器中使用 Jupyter + +你也可以在瀏覽器中使用[Jupyter 環境](https://jupyter.org?WT.mc_id=academic-105485-koreyst)來進行專案。經典的 Jupyter 和 [Jupyter Hub](https://jupyter.org/hub?WT.mc_id=academic-105485-koreyst)都提供了相當愉快的開發環境,具有自動完成、程式碼高亮等功能。 + +要在本地啟動 Jupyter,請前往終端機/命令列,導航到課程目錄,並執行: + +```bash +jupyter notebook +``` + +或 + +```bash +jupyterhub +``` + +這將啟動一個 Jupyter 實例,並且訪問它的 URL 將顯示在命令行視窗中。 + +一旦你訪問該 URL,你應該會看到課程大綱並能夠導航到任何 `*.ipynb` 文件。例如,`08-building-search-applications/python/oai-solution.ipynb`。 + +### 執行在容器中 + +設定所有內容在您的電腦或 Codespace 上的替代方法是使用一個[容器](https://en.wikipedia.org/wiki/Containerization_(computing)?WT.mc_id=academic-105485-koreyst)。課程儲存庫中的特殊 `.devcontainer` 資料夾使 VS Code 能夠在容器內設定專案。在 Codespaces 之外,這將需要安裝 Docker,坦白說,這涉及一些工作,因此我們只建議有容器工作經驗的人使用。 + +使用 GitHub Codespaces 時,保持 API 金鑰安全的最佳方法之一是使用 Codespace Secrets。請按照[Codespaces secrets management](https://docs.github.com/en/codespaces/managing-your-codespaces/managing-secrets-for-your-codespaces?WT.mc_id=academic-105485-koreyst)指南來了解更多資訊。 + +## 課程和技術需求 + +這門課程有6個概念課和6個程式碼課。 + +在程式碼課程中,我們使用 Azure OpenAI 服務。您將需要訪問 Azure OpenAI 服務和一個 API 金鑰來執行這段程式碼。您可以通過[完成此申請](https://azure.microsoft.com/products/ai-services/openai-service?WT.mc_id=academic-105485-koreyst)來申請訪問權限。 + +在等待您的應用程式處理時,每個編碼課程還包括一個 `README.md` 文件,您可以在其中查看程式碼和輸出。 + +## 第一次使用 Azure OpenAI 服務 + +如果這是您第一次使用 Azure OpenAI 服務,請按照此指南了解如何[建立和部署 Azure OpenAI 服務資源](https://learn.microsoft.com/azure/ai-services/openai/how-to/create-resource?pivots=web-portal&WT.mc_id=academic-105485-koreyst)。 + +## 第一次使用 OpenAI API + +如果這是您第一次使用 OpenAI API,請按照指南[建立和使用介面](https://platform.openai.com/docs/quickstart?context=pythont&WT.mc_id=academic-105485-koreyst)。 + +## 認識其他學習者 + +我們已經在我們的官方[AI 社群 Discord 伺服器](https://aka.ms/genai-discord?WT.mc_id=academic-105485-koreyst)中建立了頻道,以便與其他學習者會面。這是一個與其他志同道合的企業家、建構者、學生和任何希望在生成式 AI 中提升的人聯繫的好方法。 + +[![加入 discord 頻道](https://dcbadge.vercel.app/api/server/ByRwuEEgH4)](https://aka.ms/genai-discord?WT.mc_id=academic-105485-koreyst) + +專案團隊也會在這個 Discord 伺服器上幫助任何學習者。 + +## 貢獻 + +這門課程是一個開放原始碼計劃。如果您看到改進的地方或問題,請建立一個[Pull Request](https://github.com/microsoft/generative-ai-for-beginners/pulls?WT.mc_id=academic-105485-koreyst)或記錄一個[GitHub issue](https://github.com/microsoft/generative-ai-for-beginners/issues?WT.mc_id=academic-105485-koreyst)。 + +專案團隊將追蹤所有貢獻。對開放原始碼做出貢獻是建立你在生成式 AI 領域職業生涯的驚人方式。 + +大多數的貢獻需要您同意貢獻者許可協議(CLA),聲明您有權並實際上授予我們使用您的貢獻的權利。詳情請訪問[CLA, Contributor License Agreement website](https://cla.microsoft.com?WT.mc_id=academic-105485-koreyst)。 + +重要事項: 在翻譯此 repo 中的文字時,請確保不要使用機器翻譯。我們將通過社群驗證翻譯,因此請僅在您精通的語言中自願進行翻譯。 + +當你提交一個拉取請求時,CLA-bot 會自動判斷你是否需要提供 CLA 並適當地裝飾 PR (例如,標籤、評論)。只需按照 bot 提供的指示操作。你只需在所有使用我們 CLA 的儲存庫中執行一次此操作。 + +此專案已採用[Microsoft 開放原始碼行為準則](https://opensource.microsoft.com/codeofconduct/?WT.mc_id=academic-105485-koreyst)。如需更多資訊,請閱讀行為準則常見問題或聯絡[Email opencode](opencode@microsoft.com)以獲取任何其他問題或意見。 + +## 讓我們開始吧 + +現在你已經完成了完成這門課程所需的步驟,讓我們開始[介紹生成式 AI 和 LLMs](../../../01-introduction-to-genai/translations/tw/README.md?WT.mc_id=academic-105485-koreyst)。 + diff --git a/00-course-setup/translations/tw/SETUP.md b/00-course-setup/translations/tw/SETUP.md new file mode 100644 index 000000000..a8ad931b7 --- /dev/null +++ b/00-course-setup/translations/tw/SETUP.md @@ -0,0 +1,136 @@ +# 設定 Your Dev Environment + +我們設定了這個資料庫和課程,並使用[開發容器](https://containers.dev?WT.mc_id=academic-105485-koreyst),該容器具有通用執行環境,可以支援 Python3、.NET、Node.js 和 Java 開發。相關配置定義在此資料庫根目錄的 `.devcontainer/` 資料夾中的 `devcontainer.json` 文件中。 + +要啟動開發容器,請在[GitHub Codespaces](https://docs.github.com/en/codespaces/overview?WT.mc_id=academic-105485-koreyst)(用於雲端託管的執行環境)或[Docker Desktop](https://docs.docker.com/desktop/?WT.mc_id=academic-105485-koreyst)(用於本地設備託管的執行環境)中啟動它。閱讀[此文件](https://code.visualstudio.com/docs/devcontainers/containers?WT.mc_id=academic-105485-koreyst)以獲取有關開發容器在 VS Code 中如何工作的更多詳細資訊。 + +> [!TIP] +> 我們建議使用 GitHub Codespaces 來快速開始並減少努力。它為個人帳戶提供慷慨的[免費使用配額](https://docs.github.com/billing/managing-billing-for-github-codespaces/about-billing-for-github-codespaces#monthly-included-storage-and-core-hours-for-personal-accounts?WT.mc_id=academic-105485-koreyst)。配置[超時](https://docs.github.com/codespaces/setting-your-user-preferences/setting-your-timeout-period-for-github-codespaces?WT.mc_id=academic-105485-koreyst)以停止或刪除不活動的 codespaces 以最大化您的配額使用。 + +## 1. 執行指派任務 + +每節課將有_可選的_作業,可能會以一種或多種程式語言提供,包括: Python、.NET/C#、Java 和 JavaScript/TypeScript。本節提供與執行這些作業相關的一般指導。 + +### 1.1 Python 指派 + +Python 指派是以應用程式(`.py` 檔案)或 Jupyter 筆記本(`.ipynb` 檔案)提供。 + +- 要執行筆記本,請在 Visual Studio Code 中打開它,然後點擊 _Select Kernel_ (在右上角),並選擇顯示的預設 Python 3 選項。現在你可以 _Run All_ 來執行筆記本。 +- 要從命令列執行 Python 應用程式,請遵循特定作業的指示,以確保選擇正確的檔案並提供所需的參數。 + +## 2. 設定提供者 + +作業**可能**也會被設定為通過像 OpenAI、Azure 或 Hugging Face 這樣的支援服務提供者來對抗一個或多個大型語言模型(LLM)部署。這些提供一個_託管端點_(API),我們可以使用正確的憑證(API 金鑰或令牌)以程式化方式訪問。在本課程中,我們討論這些提供者: + +- [OpenAI](https://platform.openai.com/docs/models?WT.mc_id=academic-105485-koreyst) 包含多樣化模型,包括核心的 GPT 系列。 + - [Azure OpenAI](https://learn.microsoft.com/azure/ai-services/openai/?WT.mc_id=academic-105485-koreyst) 提供專注於企業準備的 OpenAI 模型 + - [Hugging Face](https://huggingface.co/docs/hub/index?WT.mc_id=academic-105485-koreyst) 提供開放原始碼模型和推論伺服器 + +**你將需要使用你自己的帳戶來完成這些練習**。作業是可選的,所以你可以根據自己的興趣選擇設定一個、全部或不設定任何提供者。以下是一些註冊的指導: + +| 註冊 | 費用 | API 金鑰 | 操作平台 | 評論 | +|:---|:---|:---|:---|:---| +| [OpenAI](https://platform.openai.com/signup?WT.mc_id=academic-105485-koreyst)| [價格](https://openai.com/pricing#language-models?WT.mc_id=academic-105485-koreyst)| [基於專案](https://platform.openai.com/api-keys?WT.mc_id=academic-105485-koreyst) | [無程式碼, 網頁](https://platform.openai.com/playground?WT.mc_id=academic-105485-koreyst) | 多種模型可用 | +| [Azure](https://aka.ms/azure/free?WT.mc_id=academic-105485-koreyst)| [價格](https://azure.microsoft.com/pricing/details/cognitive-services/openai-service/?WT.mc_id=academic-105485-koreyst)| [SDK 快速入門](https://learn.microsoft.com/azure/ai-services/openai/quickstart?WT.mc_id=academic-105485-koreyst)| [Studio 快速入門](https://learn.microsoft.com/azure/ai-services/openai/quickstart?WT.mc_id=academic-105485-koreyst) | [必須提前申請訪問](https://learn.microsoft.com/azure/ai-services/openai/?WT.mc_id=academic-105485-koreyst)| +| [Hugging Face](https://huggingface.co/join?WT.mc_id=academic-105485-koreyst) | [價格](https://huggingface.co/pricing) | [存取權杖](https://huggingface.co/docs/hub/security-tokens?WT.mc_id=academic-105485-koreyst) | [Hugging Chat](https://huggingface.co/chat/?WT.mc_id=academic-105485-koreyst)| [Hugging Chat 有限的模型](https://huggingface.co/chat/models?WT.mc_id=academic-105485-koreyst) | +| | | | | | + +按照以下指示來_配置_此儲存庫以供不同提供者使用。需要特定提供者的作業將在其檔案名中包含以下標籤之一: + +- `aoai` - 需要 Azure OpenAI 端點, 金鑰 + - `oai` - 需要 OpenAI 端點, 金鑰 + - `hf` - 需要 Hugging Face token + +您可以設定一個、沒有或所有提供者。相關的分配將在缺少憑證時簡單地出錯。 + +### 2.1. 建立 `.env` 文件 + +我們假設您已經閱讀了上述指南並註冊了相關提供者,並獲得了所需的身份驗證憑證(API_KEY 或 token)。在 Azure OpenAI 的情況下,我們假設您還擁有一個有效的 Azure OpenAI 服務部署(endpoint),並至少部署了一個 GPT 模型以完成聊天。 + +下一步是按如下方式配置你的**本地環境變數**: + +1. 在根目錄中查找 `.env.copy` 文件,內容應如下所示: + + ```bash + # OpenAI Provider + OPENAI_API_KEY='' + + ## Azure OpenAI + AZURE_OPENAI_API_VERSION='2024-02-01' # Default is set! + AZURE_OPENAI_API_KEY='' + AZURE_OPENAI_ENDPOINT='' + AZURE_OPENAI_DEPLOYMENT='' + AZURE_OPENAI_EMBEDDINGS_DEPLOYMENT='' + + ## Hugging Face + HUGGING_FACE_API_KEY='' + ``` + +2. 使用以下命令將該文件複製到 `.env`。此文件已被 _gitignore-d_,以保護秘密資訊。 + + ```bash + cp .env.copy .env + ``` + +3. 按照下一節中的描述填寫值(替換 `=` 右側的佔位符)。 + +3. (選項) 如果您使用 GitHub Codespaces,您可以選擇將環境變數保存為與此存儲庫關聯的 _Codespaces secrets_。在這種情況下,您不需要設置本地 .env 文件。**但是,請注意,此選項僅在您使用 GitHub Codespaces 時有效。**如果您使用 Docker Desktop,仍然需要設置 .env 文件。 + +### 2.2. 填寫 `.env` 檔案 + +讓我們快速看一下變數名稱,以了解它們代表什麼: + +| Variable | Description | +| :--- | :--- | +| HUGGING_FACE_API_KEY | 這是您在個人資料中設定的使用者存取權杖 | +| OPENAI_API_KEY | 這是用於非 Azure OpenAI 端點服務的授權金鑰 | +| AZURE_OPENAI_KEY | 這是用於該服務的授權金鑰 | +| AZURE_OPENAI_ENDPOINT | 這是 Azure OpenAI 資源的部署端點 | +| AZURE_OPENAI_DEPLOYMENT | 這是 _文本生成_ 模型的部署端點 | +| AZURE_OPENAI_EMBEDDINGS_DEPLOYMENT | 這是 _文本嵌入_ 模型的部署端點 | +| | | + +注意: 最後兩個 Azure OpenAI 變數分別反映了聊天完成(文字產生)和向量搜尋(嵌入)的預設模型。設定它們的說明將在相關作業中定義。 + +### 2.3 設定 Azure: 從 Portal + +Azure OpenAI 端點和金鑰值可以在 [Azure Portal](https://portal.azure.com?WT.mc_id=academic-105485-koreyst) 找到,所以讓我們從那裡開始。 + +1. 前往 [Azure Portal](https://portal.azure.com?WT.mc_id=academic-105485-koreyst) +1. 點擊側邊欄中的 **Keys and Endpoint** 選項(左側選單)。 +1. 點擊 **Show Keys** - 你應該會看到以下內容: KEY 1, KEY 2 和 Endpoint。 +1. 使用 KEY 1 的值作為 AZURE_OPENAI_KEY +1. 使用 Endpoint 的值作為 AZURE_OPENAI_ENDPOINT + +接下來,我們需要已部署的特定模型的端點。 + +1. 在側邊欄(左側選單)中點擊 **Model deployments** 選項以獲取 Azure OpenAI 資源。 +1. 在目標頁面中,點擊 **Manage Deployments** + +這將帶你到 Azure OpenAI Studio 網站,我們會在那裡找到如下所述的其他值。 + +### 2.4 設定 Azure: 從 Studio + +1. 按照上述說明從你的資源導航到 [Azure OpenAI Studio](https://oai.azure.com?WT.mc_id=academic-105485-koreyst)。 +1. 點擊 **Deployments** 標籤(側邊欄,左側)以查看當前部署的模型。 +1. 如果你想要的模型尚未部署,使用 **Create new deployment** 來部署它。 +1. 你將需要一個 _text-generation_ 模型 - 我們推薦: **gpt-35-turbo** +1. 你將需要一個 _text-embedding_ 模型 - 我們推薦 **text-embedding-ada-002** + +現在更新環境變數以反映所使用的_部署名稱_。這通常與模型名稱相同,除非你明確更改了它。因此,作為範例,你可能會有: + +```bash +AZURE_OPENAI_DEPLOYMENT='gpt-35-turbo' +AZURE_OPENAI_EMBEDDINGS_DEPLOYMENT='text-embedding-ada-002' +``` + +**不要忘記在完成後保存.env文件**。你現在可以退出文件並返回執行筆記本的說明。 + +### 2.5 設定 OpenAI: 從 Profile + +你的 OpenAI API 金鑰可以在你的 [OpenAI 帳戶](https://platform.openai.com/api-keys?WT.mc_id=academic-105485-koreyst)中找到。如果你沒有,你可以註冊一個帳戶並建立一個 API 金鑰。一旦你有了金鑰,你可以用它來填充 `.env` 檔案中的 `OPENAI_API_KEY` 變數。 + +### 2.6 設定 Hugging Face: 從個人資料 + +您的 Hugging Face token 可以在您的個人資料中的[Access Tokens](https://huggingface.co/settings/tokens?WT.mc_id=academic-105485-koreyst)找到。不要公開張貼或分享這些資訊。相反地,為此專案使用建立一個新的 token,並將其複製到 `.env` 檔案中的 `HUGGING_FACE_API_KEY` 變數下。_注意:_ 這在技術上不是 API key,但用於身份驗證,因此我們保持這個命名慣例以保持一致性。 + diff --git a/01-introduction-to-genai/translations/tw/README.md b/01-introduction-to-genai/translations/tw/README.md new file mode 100644 index 000000000..89b654280 --- /dev/null +++ b/01-introduction-to-genai/translations/tw/README.md @@ -0,0 +1,147 @@ +# 介紹生成式人工智慧和大型語言模型 + +[![生成式 AI 和大型語言模型介紹](../../images/01-lesson-banner.png?WT.mc_id=academic-105485-koreyst)](https://aka.ms/gen-ai-lesson-1-gh?WT.mc_id=academic-105485-koreyst) + +_(點擊上方圖片觀看本課程的影片)_ + +生成式 AI 是能夠生成文字、圖像和其他類型內容的人工智慧。使其成為一項奇妙技術的是它使 AI 民主化,任何人只需使用簡單的文字提示、一句自然語言書寫的句子即可使用它。你不需要學習像 Java 或 SQL 這樣的語言來完成有價值的事情,你只需要使用你的語言,說出你想要的東西,AI 模型就會給出建議。這的應用和影響是巨大的,你可以在幾秒鐘內撰寫或理解報告、撰寫應用程式等等。 + +在這門課程中,我們將探討我們的初創公司如何利用生成式 AI 來開啟教育領域的新場景,以及我們如何應對其應用的社會影響和技術限制所帶來的不可避免的挑戰。 + +## 簡介 + +本課程將涵蓋: + +- 業務場景介紹: 我們的創業想法和使命。 +- 生成式 AI 以及我們如何在當前技術環境中立足。 +- 大型語言模型的內部運作。 +- 大型語言模型的主要能力和實際使用案例。 + +## 學習目標 + +完成本課程後,你將了解: + +- 什麼是生成式 AI 以及大型語言模型如何運作。 +- 如何利用大型語言模型應用於不同的使用案例,重點在教育情境。 + +## 情境: 我們的教育新創公司 + +生成式人工智慧(AI)代表了AI技術的巔峰,推動了曾經被認為不可能的邊界。生成式AI模型具有多種能力和應用,但在這個課程中,我們將探討它如何通過一個虛構的初創公司來革新教育。我們將這個初創公司稱為_我們的初創公司_。我們的初創公司在教育領域工作,擁有雄心勃勃的使命宣言 + +> _在全球範圍內改善學習的可及性,確保教育的公平獲取,並根據每個學習者的需求提供個性化的學習體驗_。 + +我們的初創團隊知道,如果不利用現代最強大的工具之一——大型語言模型(LLMs),我們將無法實現這一目標。 + +生成式 AI 預計將徹底改變我們今天的學習和教學方式,學生可以隨時隨地使用虛擬教師,這些教師提供大量的資訊和範例,而教師則能利用創新工具來評估學生並提供反饋。 + +![五個年輕學生看著螢幕 - 圖片由 DALLE2 提供](../../images/students-by-DALLE2.png?WT.mc_id=academic-105485-koreyst) + +為了開始,讓我們定義一些我們將在整個課程中使用的基本概念和術語。 + +## 我們是如何獲得生成式 AI 的? + +儘管最近因生成式 AI 模型的宣布而引起了非凡的_炒作_,這項技術已經醞釀了數十年,最早的研究努力可以追溯到60年代。我們現在處於 AI 具有類似人類認知能力的階段,例如[OpenAI ChatGPT](https://openai.com/chatgpt)或[Bing Chat](https://www.microsoft.com/edge/features/bing-chat?WT.mc_id=academic-105485-koreyst)所展示的對話,後者也使用 GPT 模型進行網頁搜索 Bing 對話。 + +回顧一下,最早的 AI 原型由打字聊天機器人組成,依賴從一群專家那裡提取的知識庫並表示在電腦中。知識庫中的答案是由輸入文本中出現的關鍵字觸發的。 +然而,很快就清楚這種使用打字聊天機器人的方法並不具延展性。 + +### 一種統計方法的AI: 機器學習 + +90年代出現了一個轉折點,隨著統計方法在文本分析中的應用。這導致了新算法的開發——被稱為機器學習——能夠從數據中學習模式,而不需要明確編程。這種方法允許機器模擬人類語言理解:一個統計模型在文本-標籤配對上進行訓練,使模型能夠用預定義的標籤來分類未知的輸入文本,這些標籤代表了訊息的意圖。 + +### 神經網絡與現代虛擬助手 + +隨著硬體技術的進步,能夠處理更大量的數據和更複雜的計算,促進了人工智慧領域的研究,導致了先進機器學習算法的發展——稱為神經網絡或深度學習算法。 + +神經網路(特別是循環神經網路 - RNNs)顯著提升了自然語言處理,使得文本意義的表示更加有意義,並重視單詞在句子中的上下文。 + +這是支援新世紀第一個十年誕生的虛擬助手的技術,非常擅長解釋人類語言、識別需求並執行動作以滿足需求——例如用預定義的腳本回答或使用第三方服務。 + +### 現今,生成式 AI + +因此,我們來到了今天的生成式 AI,它可以被視為深度學習的一個子集。 + +![AI, ML, DL 和生成式 AI](../../images/AI-diagram.png?WT.mc_id=academic-105485-koreyst) + +經過數十年的 AI 領域研究,一種新的模型架構——稱為 _Transformer_——克服了 RNN 的限制,能夠將更長的文本序列作為輸入。Transformers 基於注意力機制,使模型能夠對接收到的輸入賦予不同的權重,「更多地關注」最相關的資訊集中之處,而不管它們在文本序列中的順序。 + +最近的大多數生成式 AI 模型——也稱為大型語言模型(LLMs),因為它們處理文本輸入和輸出——確實基於這種架構。這些模型的有趣之處在於,它們是基於從書籍、文章和網站等多種來源獲取的大量未標記數據進行訓練的,可以適應各種任務並生成語法正確且具有創意的文本。因此,它們不僅極大地增強了機器「理解」輸入文本的能力,還使其能夠用人類語言生成原創回應。 + +## 大型語言模型如何運作? + +在下一章中,我們將探索不同類型的生成式 AI 模型,但現在讓我們來看看大型語言模型如何運作,重點是 OpenAI GPT(生成式預訓練變壓器)模型。 + +- **分詞器,文字轉數字**: 大型語言模型接收文字作為輸入並生成文字作為輸出。然而,作為統計模型,它們處理數字比處理文字序列效果更好。這就是為什麼每個輸入到模型的資料在被核心模型使用之前都會經過分詞器處理。分詞器的主要任務是將輸入拆分為一個個的詞元。詞元是一段文字,由可變數量的字符組成。然後,每個詞元都會被映射到一個詞元索引,即原始文字段的整數編碼。 + +![範例的標記化](../../images/tokenizer-example.png?WT.mc_id=academic-105485-koreyst) + +- **預測輸出標記**: 給定 n 個標記作為輸入(最大 n 因模型而異), 模型能夠預測一個標記作為輸出。這個標記然後被納入下一次迭代的輸入中,以擴展窗口模式進行, 從而提供更好的用戶體驗, 得到一個(或多個)句子作為答案。這解釋了為什麼, 如果你曾經使用過 ChatGPT, 你可能注意到有時它看起來像是在句子中間停下來。 + +- **選擇過程, 機率分佈**: 輸出標記是由模型根據其在當前文本序列之後出現的機率選擇的。這是因為模型預測了所有可能的「下一個標記」的機率分佈, 基於其訓練計算。然而, 並不總是從結果分佈中選擇機率最高的標記。這個選擇中加入了一定程度的隨機性, 使模型以非確定性的方式行事 - 我們不會對相同的輸入得到完全相同的輸出。這種隨機性程度是為了模擬創意思考過程而加入的, 可以使用一個稱為溫度的模型參數進行調整。 + +## 我們的初創公司如何利用大型語言模型? + +現在我們對大型語言模型的內部運作有了更好的理解,讓我們來看看一些它們能夠執行得相當好的常見任務的實際範例,並關注我們的業務場景。 +我們說過,大型語言模型的主要能力是_從頭開始生成文本,從用自然語言書寫的文本輸入開始_。 + +但是什麼樣的文本輸入和輸出呢? +大型語言模型的輸入被稱為提示,而輸出被稱為完成,這個術語指的是模型生成下一個標記以完成當前輸入的機制。我們將深入探討什麼是提示以及如何設計它以充分利用我們的模型。但現在,讓我們先說提示可能包括: + +- 一個**指令**,指定我們期望從模型中獲得的輸出類型。這個指令有時可能會嵌入一些範例或一些額外的數據。 + + 1. 對文章、書籍、產品評論等進行摘要,並從非結構化數據中提取見解。 + + ![摘要範例](../../images/summarization-example.png?WT.mc_id=academic-105485-koreyst) + +
+ + 2. 創意構思和設計文章、論文、作業等。 + + ![創意寫作範例](../../images/creative-writing-example.png?WT.mc_id=academic-105485-koreyst) + +
+ +- 以與代理對話的形式提出的**問題**。 + +![範例的對話](../../images/conversation-example.png?WT.mc_id=academic-105485-koreyst) + +
+ +- 一段**需要完成的文字**, 這隱含著尋求寫作協助的請求。 + +![範例的文字完成](../../images/text-completion-example.png?WT.mc_id=academic-105485-koreyst) + +
+ +- 一段**程式碼**,連同要求解釋和記錄它,或者一個評論要求生成一段執行特定任務的程式碼。 + +![程式碼範例](../../images/coding-example.png?WT.mc_id=academic-105485-koreyst) + +
+ +上述範例相當簡單,並不想詳盡展示大型語言模型的能力。它們只是想展示使用生成式 AI 的潛力,特別是但不限於教育情境。 + +此外,生成式 AI 模型的輸出並不完美,有時模型的創造力會適得其反,導致輸出結果是人類用戶可以解讀為現實神秘化的詞語組合,或者可能具有冒犯性。生成式 AI 並不智能——至少在更全面的智能定義中,包括批判性和創造性推理或情感智能;它不是確定性的,也不值得信賴,因為虛構的內容,如錯誤的引用、內容和陳述,可能會與正確的資訊結合在一起,以令人信服和自信的方式呈現。在接下來的課程中,我們將處理所有這些限制,並看看我們能做些什麼來減輕它們。 + +## 作業 + +你的任務是閱讀更多關於[生成式 AI](https://en.wikipedia.org/wiki/Generative_artificial_intelligence?WT.mc_id=academic-105485-koreyst)的資訊,並嘗試找出一個今天沒有使用生成式 AI 的領域,你會在那裡加入生成式 AI。這樣做的影響與「舊方式」有何不同,你能做以前做不到的事情,還是你變得更快了?寫一篇300字的摘要,描述你夢想中的 AI 初創公司會是什麼樣子,並包括像「問題」、「我會如何使用 AI」、「影響」這樣的標題,還可以選擇性地包括一個商業計劃。 + +如果你完成了這個任務,你甚至可能準備好申請微軟的孵化器,[Microsoft for Startups Founders Hub](https://www.microsoft.com/startups?WT.mc_id=academic-105485-koreyst) 我們提供 Azure、OpenAI、指導等多方面的點數,快來看看吧! + +## 知識檢查 + +什麼是關於大型語言模型的真相? + +1. 你每次都會得到完全相同的回應。 +1. 它做事完美無缺,非常擅長加數、產生可執行的程式碼等。 +1. 儘管使用相同的提示,回應可能會有所不同。它也非常擅長給你某些東西的初稿,不論是文本還是程式碼。但你需要改進結果。 + +A: 3, LLM 是非決定性的,回應會有所不同,不過,你可以透過溫度設定來控制其變異。你也不應該期望它能完美地完成所有事情,它的目的是為你分擔繁重的工作,這通常意味著你會得到一個不錯的初步嘗試,然後你需要逐步改進。 + +## 很棒的工作!繼續這段旅程 + +完成本課程後,請查看我們的[生成式 AI 學習集合](https://aka.ms/genai-collection?WT.mc_id=academic-105485-koreyst)以繼續提升您的生成式 AI 知識! + +前往第2課,我們將探討如何[探索和比較不同的LLM類型](../../../02-exploring-and-comparing-different-llms/translations/tw/README.md?WT.mc_id=academic-105485-koreyst)! + diff --git a/02-exploring-and-comparing-different-llms/translations/tw/README.md b/02-exploring-and-comparing-different-llms/translations/tw/README.md new file mode 100644 index 000000000..11006bbd8 --- /dev/null +++ b/02-exploring-and-comparing-different-llms/translations/tw/README.md @@ -0,0 +1,204 @@ +# 探索和比較不同的 LLMs + +[![探索和比較不同的 LLMs](../../images/02-lesson-banner.png?WT.mc_id=academic-105485-koreyst)](https://aka.ms/gen-ai-lesson2-gh?WT.mc_id=academic-105485-koreyst) + +> _點擊上方圖片觀看本課程的影片_ + +隨著上一課,我們已經看到生成式 AI 如何改變技術格局、大型語言模型(LLMs)如何運作以及企業(如我們的初創公司)如何將它們應用於其使用案例並成長!在本章中,我們將比較和對比不同類型的大型語言模型(LLMs),以了解它們的優缺點。 + +我們初創公司旅程的下一步是探索目前的LLM領域,並了解哪些適合我們的使用案例。 + +## 簡介 + +本課程將涵蓋: + +- 當前環境中不同類型的 LLMs。 +- 在 Azure 中測試、迭代和比較不同的模型以適應您的使用案例。 +- 如何部署 LLM。 + +## 學習目標 + +完成本課程後,你將能夠: + +- 選擇適合您使用案例的模型。 +- 了解如何測試、迭代和改進模型的性能。 +- 知道企業如何部署模型。 + +## 了解不同類型的 LLMs + +LLMs 可以根據其架構、訓練數據和使用案例進行多種分類。了解這些差異將幫助我們的初創公司為場景選擇合適的模型,並了解如何測試、迭代和改進性能。 + +有許多不同類型的 LLM 模型,你選擇的模型取決於你打算如何使用它們、你的數據、你準備支付多少以及更多。 + +根據您是否打算使用模型來生成文本、音訊、影片、圖像等,您可能會選擇不同類型的模型。 + +- **音訊和語音識別**. 為此目的,Whisper 型模型是一個很好的選擇,因為它們是通用的並且針對語音識別。它在多樣化的音訊上進行訓練,能夠執行多語言的語音識別。了解更多關於[Whisper 型模型](https://platform.openai.com/docs/models/whisper?WT.mc_id=academic-105485-koreyst)。 + +- **圖像生成**. 對於圖像生成,DALL-E 和 Midjourney 是兩個非常知名的選擇。DALL-E 由 Azure OpenAI 提供。 [閱讀更多關於 DALL-E 的資訊](https://platform.openai.com/docs/models/dall-e?WT.mc_id=academic-105485-koreyst) 以及本課程的第九章。 + +- **文本生成**. 大多數模型都是針對文本生成進行訓練的,您可以從 GPT-3.5 到 GPT-4 中選擇多種選擇。它們的成本不同,其中 GPT-4 是最昂貴的。值得查看 [Azure OpenAI playground](https://oai.azure.com/portal/playground?WT.mc_id=academic-105485-koreyst) 來評估哪個模型在能力和成本方面最適合您的需求。 + +- **多模態**. 如果您希望處理輸入和輸出中的多種類型數據,您可能需要查看像 [gpt-4 turbo with vision 或 gpt-4o](https://learn.microsoft.com/azure/ai-services/openai/concepts/models#gpt-4-and-gpt-4-turbo-models?WT.mc_id=academic-105485-koreyst) 這樣的模型 - 最新發布的 OpenAI 模型 - 它們能夠將自然語言處理與視覺理解相結合,通過多模態介面實現互動。 + +選擇一個模型意味著你會獲得一些基本功能,但這可能還不夠。通常你會有一些公司特定的數據需要告訴LLM。有幾種不同的方法可以解決這個問題,更多內容將在接下來的部分中介紹。 + +### Foundation Models versus LLMs + +術語 Foundation Model 由[史丹佛研究人員創造](https://arxiv.org/abs/2108.07258?WT.mc_id=academic-105485-koreyst),並定義為符合某些標準的 AI 模型,例如: + +- **它們使用無監督學習或自我監督學習進行訓練**, 意味著它們在未標記的多模態資料上進行訓練,並且不需要人類註釋或標記資料來進行訓練過程。 +- **它們是非常大的模型**, 基於非常深的神經網絡,訓練了數十億個參數。 +- **它們通常旨在作為其他模型的「基礎」**, 意味著它們可以作為其他模型的起點,通過微調來建構。 + +![Foundation Models versus LLMs](../../images/FoundationModel.png?WT.mc_id=academic-105485-koreyst) + +圖片來源: [Essential Guide to Foundation Models and Large Language Models | by Babar M Bhatti | Medium](https://thebabar.medium.com/essential-guide-to-foundation-models-and-large-language-models-27dab58f7404) + +為了進一步澄清這一區別,讓我們以ChatGPT為例。為了建構第一版的ChatGPT,一個名為GPT-3.5的模型作為基礎模型。這意味著OpenAI使用了一些特定於聊天的資料來建立一個調整過的GPT-3.5版本,專門在對話場景中表現良好,例如聊天機器人。 + +![Foundation Model](../../images/Multimodal.png?WT.mc_id=academic-105485-koreyst) + +圖片來源: [2108.07258.pdf (arxiv.org)](https://arxiv.org/pdf/2108.07258.pdf?WT.mc_id=academic-105485-koreyst)。 + +### 開放原始碼 versus 專有模型 + +另一種分類 LLMs 的方式是它們是開放原始碼還是專有的。 + +開放原始碼模型是公開提供給大眾使用的模型,任何人都可以使用。這些模型通常由創建它們的公司或研究社群提供。這些模型允許被檢查、修改和自訂,以適應LLM的各種使用案例。然而,它們並不總是針對生產使用進行最佳化,性能可能不如專有模型。此外,開放原始碼模型的資金可能有限,可能不會長期維護或更新最新的研究。受歡迎的開放原始碼模型範例包括[Alpaca](https://crfm.stanford.edu/2023/03/13/alpaca.html?WT.mc_id=academic-105485-koreyst)、[Bloom](https://sapling.ai/llm/bloom?WT.mc_id=academic-105485-koreyst)和[LLaMA](https://sapling.ai/llm/llama?WT.mc_id=academic-105485-koreyst)。 + +專有模型是由公司擁有且不對公眾開放的模型。這些模型通常針對生產用途進行最佳化。然而,它們不允許被檢查、修改或針對不同的使用案例進行自訂。此外,它們並不總是免費提供,可能需要訂閱或支付費用才能使用。而且,使用者無法控制用於訓練模型的數據,這意味著他們應該信任模型擁有者來確保對數據隱私和負責任使用 AI 的承諾。流行的專有模型範例包括[OpenAI models](https://platform.openai.com/docs/models/overview?WT.mc_id=academic-105485-koreyst)、[Google Bard](https://sapling.ai/llm/bard?WT.mc_id=academic-105485-koreyst)或[Claude 2](https://www.anthropic.com/index/claude-2?WT.mc_id=academic-105485-koreyst)。 + +### 嵌入對比圖像生成對比文本和程式碼產生器 + +LLM 也可以根據它們生成的輸出來分類。 + +嵌入是一組可以將文本轉換為數字形式的模型,稱為嵌入,這是輸入文本的數字表示。嵌入使機器更容易理解單詞或句子之間的關係,並且可以作為其他模型的輸入,例如分類模型或在數據上表現更好的聚類模型。嵌入模型通常用於遷移學習,其中模型是為有大量數據的代理任務建構的,然後模型權重(嵌入)被重新用於其他下游任務。這類的範例是[OpenAI embeddings](https://platform.openai.com/docs/models/embeddings?WT.mc_id=academic-105485-koreyst)。 + +![嵌入](../../images/Embedding.png?WT.mc_id=academic-105485-koreyst) + +圖像生成模型是生成圖像的模型。這些模型通常用於圖像編輯、圖像合成和圖像翻譯。圖像生成模型通常在大型圖像數據集上進行訓練,例如 [LAION-5B](https://laion.ai/blog/laion-5b/?WT.mc_id=academic-105485-koreyst),並可用於生成新圖像或使用修補、超分辨率和上色技術編輯現有圖像。範例包括 [DALL-E-3](https://openai.com/dall-e-3?WT.mc_id=academic-105485-koreyst) 和 [Stable Diffusion models](https://github.com/Stability-AI/StableDiffusion?WT.mc_id=academic-105485-koreyst)。 + +![圖像生成](../../images/Image.png?WT.mc_id=academic-105485-koreyst) + +文本和程式碼產生器模型是生成文本或程式碼的模型。這些模型通常用於文本摘要、翻譯和問答。文本生成模型通常在大型文本數據集上訓練,例如[BookCorpus](https://www.cv-foundation.org/openaccess/content_iccv_2015/html/Zhu_Aligning_Books_and_ICCV_2015_paper.html?WT.mc_id=academic-105485-koreyst),可以用來生成新文本或回答問題。程式碼產生器模型,例如[CodeParrot](https://huggingface.co/codeparrot?WT.mc_id=academic-105485-koreyst),通常在大型程式碼數據集上訓練,例如GitHub,可以用來生成新程式碼或修復現有程式碼中的錯誤。 + +![文字和程式碼產生器](../../images/Text.png?WT.mc_id=academic-105485-koreyst) + +### 編碼器-解碼器與僅解碼器 + +為了討論不同類型的LLM架構,讓我們用一個類比來說明。 + +想像一下,你的經理給你一個任務,為學生編寫一個測驗。你有兩個同事;一個負責建立內容,另一個負責審查它們。 + +內容創作者就像一個解碼器模型,他們可以查看主題並看到你已經寫了什麼,然後基於此編寫課程。他們非常擅長撰寫引人入勝且資訊豐富的內容,但他們不太擅長理解主題和學習目標。一些解碼器模型的範例是GPT系列模型,例如GPT-3。 + +審查者就像一個僅有編碼器的模型,他們查看編寫的課程和答案,注意它們之間的關係並理解上下文,但他們不擅長生成內容。僅有編碼器模型的一個範例是BERT。 + +想像一下,我們也可以有一個人能夠建立和審查測驗,這是一個編碼器-解碼器模型。一些範例是 BART 和 T5。 + +### 服務 versus 模型 + +現在,讓我們來談談服務和模型之間的區別。服務是由雲服務提供商提供的產品,通常是模型、資料和其他元件的組合。模型是服務的核心元件,通常是一個基礎模型,例如一個 LLM。 + +服務通常針對生產使用進行最佳化,並且通常比模型更易於使用,通過圖形用戶界面。然而,服務並不總是免費提供,可能需要訂閱或支付費用來使用,以換取利用服務擁有者的設備和資源,優化開支並輕鬆擴展。服務的一個範例是[Azure OpenAI Service](https://learn.microsoft.com/azure/ai-services/openai/overview?WT.mc_id=academic-105485-koreyst),它提供按使用量計費的方案,這意味著用戶根據使用服務的多少按比例收費。此外,Azure OpenAI Service在模型的能力之上提供企業級安全性和負責任的 AI 框架。 + +模型只是神經網路,包含參數、權重等。允許公司在本地執行,然而需要購買設備、建構延展性結構並購買許可證或使用開放原始碼模型。像 LLaMA 這樣的模型可以使用,並需要計算能力來執行模型。 + +## 如何測試和反覆運算不同模型以了解在 Azure 上的性能 + +一旦我們的團隊探索了當前的 LLMs 版圖並確定了一些適合其場景的良好候選者,下一步就是在他們的數據和工作負載上測試它們。這是一個通過實驗和測量進行的迭代過程。 +我們在前幾段中提到的大多數模型(OpenAI 模型、開放原始碼模型如 Llama2 和 Hugging Face transformers)都可以在 [Model Catalog](https://learn.microsoft.com/azure/ai-studio/how-to/model-catalog-overview?WT.mc_id=academic-105485-koreyst) 中的 [Azure AI Studio](https://ai.azure.com/?WT.mc_id=academic-105485-koreyst) 找到。 + +[Azure AI Studio](https://learn.microsoft.com/azure/ai-studio/what-is-ai-studio?WT.mc_id=academic-105485-koreyst) 是一個雲端平台,專為開發人員設計,用於建構生成式 AI 應用程式並管理整個開發生命週期 - 從實驗到評估 - 將所有 Azure AI 服務整合到一個方便的 GUI 中。Azure AI Studio 中的模型目錄使使用者能夠: + +- 在目錄中找到感興趣的基礎模型 - 無論是專有的還是開放原始碼的,可以按任務、許可證或名稱進行篩選。為了提高可搜索性,這些模型被組織成集合,如 Azure OpenAI 集合、Hugging Face 集合等。 + +![模型目錄](../../images/AzureAIStudioModelCatalog.png?WT.mc_id=academic-105485-koreyst) + +- 查看模型卡,包括預期用途和訓練數據的詳細描述、程式碼範例以及內部評估函式庫的評估結果。 + +![Model card](../../images/ModelCard.png?WT.mc_id=academic-105485-koreyst) + +- 通過[模型基準](https://learn.microsoft.com/azure/ai-studio/how-to/model-benchmarks?WT.mc_id=academic-105485-koreyst)窗格,比較行業中可用的模型和數據集的基準,以評估哪一個符合業務場景。 + +![模型基準](../../images/ModelBenchmarks.png?WT.mc_id=academic-105485-koreyst) + +- 在自訂訓練資料上微調模型,以利用 Azure AI Studio 的實驗和追蹤功能來提升模型在特定工作負載中的表現。 + +![模型微調](../../images/FineTuning.png?WT.mc_id=academic-105485-koreyst) + +- 部署原始的預訓練模型或微調版本到遠端即時推論 - 管理的計算 - 或無伺服器的 api 端點 - [隨用隨付](https://learn.microsoft.com/azure/ai-studio/how-to/model-catalog-overview#model-deployment-managed-compute-and-serverless-api-pay-as-you-go?WT.mc_id=academic-105485-koreyst) - 以使應用程式能夠使用它。 + +![模型部署](../../images/ModelDeploy.png?WT.mc_id=academic-105485-koreyst) + +> [!NOTE] +> 並非目錄中的所有模型目前都可用於微調和/或按需部署。查看模型卡以了解模型的功能和限制。 + +## 改善 LLM 結果 + +我們已經與我們的初創團隊探索了不同種類的 LLMs 和一個雲平台 (Azure Machine Learning),使我們能夠比較不同的模型,在測試資料上評估它們,改進性能並將它們部署在推論端點上。 + +但是他們什麼時候應該考慮微調模型而不是使用預訓練模型呢?是否有其他方法可以改善模型在特定工作負載上的性能? + +企業可以使用多種方法從LLM中獲得所需的結果,你可以選擇不同訓練程度的不同類型模型 + +在生產環境中部署 LLM,具有不同的複雜性、成本和品質。以下是一些不同的方法: + +- **帶有上下文的提示工程**。這個想法是當你提示時提供足夠的上下文,以確保你得到所需的回應。 + +- **檢索增強生成(RAG)**。你的資料可能存在於資料庫或網路端點。例如,為了確保這些資料或其子集在提示時被包含,你可以獲取相關資料並將其作為使用者提示的一部分。 + +- **微調模型**。在這裡,你在自己的資料上進一步訓練模型,這使得模型更精確並能響應你的需求,但可能會很昂貴。 + +![LLMs 部署](../../images/Deploy.png?WT.mc_id=academic-105485-koreyst) + +圖片來源: [四種企業部署 LLM 的方式 | Fiddler AI Blog](https://www.fiddler.ai/blog/four-ways-that-enterprises-deploy-llms?WT.mc_id=academic-105485-koreyst) + +### 提示工程與上下文 + +預訓練的 LLMs 在一般化的自然語言任務上表現非常好,即使只用一個簡短的提示來呼叫它們,例如完成一句話或回答一個問題——所謂的「零樣本」學習。 + +然而,用戶越能夠框定他們的查詢,並提供詳細的請求和範例(即上下文),答案就會越準確且越接近用戶的期望。在這種情況下,如果提示中只包含一個範例,我們稱之為「單次」學習;如果包含多個範例,則稱為「少次學習」。具有上下文的提示工程是啟動時最具成本效益的方法。 + +### 檢索增強生成 (RAG) + +LLMs 有一個限制,即它們只能使用訓練期間使用的資料來生成答案。這意味著它們對訓練過程之後發生的事實一無所知,並且無法訪問非公開資訊(如公司資料)。 +這可以通過 RAG 技術來克服,該技術通過將外部資料以文件片段的形式增強提示,考慮提示長度限制。這由向量資料庫工具(如 [Azure Vector Search](https://learn.microsoft.com/azure/search/vector-search-overview?WT.mc_id=academic-105485-koreyst))支持,這些工具從各種預定義資料來源檢索有用的片段並將它們添加到提示上下文中。 + +這項技術在企業沒有足夠的數據、時間或資源來微調 LLM,但仍希望提高特定工作負載的性能並降低虛構風險(即現實的神秘化或有害內容)時非常有幫助。 + +### 微調模型 + +微調是一種利用遷移學習將模型「適應」下游任務或解決特定問題的過程。與少量學習和RAG不同,它會生成一個新的模型,並更新權重和偏差。這需要一組訓練範例,包括單一輸入(提示)及其相關的輸出(完成)。 +如果符合以下情況,這將是首選方法: + +- **使用微調模型**。企業希望使用微調的低性能模型(如嵌入模型)而不是高性能模型,從而達到更具成本效益和快速的解決方案。 + +- **考慮延遲**。延遲對於特定用例很重要,因此無法使用非常長的提示詞或範例數量不符合提示詞長度限制。 + +- **保持最新**。企業擁有大量高品質數據和真實標籤,以及保持這些數據隨時間更新所需的資源。 + +### 訓練模型 + +從零開始訓練一個 LLM 毫無疑問是最困難和最複雜的方法,需要大量的數據、熟練的資源和適當的計算能力。這個選項應該僅在企業有特定領域的使用案例和大量領域中心數據的情況下考慮。 + +## 知識檢查 + +改進 LLM 完成結果的良好方法是什麼? + +1. 帶上下文的提示工程 +1. RAG +1. 微調模型 + +A:3, 如果你有時間和資源以及高品質的資料,微調是保持最新的更好選擇。然而,如果你想改進事情但缺乏時間,值得先考慮 RAG。 + +## 🚀 挑戰 + +了解更多關於如何[使用 RAG](https://learn.microsoft.com/azure/search/retrieval-augmented-generation-overview?WT.mc_id=academic-105485-koreyst)來發展您的業務。 + +## 很棒的工作,繼續學習 + +完成本課程後,請查看我們的[生成式 AI 學習集合](https://aka.ms/genai-collection?WT.mc_id=academic-105485-koreyst)以繼續提升您的生成式 AI 知識! + +前往第3課,我們將探討如何[負責任地建構生成式 AI](../../../03-using-generative-ai-responsibly/translations/tw/README.md?WT.mc_id=academic-105485-koreyst)! + diff --git a/03-using-generative-ai-responsibly/translations/tw/README.md b/03-using-generative-ai-responsibly/translations/tw/README.md new file mode 100644 index 000000000..919ca70aa --- /dev/null +++ b/03-using-generative-ai-responsibly/translations/tw/README.md @@ -0,0 +1,134 @@ +# 負責任地使用生成式 AI + +[![負責任地使用生成式 AI](../../images/03-lesson-banner.png?WT.mc_id=academic-105485-koreyst)](https://aka.ms/gen-ai-lesson3-gh?WT.mc_id=academic-105485-koreyst) + +> _點擊上方圖片觀看本課程的影片_ + +很容易對 AI 尤其是生成式 AI 感到著迷,但你需要考慮如何負責任地使用它。你需要考慮如何確保輸出是公平的、無害的等等。本章旨在為你提供提到的背景、需要考慮的事項以及如何採取積極措施來改進你的 AI 使用。 + +## 簡介 + +本課程將涵蓋: + +- 為什麼在建構生成式 AI 應用程式時應優先考慮負責任的 AI。 +- 負責任的 AI 的核心原則及其與生成式 AI 的關係。 +- 如何通過策略和工具將這些負責任的 AI 原則付諸實踐。 + +## 學習目標 + +完成本課程後,您將會知道: + +- 建構生成式 AI 應用程式時負責任 AI 的重要性。 +- 何時在建構生成式 AI 應用程式時思考並應用負責任 AI 的核心原則。 +- 有哪些工具和策略可以幫助你將負責任 AI 的概念付諸實踐。 + +## 負責任的 AI 原則 + +Generative AI 的興奮程度從未如此之高。這種興奮吸引了許多新開發者、關注和資金進入這個領域。雖然這對於任何希望使用 Generative AI 建構產品和公司的人士來說是非常積極的,但我們也必須負責任地前進。 + +在整個課程中,我們專注於建構我們的初創公司和我們的 AI 教育產品。我們將使用負責任 AI 的原則: 公平性、包容性、可靠性/安全性、安全性和隱私、透明性和問責制。通過這些原則,我們將探索它們如何與我們在產品中使用生成式 AI 相關。 + +## 為什麼你應該優先考慮負責任的 AI + +在建構產品時,採取以人為本的方法,並考慮使用者的最佳利益,會帶來最佳結果。 + +生成式 AI 的獨特之處在於其為用戶創建有用答案、資訊、指導和內容的能力。這可以在不需要許多手動步驟的情況下完成,從而產生非常令人印象深刻的結果。然而,若沒有適當的規劃和策略,這也可能不幸地為您的用戶、產品和整個社會帶來一些有害的結果。 + +讓我們來看看這些潛在有害結果中的一些(但不是全部): + +### 幻覺 + +幻覺是一個術語,用來描述當LLM產生的內容完全沒有意義或根據其他來源的資訊我們知道是事實錯誤的情況。 + +讓我們以建構一個功能為例,該功能允許學生向模型提問歷史問題。一位學生問了這個問題 `誰是泰坦尼克號的唯一倖存者?` + +模型產生的回應如下: + +![提示說 "誰是鐵達尼號的唯一倖存者"](../../../03-using-generative-ai-responsibly/images/ChatGPT-titanic-survivor-prompt.webp?WT.mc_id=academic-105485-koreyst) + +> _(來源: [Flying bisons](https://flyingbisons.com?WT.mc_id=academic-105485-koreyst))_ + +這是一個非常自信且徹底的回答。不幸的是,它是錯誤的。即使只做了最少量的研究,也會發現泰坦尼克號災難中有不止一個倖存者。對於剛開始研究這個主題的學生來說,這個答案可能足夠有說服力而不被質疑並被視為事實。這樣的後果可能導致 AI 系統不可靠,並對我們初創公司的聲譽產生負面影響。 + +隨著每次任意LLM的迭代,我們已經看到在最小化幻覺方面的性能改進。即使有了這些改進,我們作為應用程式建構者和使用者仍然需要意識到這些限制。 + +### 有害內容 + +我們在前一節中討論了當 LLM 產生不正確或無意義的回應時的情況。我們需要注意的另一個風險是當模型回應有害內容時。 + +有害內容可以定義為: + +- 提供自我傷害或傷害特定群體的指示或鼓勵。 +- 仇恨或貶低的內容。 +- 指導計劃任何類型的攻擊或暴力行為。 +- 提供如何查找非法內容或進行非法行為的指示。 +- 顯示露骨的性內容。 + +為了我們的初創公司,我們希望確保我們擁有正確的工具和策略,以防止學生看到此類內容。 + +### 缺乏公平性 + +公平被定義為「確保 AI 系統沒有偏見和歧視,並且公平和平等地對待每個人」。在生成式 AI 的世界中,我們希望確保模型的輸出不會強化邊緣化群體的排他性世界觀。 + +這些類型的輸出不僅對建構正面的產品體驗有破壞性,還會對社會造成進一步的傷害。作為應用程式建構者,我們在使用生成式 AI 建構解決方案時,應該始終考慮到廣泛且多樣化的使用者群體。 + +## 如何負責任地使用生成式 AI + +現在我們已經確定了負責任生成式 AI 的重要性,讓我們來看看可以採取的 4 個步驟,以負責任地建構我們的 AI 解決方案: + +![減輕循環](../../images/mitigate-cycle.png?WT.mc_id=academic-105485-koreyst) + +### 測量潛在危害 + +在軟體測試中,我們測試使用者在應用程式上的預期操作。同樣地,測試使用者最有可能使用的各種提示是一種衡量潛在危害的好方法。 + +由於我們的初創公司正在建構一款教育產品,準備一份與教育相關的提示清單會很有幫助。這可以涵蓋某個特定主題、歷史事實以及關於學生生活的提示。 + +### 減輕潛在危害 + +現在是時候找出方法來防止或限制模型及其回應可能造成的潛在傷害。我們可以從4個不同層面來看這個問題: + +![Mitigation Layers](../../images/mitigation-layers.png?WT.mc_id=academic-105485-koreyst) + +- **模型**. 為正確的使用案例選擇正確的模型。像 GPT-4 這樣更大且更複雜的模型在應用於較小且更具體的使用案例時,可能會帶來更多有害內容的風險。使用您的訓練數據進行微調也可以減少有害內容的風險。 + +- **安全系統**. 安全系統是一組在平台上服務模型的工具和配置,有助於減輕危害。範例是 Azure OpenAI 服務上的內容過濾系統。系統還應該檢測越獄攻擊和不需要的活動,例如來自機器人的請求。 + +- **Metaprompt**. Metaprompt 和基礎是我們可以根據某些行為和資訊來指導或限制模型的方法。這可以使用系統輸入來定義模型的某些限制。此外,提供更相關於系統範圍或領域的輸出。 + +它也可以使用像檢索增強生成(RAG)這樣的技術,讓模型僅從選定的可信來源中提取資訊。本課程後面有一節是[建構搜尋應用程式](../../../08-building-search-applications/translations/tw/README.md?WT.mc_id=academic-105485-koreyst)。 + +- **使用者體驗**。最終層是使用者通過我們應用程式的介面以某種方式直接與模型互動。在這種方式下,我們可以設計 UI/UX 來限制使用者能夠傳送給模型的輸入類型以及顯示給使用者的文字或圖像。在部署 AI 應用程式時,我們也必須透明地告知我們的生成式 AI 應用程式能夠和不能夠做的事情。 + +我們有一整節課專門介紹[設計 AI 應用的 UX](../../../12-designing-ux-for-ai-applications/translations/tw/README.md?WT.mc_id=academic-105485-koreyst) + +- **評估模型**. 使用 LLMs 可能具有挑戰性,因為我們無法總是控制模型訓練所使用的數據。不管怎樣,我們應該始終評估模型的性能和輸出。衡量模型的準確性、相似性、基礎性和輸出的相關性仍然很重要。這有助於為利益相關者和用戶提供透明度和信任。 + +### 操作負責任的生成式 AI 解決方案 + +建構圍繞您的 AI 應用程式的操作實踐是最後階段。這包括與我們初創公司中的其他部門(如法務和安全)合作,以確保我們符合所有監管政策。在推出之前,我們還希望制定有關交付、處理事件和回滾的計劃,以防止用戶因增長而受到任何損害。 + +## 工具 + +雖然開發負責任的 AI 解決方案的工作可能看起來很多,但這些工作非常值得努力。隨著生成式 AI 領域的增長,更多幫助開發者有效地將責任整合到他們工作流程中的工具將會成熟。例如,[Azure AI Content Safety](https://learn.microsoft.com/azure/ai-services/content-safety/overview?WT.mc_id=academic-105485-koreyst) 可以通過 API 請求幫助檢測有害內容和圖像。 + +## 知識檢查 + +確保負責任的 AI 使用需要注意哪些事項? + +1. 這個答案是正確的。 +1. 有害使用,確保 AI 不被用於犯罪目的。 +1. 確保 AI 沒有偏見和歧視。 + +A: 2 和 3 是正確的。負責任的 AI 幫助您考慮如何減輕有害影響和偏見等。 + +## 🚀 挑戰 + +閱讀 [Azure AI Content Saftey](https://learn.microsoft.com/azure/ai-services/content-safety/overview?WT.mc_id=academic-105485-koreyst) 並查看您可以採用的內容。 + +## 很棒的工作,繼續學習 + +完成本課程後,請查看我們的[生成式 AI 學習集合](https://aka.ms/genai-collection?WT.mc_id=academic-105485-koreyst)以繼續提升您的生成式 AI 知識! + +前往第4課,我們將查看[提示工程基礎](../../../04-prompt-engineering-fundamentals/translations/tw/README.md?WT.mc_id=academic-105485-koreyst)! + diff --git a/04-prompt-engineering-fundamentals/translations/tw/README.md b/04-prompt-engineering-fundamentals/translations/tw/README.md new file mode 100644 index 000000000..3b37c4dd9 --- /dev/null +++ b/04-prompt-engineering-fundamentals/translations/tw/README.md @@ -0,0 +1,399 @@ +# 提示工程基礎 + +[![提示工程基礎](../../images/04-lesson-banner.png?WT.mc_id=academic-105485-koreyst)](https://aka.ms/gen-ai-lesson4-gh?WT.mc_id=academic-105485-koreyst) + +撰寫提示給LLM的方式也很重要。一個精心設計的提示可以獲得更高品質的回應。但像_prompt_和_prompt engineering_這樣的術語究竟意味著什麼?我該如何改進發送給LLM的提示_input_?這些是我們在本章和下一章中將嘗試回答的問題。 + +_Generative AI_ 能夠根據使用者請求創建新內容(例如,文字、圖像、音訊、程式碼等)。它使用像 OpenAI 的 GPT("Generative Pre-trained Transformer")系列這樣的_大型語言模型_來實現,這些模型是為使用自然語言和程式碼而訓練的。 + +用戶現在可以使用熟悉的範式(如聊天)與這些模型互動,無需任何技術專業知識或訓練。這些模型是基於提示的——用戶發送文字輸入(提示)並獲得 AI 回應(完成)。然後他們可以在多輪對話中反覆與 AI 聊天,精煉他們的提示,直到回應符合他們的期望。 + +"Prompts" 現在成為生成式 AI 應用程式的主要_程式設計介面_,告訴模型該做什麼並影響返回回應的品質。"Prompt Engineering" 是一個快速增長的研究領域,專注於提示的_設計和最佳化_,以大規模提供一致且高品質的回應。 + +## 學習目標 + +在本課程中,我們將學習什麼是提示工程、它為什麼重要,以及如何為給定的模型和應用物件設計更有效的提示。我們將了解提示工程的核心概念和最佳實踐,並學習一個互動式 Jupyter Notebooks "sandbox" 環境,在那裡我們可以看到這些概念應用於真實範例。 + +在本課結束時,我們將能夠: + +1. 解釋什麼是提示工程以及為什麼它很重要。 +2. 描述提示的組成部分及其使用方式。 +3. 學習提示工程的最佳實踐和技術。 +4. 使用 OpenAI 端點將所學技術應用於真實範例。 + +## 學習沙盒 + +目前,提示工程更像是一門藝術而非科學。提高我們直覺的最佳方式是_多加練習_,並採用試錯法,將應用領域專業知識與推薦技術和模型特定的最佳化相結合。 + +Jupyter Notebook 隨附本課程提供了一個 _sandbox_ 環境,您可以在學習過程中或作為程式碼挑戰的一部分來嘗試所學內容。要執行這些練習,您將需要: + +1. **一個 Azure OpenAI API 金鑰** - 已部署 LLM 的服務端點。 +2. **一個 Python 執行環境** - Notebook 可以在其中執行。 +3. **本地環境變數** - _完成[設定](../../../00-course-setup/translations/tw/SETUP.md?WT.mc_id=academic-105485-koreyst)步驟以準備好_。 + +筆記本附帶_入門_練習 - 但我們鼓勵你添加自己的_Markdown_(描述)和_程式碼_(提示請求)部分,以嘗試更多範例或想法 - 並建立你對提示設計的直覺。 + +## 圖解指南 + +想在深入學習之前了解本課程涵蓋的主要內容嗎?查看這本插圖指南,它會讓你了解涵蓋的主要主題,以及每個主題中你需要思考的關鍵要點。課程路線圖將帶你從理解核心概念和挑戰開始,然後通過相關的提示工程技術和最佳實踐來解決這些問題。請注意,本指南中的「高級技術」部分指的是本課程下一章節涵蓋的內容。 + +![提示工程圖解指南](../../images/04-prompt-engineering-sketchnote.png?WT.mc_id=academic-105485-koreyst) + +## 我們的初創公司 + +現在,讓我們談談_這個主題_如何與我們的創業使命相關,即[將 AI 創新帶入教育](https://educationblog.microsoft.com/2023/06/collaborating-to-bring-ai-innovation-to-education?WT.mc_id=academic-105485-koreyst)。我們希望建構 AI 驅動的_個性化學習_應用程式 - 所以讓我們思考一下我們應用程式的不同使用者如何「設計」提示: + +- **管理員**可能會要求 AI _分析課程數據以識別覆蓋範圍中的缺口_。AI 可以總結結果或使用程式碼將其可視化。 +- **教育者**可能會要求 AI _為目標受眾和主題生成課程計劃_。AI 可以以指定的格式建構個性化計劃。 +- **學生**可能會要求 AI _在困難的科目上輔導他們_。AI 現在可以通過針對他們水平的課程、提示和範例來指導學生。 + +這只是冰山一角。查看[Prompts For Education](https://github.com/microsoft/prompts-for-edu/tree/main?WT.mc_id=academic-105485-koreyst) - 由教育專家策劃的開放原始碼提示函式庫 - 以更廣泛地了解可能性!_嘗試在沙盒中執行一些這些提示,或使用 OpenAI Playground 看看會發生什麼!_ + + + +## 什麼是提示工程? + +我們開始這堂課時,將**Prompt Engineering**定義為_設計和最佳化_文字輸入(prompts)的過程,以提供一致且高品質的回應(completions)來達到給定的應用目標和模型。我們可以將這視為一個兩步驟的過程: + +- _設計_ 給定模型和目標的初始提示 +- _反覆改進_ 提示以提高回應的品質 + +這必然是一個需要用戶直覺和努力來獲得最佳結果的反覆試驗過程。所以為什麼這很重要?要回答這個問題,我們首先需要了解三個概念: + +- _分詞_ = 模型如何「看見」提示 +- _基礎 LLMs_ = 基礎模型如何「處理」提示 +- _指令調整 LLMs_ = 模型現在如何看見「任務」 + +### 分詞 + +一個 LLM 將提示視為_一系列的標記_,不同的模型(或模型的不同版本)可以以不同的方式將相同的提示標記化。由於 LLM 是在標記上訓練的(而不是在原始文本上),提示的標記化方式直接影響生成回應的品質。 + +為了直觀了解分詞是如何運作的,可以嘗試使用像 [OpenAI Tokenizer](https://platform.openai.com/tokenizer?WT.mc_id=academic-105485-koreyst) 這樣的工具。將你的提示複製進去,看看它如何轉換成標記,注意空白字元和標點符號是如何處理的。請注意,此範例顯示的是較舊的 LLM (GPT-3),所以用較新的模型嘗試可能會產生不同的結果。 + +![分詞](../../images/04-tokenizer-example.png?WT.mc_id=academic-105485-koreyst) + +### 概念: 基礎模型 + +一旦提示被標記化,["Base LLM"](https://blog.gopenai.com/an-introduction-to-base-and-instruction-tuned-large-language-models-8de102c785a6?WT.mc_id=academic-105485-koreyst) (或基礎模型) 的主要函式是預測該序列中的標記。由於LLM是基於大量文本資料集訓練的,它們對標記之間的統計關係有很好的理解,並且可以有信心地做出預測。請注意,它們並不理解提示或標記中單詞的_意義_;它們只是看到一個模式,並可以用下一個預測來「完成」它。它們可以繼續預測該序列,直到被使用者干預或某些預先設定的條件終止。 + +想看看基於提示的完成如何運作?將上述提示輸入到 Azure OpenAI Studio 的[_Chat Playground_](https://oai.azure.com/playground?WT.mc_id=academic-105485-koreyst)中,使用預設設定。系統被配置為將提示視為資訊請求——因此你應該會看到一個滿足此上下文的完成。 + +但是如果使用者想要看到符合某些標準或任務目標的特定內容呢?這就是_指令調整_的LLM派上用場的地方。 + +![Base LLM Chat Completion](../../images/04-playground-chat-base.png?WT.mc_id=academic-105485-koreyst) + +### 概念: 指令調整 LLMs + +一個[指令調整的 LLM](https://blog.gopenai.com/an-introduction-to-base-and-instruction-tuned-large-language-models-8de102c785a6?WT.mc_id=academic-105485-koreyst)從基礎模型開始,並使用範例或輸入/輸出對(例如,多輪「訊息」)進行微調,這些範例或對話可以包含明確的指令——AI 的回應嘗試遵循該指令。 + +這使用了像是人類回饋強化學習(RLHF)這樣的技術,可以訓練模型_遵循指示_和_從回饋中學習_,以便產生更適合實際應用且更符合使用者目標的回應。 + +讓我們試試看 - 重訪上面的提示,但現在將 _系統訊息_ 更改為提供以下指示作為上下文: + +> _總結提供給你的內容,適合二年級學生。將結果保持在一段內,包含3-5個要點。_ + +看看結果現在如何調整以反映所需的目標和格式?教育者現在可以直接在他們的幻燈片中使用這個回應,適用於那個類別。 + +![指令調整的 LLM 聊天完成](../../images/04-playground-chat-instructions.png?WT.mc_id=academic-105485-koreyst) + +## 為什麼我們需要提示工程? + +現在我們知道提示是如何被LLM處理的,讓我們來談談為什麼我們需要提示工程。答案在於當前的LLM提出了許多挑戰,使得在不投入提示建構和最佳化的情況下,更難以實現可靠且一致的完成。例如: + +1. **模型回應是隨機的。** 相同的提示可能會因不同的模型或模型版本產生不同的回應。甚至在不同時間使用相同的模型也可能產生不同的結果。提示工程技術可以通過提供更好的防護措施來幫助我們減少這些變異。 + +1. **模型可能會捏造回應。** 模型是用大型但有限的數據集進行預訓練的,這意味著它們缺乏訓練範圍之外的概念知識。因此,它們可能會產生不準確、虛構或直接與已知事實相矛盾的完成。提示工程技術幫助用戶識別和減輕這些捏造,例如,通過要求 AI 提供引用或推理。 + +1. **模型能力會有所不同。** 新的模型或模型世代將具有更豐富的能力,但也會帶來成本和複雜性的獨特怪癖和權衡。提示工程可以幫助我們開發最佳實踐和工作流程,以可擴展、無縫的方式抽象出差異並適應特定模型的需求。 + +讓我們在 OpenAI 或 Azure OpenAI Playground 中看看這個實際運作: + +- 使用相同的提示與不同的 LLM 部署(例如, OpenAI, Azure OpenAI, Hugging Face)- 你是否看到了變化? +- 使用相同的提示反覆與_相同的_ LLM 部署(例如, Azure OpenAI playground)- 這些變化有何不同? + +### 製作範例 + +在本課程中,我們使用術語**「捏造」**來指代LLM有時因訓練限制或其他約束而生成事實上不正確的資訊的現象。你可能在流行文章或研究論文中也聽過這種現象被稱為_「幻覺」_。然而,我們強烈建議使用_「捏造」_這個術語,這樣我們就不會因為將人類特徵歸因於機器驅動的結果而無意中擬人化這種行為。這也從術語角度加強了[負責任的AI指南](https://www.microsoft.com/ai/responsible-ai?WT.mc_id=academic-105485-koreyst),去除了在某些情境下可能被認為具有冒犯性或不包容性的術語。 + +想了解捏造是如何運作的嗎?想一個提示,指示 AI 生成一個不存在的主題的內容(以確保它不在訓練數據集中)。例如 - 我試過這個提示: + +> **提示:** 產生一個關於2076年火星戰爭的課程計劃。 + +一個網路搜尋顯示,有關火星戰爭的虛構故事(例如,電視劇或書籍)——但沒有發生在2076年。常識也告訴我們,2076年是在未來,因此,不能與真實事件相關聯。 + +那麼當我們使用不同的 LLM 提供者執行這個提示時會發生什麼情況呢? + +> **回應 1**: OpenAI Playground (GPT-35) + +![Response 1](../../images/04-fabrication-oai.png?WT.mc_id=academic-105485-koreyst) + +> **回應 2**: Azure OpenAI Playground (GPT-35) + +![Response 2](../../images/04-fabrication-aoai.png?WT.mc_id=academic-105485-koreyst) + +> **回應 3**: : Hugging Face Chat Playground (LLama-2) + +![Response 3](../../images/04-fabrication-huggingchat.png?WT.mc_id=academic-105485-koreyst) + +正如預期的那樣,由於隨機行為和模型能力的變化,每個模型(或模型版本)產生的回應略有不同。例如,一個模型針對八年級的觀眾,而另一個則假設是高中生。但所有三個模型都生成了可以讓不知情的用戶相信事件是真實的回應。 + +提示工程技術如_metaprompting_和_溫度配置_可能在某種程度上減少模型的捏造。新的提示工程_架構_也將新工具和技術無縫地整合到提示流程中,以減輕或減少其中一些效果。 + +## 案例研究: GitHub Copilot + +讓我們通過查看一個案例研究來了解提示工程在現實世界解決方案中的應用: [GitHub Copilot](https://github.com/features/copilot?WT.mc_id=academic-105485-koreyst)。 + +GitHub Copilot 是你的 "AI Pair Programmer" - 它將文字提示轉換為程式碼完成,並整合到你的開發環境中(例如,Visual Studio Code),提供無縫的使用者體驗。正如以下一系列博客所記錄的那樣,最早的版本是基於 OpenAI Codex 模型 - 工程師們迅速意識到需要微調模型並開發更好的提示工程技術,以提高程式碼品質。7 月,他們[推出了一個改進的 AI 模型,超越了 Codex](https://github.blog/2023-07-28-smarter-more-efficient-coding-github-copilot-goes-beyond-codex-with-improved-ai-model/?WT.mc_id=academic-105485-koreyst),提供更快的建議。 + +依照順序閱讀文章,以跟隨他們的學習旅程。 + +- **2023年5月** | [GitHub Copilot 正在變得更了解你的程式碼](https://github.blog/2023-05-17-how-github-copilot-is-getting-better-at-understanding-your-code/?WT.mc_id=academic-105485-koreyst) +- **2023年5月** | [深入 GitHub: 與 GitHub Copilot 背後的 LLMs 合作](https://github.blog/2023-05-17-inside-github-working-with-the-llms-behind-github-copilot/?WT.mc_id=academic-105485-koreyst)。 +- **2023年6月** | [如何為 GitHub Copilot 撰寫更好的提示](https://github.blog/2023-06-20-how-to-write-better-prompts-for-github-copilot/?WT.mc_id=academic-105485-koreyst)。 +- **2023年7月** | [.. GitHub Copilot 超越 Codex,具有改進的 AI 模型](https://github.blog/2023-07-28-smarter-more-efficient-coding-github-copilot-goes-beyond-codex-with-improved-ai-model/?WT.mc_id=academic-105485-koreyst) +- **2023年7月** | [開發者的提示工程和 LLMs 指南](https://github.blog/2023-07-17-prompt-engineering-guide-generative-ai-llms/?WT.mc_id=academic-105485-koreyst) +- **2023年9月** | [如何構建企業 LLM 應用: 來自 GitHub Copilot 的經驗教訓](https://github.blog/2023-09-06-how-to-build-an-enterprise-llm-application-lessons-from-github-copilot/?WT.mc_id=academic-105485-koreyst) + +你也可以瀏覽他們的[工程部落格](https://github.blog/category/engineering/?WT.mc_id=academic-105485-koreyst)來查看更多像[這篇](https://github.blog/2023-09-27-how-i-used-github-copilot-chat-to-build-a-reactjs-gallery-prototype/?WT.mc_id=academic-105485-koreyst)展示如何應用這些模型和技術來推動實際應用的文章。 + +--- + + + + +## 提示建構 + +我們已經了解為什麼提示工程很重要 - 現在讓我們來理解提示是如何_構建_的,這樣我們就可以評估不同的技術以設計更有效的提示。 + +### 基本提示 + +讓我們從基本提示開始:一個沒有其他上下文的文字輸入發送到模型。這裡有一個範例 - 當我們將美國國歌的前幾個字發送到 OpenAI [Completion API](https://platform.openai.com/docs/api-reference/completions?WT.mc_id=academic-105485-koreyst) 時,它會立即_完成_回應的接下來幾行,展示了基本的預測行為。 + +| Prompt (Input) | Completion (Output) | +| :----------------- | :----------------------------------------------------------------------------------------------------------------------------------------- | +| Oh say can you see | It sounds like you're starting the lyrics to "The Star-Spangled Banner," the national anthem of the United States. The full lyrics are ... | + +### 複雜提示 + +現在讓我們為這個基本提示添加上下文和指示。[Chat Completion API](https://learn.microsoft.com/azure/ai-services/openai/how-to/chatgpt?WT.mc_id=academic-105485-koreyst) 讓我們可以將複雜的提示構建為一組 _訊息_,包括: + +- 輸入/輸出對應反映 _使用者_ 輸入和 _助手_ 回應。 +- 系統訊息設定助手行為或個性背景。 + +請求現在如下所示,其中 _tokenization_ 有效地從上下文和對話中捕捉到相關資訊。現在,改變系統上下文對完成的品質影響與提供的使用者輸入一樣大。 + +```python +response = openai.chat.completions.create( + model="gpt-3.5-turbo", + messages=[ + {"role": "system", "content": "你是一個有幫助的助手。"}, + {"role": "user", "content": "誰贏得了2020年的世界大賽?"}, + {"role": "assistant", "content": "洛杉磯道奇隊贏得了2020年的世界大賽。"}, + {"role": "user", "content": "比賽在哪裡舉行?"} + ] +) +``` + +### 指令提示 + +在上述範例中,使用者提示是一個簡單的文字查詢,可以解釋為一個資訊請求。使用_instruction_提示,我們可以使用該文字更詳細地指定任務,為AI提供更好的指導。這裡有一個範例: + +| Prompt (Input) | Completion (Output) | Instruction Type | +| :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------- | :------------------ | +| Write a description of the Civil War | _returned a simple paragraph_ | Simple | +| Write a description of the Civil War. Provide key dates and events and describe their significance | _returned a paragraph followed by a list of key event dates with descriptions_ | Complex | +| Write a description of the Civil War in 1 paragraph. Provide 3 bullet points with key dates and their significance. Provide 3 more bullet points with key historical figures and their contributions. Return the output as a JSON file | _returns more extensive details in a text box, formatted as JSON that you can copy-paste to a file and validate as needed_ | Complex. Formatted. | + +## 主要內容 + +在上述範例中,提示仍然相當開放,允許 LLM 決定其預訓練資料集中哪一部分是相關的。使用 _主要內容_ 設計模式時,輸入文字被分為兩部分: + +- 一個指令 (動作) +- 相關內容 (影響動作) + +這裡有一個範例,指示是「用兩句話總結這個」。 + +| Prompt (Input) | Completion (Output) | +| :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Jupiter is the fifth planet from the Sun and the largest in the Solar System. It is a gas giant with a mass one-thousandth that of the Sun, but two-and-a-half times that of all the other planets in the Solar System combined. Jupiter is one of the brightest objects visible to the naked eye in the night sky, and has been known to ancient civilizations since before recorded history. It is named after the Roman god Jupiter.[19] When viewed from Earth, Jupiter can be bright enough for its reflected light to cast visible shadows,[20] and is on average the third-brightest natural object in the night sky after the Moon and Venus.
**Summarize this in 2 short sentences** | 木星是距離太陽第五顆行星,也是太陽系中最大的行星,並以夜空中最亮的物件之一而聞名。木星以羅馬神祇朱庇特命名,是一顆氣體巨星,其質量是太陽系中所有其他行星總和的兩倍半。 + +主要內容部分可以用於各種方式來推動更有效的指示: + +- **範例** - 與其用明確的指令告訴模型該做什麼,不如給它範例,讓它推論出模式。 +- **提示** - 在指令後面加上一個「提示」,以引導完成,讓模型朝向更相關的回應。 +- **模板** - 這些是可重複使用的提示「秘訣」,帶有佔位符(變數),可以用特定用例的數據來自訂。 + +讓我們來探索這些實際應用。 + +### 使用範例 + +這是一種方法,你可以使用主要內容來「提供模型」一些給定指令的期望輸出範例,並讓它推論出期望輸出的模式。根據提供的範例數量,我們可以有零範例提示、一範例提示、少量範例提示等。 + +現在的提示由三個部分組成: + +- 任務描述 +- 一些所需輸出的範例 +- 新範例的開始(這成為隱含的任務描述) + +| 學習類型 | 提示 (輸入) | 完成 (輸出) | +| :------------ | :---------------------------------------------------------------------------------------------------------------------------------------------------- | :-------------------------- | +| 零次學習 | "The Sun is Shining". 翻譯成西班牙文 | "El Sol está brillando". | +| 一次學習 | "The Sun is Shining" => ""El Sol está brillando".
"It's a Cold and Windy Day" => | "Es un día frío y ventoso". | +| 少次學習 | The player ran the bases => Baseball
The player hit an ace => Tennis
The player hit a six => Cricket
The player made a slam-dunk => | Basketball | +| | | | + +注意我們如何在零樣本提示中提供明確的指示("Translate to Spanish"),但在單樣本提示範例中則會被推論出來。少樣本範例顯示了如何通過增加更多範例,使模型在不增加指示的情況下做出更準確的推論。 + +### 提示線索 + +另一種使用主要內容的技巧是提供_提示_而不是範例。在這種情況下,我們通過_開始_一個反映所需回應格式的程式碼片段來給模型一個正確方向的暗示。然後模型會「接受提示」以繼續這種方式。 + +| Number of Cues | Prompt (Input) | Completion (Output) | +| :------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| 0 | Jupiter is the fifth planet from the Sun and the largest in the Solar System. It is a gas giant with a mass one-thousandth that of the Sun, but two-and-a-half times that of all the other planets in the Solar System combined. Jupiter is one of the brightest objects visible to the naked eye in the night sky, and has been known to ancient civilizations since before recorded history.
**Summarize This** | Jupiter is the largest planet in our Solar System and the fifth one from the Sun. It is a gas giant with a mass 1/1000th of the Sun's, but it is heavier than all the other planets combined. Ancient civilizations have known about Jupiter for a long time, and it is easily visible in the night sky.. | +| 1 | Jupiter is the fifth planet from the Sun and the largest in the Solar System. It is a gas giant with a mass one-thousandth that of the Sun, but two-and-a-half times that of all the other planets in the Solar System combined. Jupiter is one of the brightest objects visible to the naked eye in the night sky, and has been known to ancient civilizations since before recorded history.
**Summarize This**
What we learned is that Jupiter | is the fifth planet from the Sun and the largest in the Solar System. It is a gas giant with a mass one-thousandth that of the Sun, but two-and-a-half times that of all the other planets combined. It is easily visible to the naked eye and has been known since ancient times. | +| 2 | Jupiter is the fifth planet from the Sun and the largest in the Solar System. It is a gas giant with a mass one-thousandth that of the Sun, but two-and-a-half times that of all the other planets in the Solar System combined. Jupiter is one of the brightest objects visible to the naked eye in the night sky, and has been known to ancient civilizations since before recorded history.
**Summarize This**
Top 3 Facts We Learned: | 1. Jupiter is the fifth planet from the Sun and the largest in the Solar System.
2. It is a gas giant with a mass one-thousandth that of the Sun...
3. Jupiter has been visible to the naked eye since ancient times ... | +| | | | + +### 提示範本 + +一個提示模板是一個_預先定義的提示秘訣_,可以根據需要儲存和重複使用,以大規模推動更一致的使用者體驗。最簡單的形式,它只是一些提示範例的集合,如[這個來自 OpenAI 的範例](https://platform.openai.com/examples?WT.mc_id=academic-105485-koreyst),它提供了互動提示組件(使用者和系統訊息)和 API 驅動的請求格式 - 以支援重複使用。 + +在它更複雜的形式中,如[這個來自 LangChain 的範例](https://python.langchain.com/docs/modules/model_io/prompts/prompt_templates/?WT.mc_id=academic-105485-koreyst),它包含可以用來自各種來源(使用者輸入、系統上下文、外部資料來源等)的資料替換的_佔位符_,以動態生成提示。這使我們能夠建立一個可重複使用的提示函式庫,程式化地在大規模上驅動一致的使用者體驗。 + +最後,範本的真正價值在於能夠為垂直應用領域建立和發布_提示函式庫_——提示範本現在已_最佳化_,以反映應用特定的上下文或範例,使回應對目標用戶群體更相關和準確。[Prompts For Edu](https://github.com/microsoft/prompts-for-edu?WT.mc_id=academic-105485-koreyst)儲存庫就是這種方法的一個很好的範例,精選了教育領域的提示函式庫,強調了課程規劃、課程設計、學生輔導等關鍵目標。 + +## 支援內容 + +如果我們將提示建構視為包含一個指令(任務)和一個目標(主要內容),那麼_次要內容_就像是我們提供的額外背景以**某種方式影響輸出**。這可能是調整參數、格式指令、主題分類等,可以幫助模型_調整_其回應以符合預期的使用者目標或期望。 + +例如: 給定一個課程目錄,包含課程大綱中所有可用課程的詳細 Metadata (名稱、描述、級別、Metadata 標籤、講師等): + +- 我們可以定義一個指令來「總結2023年秋季的課程目錄」 +- 我們可以使用主要內容來提供一些所需輸出的範例 +- 我們可以使用次要內容來識別前5個感興趣的「標籤」 + +現在,模型可以按照幾個範例顯示的格式提供摘要 - 但如果結果有多個標籤,它可以優先考慮次要內容中識別的5個標籤。 + +--- + + + + +## 提示最佳實踐 + +現在我們知道如何_建構_提示,我們可以開始思考如何_設計_它們以反映最佳實踐。我們可以將這分為兩部分 - 擁有正確的_心態_和應用正確的_技術_。 + +### 提示工程心態 + +提示工程是一個反覆試驗的過程,因此請記住三個廣泛的指導因素: + +1. **領域理解很重要。** 回應的準確性和相關性取決於應用程式或使用者操作的_領域_。運用你的直覺和領域專業知識進一步**自訂技術**。例如,在系統提示中定義_領域特定的人格_,或在使用者提示中使用_領域特定的範本_。提供反映領域特定上下文的次要內容,或使用_領域特定的提示和範例_來引導模型朝向熟悉的使用模式。 + +2. **模型理解很重要。** 我們知道模型本質上是隨機的。但模型實現也可能因其使用的訓練數據集(預訓練知識)、提供的功能(例如,通過 API 或 SDK)以及它們最佳化的內容類型(例如,程式碼 vs. 圖像 vs. 文字)而有所不同。了解你所使用模型的優勢和限制,並利用這些知識來_優先處理任務_或建構_最佳化模型功能的自訂範本_。 + +3. **迭代與驗證很重要。** 模型正在快速演變,提示工程技術也是如此。作為領域專家,你可能有其他_你的_特定應用程式的上下文或標準,這些可能不適用於更廣泛的社群。使用提示工程工具和技術來「快速啟動」提示構建,然後使用你的直覺和領域專業知識進行迭代和驗證結果。記錄你的見解並建立一個**知識庫**(例如,提示函式庫),以便其他人將來可以用作新的基準,進行更快速的迭代。 + +## 最佳實踐 + +現在讓我們來看看[Open AI](https://help.openai.com/en/articles/6654000-best-practices-for-prompt-engineering-with-openai-api?WT.mc_id=academic-105485-koreyst)和[Azure OpenAI](https://learn.microsoft.com/azure/ai-services/openai/concepts/prompt-engineering#best-practices?WT.mc_id=academic-105485-koreyst)從業者推薦的常見最佳實踐。 + +| 什麼 | 為什麼 | +| :-------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| 評估最新模型 | 新模型世代可能具有改進的功能和品質 - 但也可能會產生更高的成本。評估它們的影響,然後做出遷移決策。 | +| 分開指令和上下文 | 檢查您的模型/提供者是否定義了_分隔符_以更清楚地區分指令、主要和次要內容。這可以幫助模型更準確地分配權重給標記。 | +| 具體且清晰 | 提供更多關於所需上下文、結果、長度、格式、風格等的詳細資訊。這將改善回應的品質和一致性。在可重用的模板中捕捉秘訣。 | +| 描述性,使用範例 | 模型可能對「展示和講解」的方法反應更好。從`零範例`方法開始,給它一個指令(但沒有範例),然後嘗試`少量範例`作為改進,提供一些所需輸出的範例。使用類比。 | +| 使用提示來啟動完成 | 給它一些可以用作回應起點的引導詞或短語,將其推向所需的結果。 | +| 重複 | 有時您可能需要對模型重複自己。在主要內容之前和之後給出指令,使用指令和提示等。迭代和驗證以查看什麼有效。 | +| 順序很重要 | 您向模型呈現資訊的順序可能會影響輸出,即使在學習範例中也是如此,這要歸功於新近性偏見。嘗試不同的選項以查看什麼最有效。 | +| 給模型一個「退出」 | 給模型一個_後備_完成回應,如果因任何原因無法完成任務,它可以提供這個回應。這可以減少模型生成錯誤或虛假回應的機會。 | +| | | + +如同任何最佳實踐,請記住,根據模型、任務和領域的不同,你的效果可能會有所不同。將這些作為起點,並反覆試驗以找到最適合你的方法。隨著新模型和工具的推出,不斷重新評估你的提示工程流程,重點關注流程的延展性和回應品質。 + + + +## 作業 + +恭喜!你完成了這節課!是時候用一些真實範例來測試這些概念和技術了! + +在我們的作業中,我們將使用一個 Jupyter Notebook,其中包含您可以互動完成的練習。您也可以使用您自己的 Markdown 和程式碼單元來擴展 Notebook,以便自行探索想法和技術。 + +### 要開始,先分叉這個 Repo,然後 + +- (推薦) 啟動 GitHub Codespaces +- (或者) 複製 repo 到你的本地裝置並使用 Docker Desktop +- (或者) 使用你偏好的 Notebook 執行環境開啟 Notebook。 + +### 接下來,設定你的環境變數 + +- 複製 repo 根目錄中的 `.env.copy` 檔案到 `.env` 並填入 `AZURE_OPENAI_KEY`、`AZURE_OPENAI_ENDPOINT` 和 `AZURE_OPENAI_DEPLOYMENT` 值。回到[Learning Sandbox section](../../04-prompt-engineering-fundamentals#learning-sandbox)學習如何操作。 + +### 接下來,打開 Jupyter Notebook + +- 選擇執行時核心。如果使用選項 1 或 2,只需選擇開發容器提供的預設 Python 3.10.x 核心。 + +你已經準備好執行這些練習。請注意,這裡沒有_對與錯_的答案——只是通過反覆試驗來探索選項,並為給定的模型和應用領域建立直覺。 + +_因此,本課程中沒有程式碼解決方案部分。相反,筆記本將有標題為 "My Solution:" 的 Markdown 儲存格,顯示一個範例輸出供參考。_ + + + +## 知識檢查 + +以下哪一項是遵循一些合理最佳實踐的良好提示? + +1. 給我看一張紅色汽車的圖片 +2. 給我看一張紅色汽車的圖片,品牌為Volvo,型號為XC90,停在懸崖邊,夕陽西下 +3. 給我看一張紅色汽車的圖片,品牌為Volvo,型號為XC90 + +A: 2, 這是最好的提示,因為它提供了「什麼」的詳細資訊並進入具體細節(不僅僅是任何車,而是特定的品牌和型號),它還描述了整體設定。3 是次佳的,因為它也包含了很多描述。 + +## 🚀 挑戰 + +看看你是否可以利用 "cue" 技術來完成提示: 完成句子 "Show me an image of red car of make Volvo and "。它會如何回應,你會如何改進它? + +## 很棒的工作!繼續學習 + +想了解更多不同的提示工程概念嗎?請前往[持續學習頁面](https://aka.ms/genai-collection?WT.mc_id=academic-105485-koreyst)以找到其他關於此主題的優質資源。 + +前往第 5 課,我們將探討[進階提示技巧](../../../05-advanced-prompts/translations/tw/README.md?WT.mc_id=academic-105485-koreyst)! + diff --git a/05-advanced-prompts/translations/tw/README.md b/05-advanced-prompts/translations/tw/README.md new file mode 100644 index 000000000..b1820cdcb --- /dev/null +++ b/05-advanced-prompts/translations/tw/README.md @@ -0,0 +1,636 @@ +# 建立進階提示 + +[![建立進階提示](../../images/05-lesson-banner.png?WT.mc_id=academic-105485-koreyst)](https://aka.ms/gen-ai-lesson5-gh?WT.mc_id=academic-105485-koreyst?WT.mc_id=academic-105485-koreyst) + +讓我們回顧一下前一章的一些學習內容: + +> Prompt _工程_ 是我們通過提供更有用的指示或上下文來**引導模型朝向更相關的回應**的過程。 + +撰寫提示也有兩個步驟,構建提示,提供相關上下文,第二部分是_最佳化_,如何逐步改進提示。 + +此時,我們已經對如何編寫提示有了一些基本的了解,但我們需要更深入地探討。在本章中,你將從嘗試各種提示到理解為什麼一個提示比另一個提示更好。你將學習如何遵循一些基本技術來構建提示,這些技術可以應用於任何 LLM。 + +## 簡介 + +在本章中,我們將涵蓋以下主題: + +- 通過將不同技術應用於提示來擴展您對提示工程的知識。 +- 配置您的提示以改變輸出。 + +## 學習目標 + +完成此課程後,您將能夠: + +- 應用提示工程技術來改善提示的結果。 +- 執行變化或確定性的提示。 + +## 提示工程 + +提示工程是創建能夠產生預期結果的提示的過程。提示工程不僅僅是編寫文本提示。提示工程不是一門工程學科,它更像是一組技術,你可以應用這些技術來獲得預期的結果。 + +### 範例的提示 + +讓我們來看一個基本的提示,如下所示: + +> 產生10個地理問題。 + +在此提示中,您實際上應用了不同提示技術的集合。 + +讓我們來解析這個。 + +- **上下文**, 你指定它應該是關於"地理"。 +- **限制輸出**, 你希望不超過10個問題。 + +### 簡單提示的限制 + +你可能會或不會得到預期的結果。你的問題會被生成,但地理是一個很大的主題,你可能因以下原因而無法得到你想要的結果: + +- **大主題**, 你不知道它會是關於國家、首都、河流等等。 +- **格式**, 如果你希望問題以某種方式格式化怎麼辦? + +如你所見,建立提示時有很多需要考慮的因素。 + +到目前為止,我們已經看過一個簡單的提示範例,但生成式 AI 能夠做更多事情來幫助各種角色和行業的人們。接下來讓我們探索一些基本技術。 + +### 提示技巧 + +首先,我們需要了解,提示是一個 LLM 的 _突現_ 屬性,這意味著這不是模型內建的功能,而是我們在使用模型時發現的。 + +有一些基本技術可以用來提示 LLM。我們來探索它們。 + +- **零次提示**,這是最基本的提示形式。它是一個單一的提示,僅基於其訓練數據請求LLM的回應。 +- **少次提示**,這種類型的提示通過提供一個或多個範例來引導LLM生成其回應。 +- **思維鏈**,這種類型的提示告訴LLM如何將問題分解成步驟。 +- **生成知識**,為了改進提示的回應,你可以額外提供生成的事實或知識。 +- **從少到多**,像思維鏈一樣,這種技術是將問題分解成一系列步驟,然後要求按順序執行這些步驟。 +- **自我改進**,這種技術是批判LLM的輸出,然後要求其改進。 +- **產婆提示**。你在這裡想要確保LLM的答案是正確的,並要求它解釋答案的各個部分。這是一種自我改進的形式。 + +### 零樣本提示 + +這種提示風格非常簡單,它由單一提示組成。這種技術可能是你在開始學習 LLMs 時所使用的。這裡有一個範例: + +- 提示: "什麼是代數?" +- 答案: "代數是數學的一個分支,研究數學符號和操作這些符號的規則。" + +### 少量樣本提示 + +這種提示風格通過提供一些範例和請求來幫助模型。它包含一個帶有額外任務特定資料的單一提示。這裡有一個範例: + +- 提示: "以莎士比亞的風格寫一首詩。這裡有一些莎士比亞十四行詩的範例: + 十四行詩18: '我能否將你比作夏日?你更可愛也更溫和...' + 十四行詩116: '真心相愛的結合,我不承認任何障礙。愛不是愛,如果它在發現變故時改變...' + 十四行詩132: '我愛你的眼睛,它們憐憫我,知道你的心折磨我,帶著輕蔑,...' + 現在,寫一首關於月亮之美的十四行詩。" +- 回答: "在天空中,月亮柔和地閃爍,銀色的光芒散發著溫柔的優雅,..." + +範例提供 LLM 相關的背景、格式或所需輸出的風格。它們幫助模型理解特定任務並生成更準確和相關的回應。 + +### Chain-of-thought + +Chain-of-thought 是一個非常有趣的技術,因為它涉及讓 LLM 經歷一系列步驟。這個想法是以某種方式指導 LLM,使其理解如何做某事。考慮以下範例,有和沒有 chain-of-thought: + +- 提示: "Alice 有 5 顆蘋果,扔了 3 顆蘋果,給了 Bob 2 顆,Bob 還了一顆,Alice 還有幾顆蘋果?" +- 答案: 5 + +LLM 回答 5,這是不正確的。正確答案是 1 個蘋果,根據計算 (5 -3 -2 + 1 = 1)。 + +那麼我們如何教導 LLM 正確地執行這個操作呢? + +讓我們嘗試連鎖思維。應用連鎖思維意味著: + +1. 給 LLM 一個類似的範例。 +1. 顯示計算過程,以及如何正確計算。 +1. 提供原始提示。 + +以下是方法: + +- 提示: "Lisa 有 7 顆蘋果,丟掉 1 顆蘋果,給 Bart 4 顆蘋果,而 Bart 還給她一顆: + 7 -1 = 6 + 6 -4 = 2 + 2 +1 = 3 + Alice 有 5 顆蘋果,丟掉 3 顆蘋果,給 Bob 2 顆,而 Bob 還給她一顆,Alice 有幾顆蘋果?" + 答案: 1 + +注意我們如何使用另一個範例撰寫更長的提示,一個計算,然後是原始提示,我們得出正確答案1。 + +如你所見,chain-of-thought 是一個非常強大的技術。 + +### 生成的知識 + +很多時候,當你想要建構提示時,你會想要使用自己公司的資料。你希望提示的一部分來自公司,另一部分則是你感興趣的實際提示。 + +作為範例,如果你從事保險業務,這就是你的提示可能看起來的樣子: + +```text +{{company}}: {{company_name}} +{{products}}: +{{products_list}} +請根據以下預算和需求推薦一份保險: +預算: {{budget}} +需求: {{requirements}} +``` + +在上面,你可以看到如何使用模板構建提示。在模板中,有許多變數,用 `{{variable}}` 表示,這些變數將被公司 API 的實際值替換。 + +以下是一個範例,說明在將變數替換為您公司內容後,提示可能的樣子: + +```text +保險公司: ACME Insurance +保險產品(每月費用): +- 汽車,便宜,500 USD +- 汽車,昂貴,1100 USD +- 住宅,便宜,600 USD +- 住宅,昂貴,1200 USD +- 人壽,便宜,100 USD + +請根據以下預算和需求建議一個保險: +預算: $1000 +需求: 汽車、住宅和人壽保險 +``` + +執行此提示通過 LLM 將產生如下回應: + +```output +根據預算和需求,我們建議以下來自ACME保險的保險套件: +- 汽車,便宜,500美元 +- 住宅,便宜,600美元 +- 人壽,便宜,100美元 +總成本: $1,200美元 +``` + +如你所見,它也建議了人壽保險,這是不應該的。這個結果表明我們需要通過更改提示來使其更清晰,以便知道它可以允許什麼。經過一些_反覆試驗_,我們得出了以下提示: + +```text +保險公司: ACME Insurance +保險產品(每月費用): +- 類型: Car, 便宜, 費用: 500 USD +- 類型: Car, 昂貴, 費用: 1100 USD +- 類型: Home, 便宜, 費用: 600 USD +- 類型: Home, 昂貴, 費用: 1200 USD +- 類型: Life, 便宜, 費用: 100 USD + +請根據以下預算和需求建議保險: +預算: $1000 限制選擇類型: Car, Home +``` + +注意,添加 _type_ 和 _cost_ 並使用關鍵字 _restrict_ 如何幫助 LLM 理解我們的需求。 + +現在我們得到以下回應: + +```output +鑑於預算和需求,我們建議選擇每月花費500美元的汽車和便宜的保險產品。 +``` + +這個範例的重點是要顯示,即使我們使用像_產生的知識_這樣的基本技術,我們在大多數情況下仍然需要最佳化提示以獲得所需的結果。 + +### 最少到最多 + +將最少提示到最多提示的想法是將一個更大的問題分解成子問題。這樣,你可以幫助引導LLM如何「征服」更大的問題。一個好的範例可以是資料科學,你可以要求LLM這樣劃分一個問題: + +> 提示: 如何在5個步驟中進行資料科學? + +使用你的 AI 助手回答: + +1. 收集資料 +1. 清理資料 +1. 分析資料 +1. 繪製資料 +1. 呈現資料 + +### 自我改進,批評結果 + +隨著生成式 AI 和 LLM 的發展,你不能完全信任其輸出。你需要驗證它。畢竟,LLM 只是向你展示下一個最有可能說的話,而不是正確的內容。因此,一個好的想法是讓 LLM 自我批評,這引導我們使用自我改進技術。 + +它的運作方式是你按照以下步驟操作: + +1. 初始提示要求 LLM 解決問題 +1. LLM 回答 +1. 你批評答案並要求 AI 改進 +1. LLM 再次回答,這次考慮了批評並提出了解決方案 + +你可以根據需要多次重複此過程。 + +以下是使用此技術的範例: + +> 提示: "建立一個具有路由產品和客戶的 Python Web API" + +AI 答案: + +```python +import flask +app = Flask(__name__) + +@app.route('/products') +def products(): + return '產品' + +@app.route('/customers') +def customers(): + return '顧客' +``` + +> 提示: 建議上述程式碼的3個改進之處 + +AI 答案: + +```text +當然,這裡有三個改進程式碼的建議: + +匯入正確的模組: 第一行應該匯入 Flask 而不是 flask。正確的匯入語句應該是 from flask import Flask。 + +添加一個主函式: 在檔案的末尾添加一個 if __name__ == '__main__': 區塊,以便在檔案執行時運行應用程式。 + +使用 f-strings: 使用 f-strings 來格式化路由函式中的返回語句。例如,return 'Products' 可以改為 return f'This is the {request.path} page'。 +``` + +```python +from flask import Flask, request + +app = Flask(__name__) + +@app.route('/products') +def products(): + return f'這是 {request.path} 頁面' + +@app.route('/customers') +def customers(): + return f'這是 {request.path} 頁面' + +if __name__ == '__main__': + app.run() +``` + +如你所見,上述的 AI 回應正在改進第一個建議的程式碼,這要歸功於對第一個答案的批評。 + +### 產婆式提示 + +Maieutic 提示是一種類似於自我改進的技術,但它更關注於要求 LLM 解釋自己。其目標是減少 LLM 輸出中的不一致性,以確保其得出正確的答案。要遵循的工作流程是: + +1. 向 LLM 提問 +1. 對於答案的每個部分,要求 LLM 更深入地解釋。 +1. 如果有不一致的地方,丟棄不一致的部分。 + +重複 2 和 3 直到你完成所有部分並對答案感到滿意為止。 + +這是一個範例提示: + +> 提示: 我如何在5個步驟中建立一個危機計劃來減輕大流行病的影響? +> LLM 回答: + +```text +1. 識別風險 +1. 識別利益相關者 +1. 識別資源 +1. 識別行動 +1. 識別通訊管道 +``` + +已識別出5個步驟,但我們能否確定這是正確的?讓我們請 LLM 解釋每個步驟: + +> 提示: 更詳細地解釋第一步,詳細說明大流行的風險是什麼? + +```text +風險如下: + +- 失去生命 +- 失去業務 +- 失去聲譽 +- 失去客戶 +- 失去員工 +``` + +此時,我們想確保 LLM 是正確的,因此我們要求它更詳細地解釋第一個風險,並希望它與上述答案一致: + +> 提示: 在大流行期間,最大的風險是什麼,為什麼? + +```text +最大的風險是失去生命,因為這是最重要的保護。 +``` + +> 在大流行中最大的兩個風險是什麼? + +```text +兩個最大的風險是生命損失和業務損失。 +``` + +此時,LLM 是一致的,並提到「生活」和「業務」是前兩大風險。我們現在可以繼續進行下一步,並感到相當有信心。然而,我們不應該盲目相信 LLM,我們應該始終驗證輸出。 + +## 變化你的輸出 + +LLM 本質上是非確定性的,這意味著每次執行相同的提示時,您將獲得不同的結果。例如,嘗試以下提示: + +> "為 Python Web API 產生程式碼" + +```python +# 匯入必要的模組 +import flask +from flask import request, jsonify + +# 建立一個 Flask 應用程式 +app = flask.Flask(__name__) + +# 為 API 建立一個路由 +@app.route('/api', methods=['GET']) +def api(): + # 從請求中獲取資料 + data = request.args + + # 處理資料 + result = process_data(data) + + # 以 JSON 格式返回結果 + return jsonify(result) + +# 處理資料的函式 +def process_data(data): + # 對資料進行某些操作 + result = data + 1 + + # 返回結果 + return result + +# 執行應用程式 +if __name__ == '__main__': + app.run() +``` + +再次執行相同的提示會產生略有不同的回應: + +```python +#import necessary packages +import flask +from flask import request, jsonify + +#create the Flask application +app = flask.Flask(__name__) +app.config["DEBUG"] = True + +#create a list of books +books = [ + {'id': 0, + 'title': 'A Fire Upon the Deep', + 'author': 'Vernor Vinge', + 'first_sentence': 'The coldsleep itself was dreamless.', + 'year_published': '1992'}, + {'id': 1, + 'title': 'The Ones Who Walk Away From Omelas', + 'author': 'Ursula K. Le Guin', + 'first_sentence': 'With a clamor of bells that set the swallows soaring, the Festival of Summer came to the city Omelas, bright-towered by the sea.', + 'published': '1973'}, + {'id': 2, + 'title': 'Dhalgren', + 'author': 'Samuel R. Delany', + 'first_sentence': 'to wound the autumnal city.', + 'published': '1975'} +] + +#create an endpoint for the API +@app.route('/', methods=['GET']) +def home(): + return '''

Books API

+

A prototype API for retrieving books.

''' + +#create an endpoint to return all books +@app.route('/api/v1/resources/books/all', methods=['GET']) +def api_all(): + return jsonify(books) + +#create an endpoint to return a single book +@app.route('/api/v1/resources/books', methods=['GET']) +def api_id(): + #check if an ID was provided as part of the URL + #if ID is provided, assign it to a variable + #if no ID is provided, display an error + if 'id' in request.args: + id = int(request.args['id']) + else: + return "Error: No id field provided. Please specify an id." + + #create an empty list for our results + results = [] + + #loop through the data and match results that fit the requested ID + #IDs are unique, but other fields might return many results + for book in books: + if book['id'] == id: + results.append(book) + + #use the jsonify function from Flask to convert our list of + #Python dictionaries to the JSON format + return jsonify(results) + +app.run() +``` + +> 那麼多樣化的輸出是一個問題嗎? + +取決於你想要做什麼。如果你想要一個具體的回應,那麼這是一個問題。如果你對於像是「生成任意3個地理問題」這樣的多樣化輸出沒有問題,那麼這不是問題。 + +### 使用溫度來變化您的輸出 + +好的,所以我們決定要限制輸出以使其更可預測,也就是更具決定性。我們該怎麼做呢? + +溫度是一個介於 0 和 1 之間的值,其中 0 是最具決定性的,1 是最具變化的。預設值是 0.7。讓我們看看在溫度設為 0.1 的情況下,兩次執行相同提示會發生什麼: + +> "為 Python Web API 產生程式碼" + +```python +#import necessary libraries +import flask +from flask import request, jsonify + +#create an instance of the Flask class +app = flask.Flask(__name__) + +#create an endpoint for the API +@app.route('/api/v1/endpoint', methods=['GET']) +def api_endpoint(): + #get the request data + data = request.get_json() + + #process the data + result = process_data(data) + + #return the result + return jsonify(result) + +#function to process the data +def process_data(data): + #process the data + result = {'result': 'success'} + + #return the result + return result + +#run the Flask app +if __name__ == '__main__': + app.run() + +``` + +再次執行提示會給我們這個結果: + +```python +#import necessary libraries +import flask +from flask import request, jsonify + +#create a Flask app +app = flask.Flask(__name__) + +#create a route for the API +@app.route('/api', methods=['GET']) +def api_call(): + #get the data from the request + data = request.get_json() + + #process the data + result = process_data(data) + + #return the result + return jsonify(result) + +#define the process_data function +def process_data(data): + #do something with the data + result = data + 1 + + #return the result + return result + +#run the app +if __name__ == '__main__': + app.run() + +``` + +這兩個輸出之間只有很小的差異。這次我們來做相反的事情,將溫度設置為0.9: + +```python +# 匯入必要的函式庫 +import flask +from flask import request, jsonify + +# 建立一個 Flask 應用程式 +app = flask.Flask(__name__) + +# 為 API 建立一個路由 +@app.route('/api', methods=['GET']) +def api_call(): + # 從請求中獲取資料 + data = request.args + + # 處理資料 + result = process_data(data) + + # 返回結果 + return jsonify(result) + +# 處理資料的函式 +def process_data(data): + # 對資料進行處理 + result = data + 1 + + # 返回結果 + return result + +# 執行應用程式 +if __name__ == '__main__': + app.run() + +``` + +並且第二次嘗試將溫度值設為 0.9: + +```python +import flask +from flask import request, jsonify + +# 建立 Flask 應用程式 +app = flask.Flask(__name__) +app.config['DEBUG'] = True + +# 建立一些測試資料 +書籍 = [ + {'id': 0, 'title': 'A Fire Upon The Deep', 'author': 'Vernor Vinge', 'first_sentence': 'The coldsleep itself was dreamless.', 'year_published': '1992'}, + {'id': 1, 'title': 'The Ones Who Walk Away From Omelas', 'author': 'Ursula K. Le Guin', 'first_sentence': 'With a clamor of bells that set the swallows soaring, the Festival of Summer came to the city Omelas, bright-towered by the sea.', 'published': '1973'}, + {'id': 2, 'title': 'Dhalgren', 'author': 'Samuel R. Delany', 'first_sentence': 'to wound the autumnal city.', 'published': '1975'} +] + +# 建立一個端點 +@app.route('/', methods=['GET']) +def home(): + return '''

歡迎來到我們的書籍 API!

''' + +@app.route('/api/v1/resources/books + +``` + +正如你所見,結果可能會非常多樣化。 + +> 請注意,還有更多參數可以更改以改變輸出,例如 top-k、top-p、重複懲罰、長度懲罰和多樣性懲罰,但這些不在本課程範圍內。 + +## 良好實踐 + +有許多實踐方法可以嘗試獲得你想要的結果。隨著你越來越多地使用提示,你會找到自己的風格。 + +此外,除了我們已經涵蓋的技術外,還有一些在提示 LLM 時需要考慮的良好實踐。 + +以下是一些值得考慮的良好做法: + +- **指定上下文**。上下文很重要,您能指定的越多(如領域、主題等),效果會越好。 +- 限制輸出。如果您想要特定數量的項目或特定長度,請指定。 +- **指定內容和方式**。記得要提到您想要什麼以及您想要的方式,例如"建立一個具有產品和客戶路由的 Python Web API,將其分成三個文件"。 +- **使用範本**。通常,您會希望使用來自公司資料來豐富您的提示。使用範本來做到這一點。範本可以有變數,您可以用實際資料替換這些變數。 +- **拼寫正確**。LLM 可能會給您正確的回應,但如果您拼寫正確,您會得到更好的回應。 + +## 作業 + +以下是使用 Flask 建構簡單 API 的 Python 程式碼: + +```python +from flask import Flask, request + +app = Flask(__name__) + +@app.route('/') +def hello(): + name = request.args.get('name', 'World') + return f'Hello, {name}!' + +if __name__ == '__main__': + app.run() +``` + +使用像 GitHub Copilot 或 ChatGPT 的 AI 助手,並應用「自我改進」技術來改進程式碼。 + +## 解決方案 + +請嘗試通過向程式碼添加合適的提示來解決這個任務。 + +> [!TIP] +> 針對提示進行措辭以要求改進,限制改進的數量是個好主意。你也可以要求以某種方式改進,例如架構、效能、安全性等。 + +[解決方案](../../python/aoai-solution.py?WT.mc_id=academic-105485-koreyst) + +## 知識檢查 + +為什麼我要使用 chain-of-thought 提示?給我看 1 個正確的回應和 2 個不正確的回應。 + +1. 教導 LLM 如何解決問題。 +1. B, 教導 LLM 找出程式碼中的錯誤。 +1. C, 指導 LLM 提出不同的解決方案。 + +A: 1,因為 chain-of-thought 是通過提供一系列步驟來向 LLM 展示如何解決問題,以及類似問題及其解決方法。 + +## 🚀 挑戰 + +你剛剛在作業中使用了自我改進技術。拿你建構的任何程式,考慮你想要應用的改進。現在使用自我改進技術來應用所提議的更改。你認為結果如何,更好還是更糟? + +## 很棒的工作!繼續學習 + +完成本課程後,請查看我們的[生成式 AI 學習集合](https://aka.ms/genai-collection?WT.mc_id=academic-105485-koreyst)以繼續提升您的生成式 AI 知識! + +前往第6課,我們將應用我們的提示工程知識來[建構文本生成應用程式](../../../06-text-generation-apps/translations/tw/README.md?WT.mc_id=academic-105485-koreyst) + diff --git a/06-text-generation-apps/translations/tw/README.md b/06-text-generation-apps/translations/tw/README.md new file mode 100644 index 000000000..54d1bce16 --- /dev/null +++ b/06-text-generation-apps/translations/tw/README.md @@ -0,0 +1,656 @@ +# 建構文本生成應用程式 + +[![建構文本生成應用程式](../../images/06-lesson-banner.png?WT.mc_id=academic-105485-koreyst)](https://aka.ms/gen-ai-lesson6-gh?WT.mc_id=academic-105485-koreyst) + +> _(點擊上方圖片以觀看本課的影片)_ + +你已經透過這個課程看到了核心概念,如提示,甚至還有一個叫做「提示工程」的整個學科。許多工具如ChatGPT、Office 365、Microsoft Power Platform等,都支持你使用提示來完成某些事情。 + +為了讓你將這樣的體驗添加到應用程式中,你需要了解提示、完成等概念,並選擇一個函式庫來使用。這正是你在本章中將學到的內容。 + +## 簡介 + +在本章中,你將: + +- 了解 openai 函式庫及其核心概念。 +- 使用 openai 建構一個文字產生應用程式。 +- 了解如何使用提示、溫度和代幣等概念來建構一個文字產生應用程式。 + +## 學習目標 + +在本課程結束時,你將能夠: + +- 解釋什麼是文字生成應用程式。 +- 使用 openai 建立一個文字生成應用程式。 +- 配置你的應用程式以使用更多或更少的 tokens,並且改變溫度,以獲得多樣化的輸出。 + +## 什麼是文字生成應用程式? + +通常當你建構一個應用程式時,它會有某種介面,如下所示: + +- 基於命令。控制台應用程式是典型的應用程式,你輸入一個命令,它就會執行一個任務。例如,`git` 是一個基於命令的應用程式。 +- 使用者介面 (UI)。有些應用程式有圖形使用者介面 (GUI),你可以點擊按鈕、輸入文字、選擇選項等。 + +### 控制台和 UI 應用程式是有限的 + +將其與基於命令的應用程式進行比較,在那裡你輸入一個命令: + +- **它有限制**。你不能隨便輸入任何命令,只能輸入應用程式支援的命令。 +- **特定語言**。有些應用程式支援多種語言,但預設情況下應用程式是為特定語言建構的,即使你可以添加更多語言支援。 + +### 文字生成應用程式的好處 + +那麼文本生成應用程式有什麼不同呢? + +在一個文本生成應用中,你有更多的靈活性,你不會被限制於一組命令或特定的輸入語言。相反,你可以使用自然語言與應用互動。另一個好處是,因為你已經在與一個經過大量資訊訓練的數據源互動,而傳統應用可能會被限制於資料庫中的內容。 + +### 我可以用文字生成應用程式建構什麼? + +有許多事情你可以建構。例如: + +- **聊天機器人**。一個回答有關主題問題的聊天機器人,比如你的公司及其產品,可能是一個很好的匹配。 +- **助手**。LLM 在總結文本、從文本中獲取見解、生成像簡歷這樣的文本等方面非常出色。 +- **程式碼助手**。根據你使用的語言模型,你可以建構一個幫助你編寫程式碼的程式碼助手。例如,你可以使用像 GitHub Copilot 以及 ChatGPT 這樣的產品來幫助你編寫程式碼。 + +## 我該如何開始? + +嗯,你需要找到一種方式來整合 LLM,這通常涉及以下兩種方法: + +- 使用 API。在這裡,你正在使用提示來構建網路請求並獲取生成的文本。 +- 使用函式庫。函式庫有助於封裝 API 呼叫並使其更易於使用。 + +## 函式庫/SDKs + +有一些知名的函式庫可用於處理 LLM,例如: + +- **openai**,此函式庫讓連接到您的模型並發送提示變得容易。 + +然後有一些函式庫在更高層次上運作,例如: + +- **Langchain**。Langchain 眾所周知並且支援 Python。 +- **Semantic Kernel**。Semantic Kernel 是 Microsoft 的一個函式庫,支援 C#、Python 和 Java 語言。 + +## 第一個使用 openai 的應用程式 + +讓我們看看如何建構我們的第一個應用程式,需要哪些函式庫,需要多少等等。 + +### 安裝 openai + +有許多函式庫可以與 OpenAI 或 Azure OpenAI 互動。也可以使用多種程式語言,如 C#、Python、JavaScript、Java 等。我們選擇使用 `openai` Python 函式庫,因此我們將使用 `pip` 來安裝它。 + +```bash +pip install openai +``` + +### 建立資源 + +你需要執行以下步驟: + +- 在 Azure 上建立帳戶 [https://azure.microsoft.com/free/](https://azure.microsoft.com/free/?WT.mc_id=academic-105485-koreyst)。 +- 獲取 Azure OpenAI 的存取權。前往 [https://learn.microsoft.com/azure/ai-services/openai/overview#how-do-i-get-access-to-azure-openai](https://learn.microsoft.com/azure/ai-services/openai/overview#how-do-i-get-access-to-azure-openai?WT.mc_id=academic-105485-koreyst) 並請求存取權。 + + > [!NOTE] + > 在撰寫本文時,您需要申請存取 Azure OpenAI。 + +- 安裝 Python +- 已建立 Azure OpenAI 服務資源。請參閱此指南了解如何[建立資源](https://learn.microsoft.com/azure/ai-services/openai/how-to/create-resource?pivots=web-portal?WT.mc_id=academic-105485-koreyst)。 + +### 找到 API 金鑰和端點 + +此時,你需要告訴你的 `openai` 函式庫要使用哪個 API 金鑰。要找到你的 API 金鑰,請前往 Azure OpenAI 資源的 "Keys and Endpoint" 部分並複製 "Key 1" 值。 + +![金鑰和端點資源頁面在 Azure Portal 中](https://learn.microsoft.com/azure/ai-services/openai/media/quickstarts/endpoint.png?WT.mc_id=academic-105485-koreyst) + +現在你已經複製了這些資訊,讓我們指示函式庫使用它。 + +> [!NOTE] +> 值得將您的 API 金鑰與程式碼分開。您可以使用環境變數來做到這一點。 +> +> - 將環境變數 `OPENAI_API_KEY` 設定為您的 API 金鑰。 +> `export OPENAI_API_KEY='sk-...'` + +### 設定配置 Azure + +如果你正在使用 Azure OpenAI,以下是設定配置的方法: + +```python +openai.api_type = 'azure' +openai.api_key = os.environ["OPENAI_API_KEY"] +openai.api_version = '2023-05-15' +openai.api_base = os.getenv("API_BASE") +``` + +以上我們設定以下內容: + +- `api_type` 設為 `azure`。這告訴函式庫使用 Azure OpenAI 而非 OpenAI。 +- `api_key`,這是你在 Azure Portal 中找到的 API 金鑰。 +- `api_version`,這是你想使用的 API 版本。在撰寫本文時,最新的版本是 `2023-05-15`。 +- `api_base`,這是 API 的端點。你可以在 Azure Portal 中的 API 金鑰旁找到。 + +> [!NOTE] > `os.getenv` 是一個讀取環境變數的函式。你可以使用它來讀取像是 `OPENAI_API_KEY` 和 `API_BASE` 的環境變數。在你的終端機中設定這些環境變數或使用像 `dotenv` 這樣的函式庫。 + +## 產生文字 + +生成文本的方法是使用 `Completion` 類別。以下是一個範例: + +```python +prompt = "Complete the following: Once upon a time there was a" + +completion = openai.Completion.create(model="davinci-002", prompt=prompt) +print(completion.choices[0].text) +``` + +在上述程式碼中,我們建立一個完成物件並傳入我們想要使用的模型和提示。然後我們列印產生的文字。 + +### 聊天完成 + +到目前為止,你已經看到我們如何使用 `Completion` 來產生文本。但還有另一個更適合聊天機器人的類別,稱為 `ChatCompletion`。以下是使用它的範例: + +```python +import openai + +openai.api_key = "sk-..." + +completion = openai.ChatCompletion.create(model="gpt-3.5-turbo", messages=[{"role": "user", "content": "Hello world"}]) +print(completion.choices[0].message.content) +``` + +更多關於此功能的資訊在即將到來的章節中。 + +## 練習 - 您的第一個文本生成應用程序 + +現在我們已經學會如何設定和配置 openai,是時候建構你的第一個文字產生應用了。要建構你的應用,請按照以下步驟操作: + +1. 建立虛擬環境並安裝 openai: + + ```bash + python -m venv venv + source venv/bin/activate + pip install openai + ``` + + > [!NOTE] + > 如果你使用的是 Windows,請輸入 `venv\Scripts\activate` 而不是 `source venv/bin/activate`。 + + > [!NOTE] + > 前往 [https://portal.azure.com/](https://portal.azure.com/?WT.mc_id=academic-105485-koreyst) 並搜尋 `Open AI`,選擇 `Open AI resource`,然後選擇 `Keys and Endpoint` 並複製 `Key 1` 的值來找到你的 Azure OpenAI 金鑰。 + +1. 建立一個 _app.py_ 文件並給它以下程式碼: + + ```python + import openai + + openai.api_key = "" + + openai.api_type = 'azure' + openai.api_version = '2023-05-15' + openai.api_base = "" + deployment_name = "" + + # 添加你的完成程式碼 + prompt = "Complete the following: Once upon a time there was a" + messages = [{"role": "user", "content": prompt}] + + # 進行完成 + completion = client.chat.completions.create(model=deployment, messages=messages) + + # 打印回應 + print(completion.choices[0].message.content) + ``` + + > [!NOTE] + > 如果你使用的是 Azure OpenAI,你需要將 `api_type` 設置為 `azure` 並將 `api_key` 設置為你的 Azure OpenAI 金鑰。 + + 你應該會看到如下輸出: + + ```output + very unhappy _____. + + Once upon a time there was a very unhappy mermaid. + ``` + +## 不同類型的提示,用於不同的事情 + +現在你已經看到了如何使用提示生成文本。你甚至有一個正在執行的程式碼,可以修改和更改以生成不同類型的文本。 + +提示可以用於各種任務。例如: + +- **生成一種類型的文本**。例如,你可以生成一首詩、測驗的問題等。 +- **查找資訊**。你可以使用提示來查找資訊,例如以下範例'在網頁開發中,CORS 是什麼意思?'。 +- **生成程式碼**。你可以使用提示來生成程式碼,例如開發用於驗證電子郵件的正則表達式,或者為什麼不生成整個程式,例如一個網頁應用程式? + +## 更實用的使用案例: 秘訣產生器 + +想像一下你在家裡有食材,並且你想做些料理。為此,你需要一個秘訣。一種找到秘訣的方法是使用搜尋引擎,或者你可以使用 LLM 來完成。 + +你可以這樣寫一個提示: + +> "給我 5 個使用以下食材的菜餚秘訣: 雞肉、馬鈴薯和胡蘿蔔。每個秘訣列出所有使用的食材" + +根據上述提示,你可能會得到類似的回應: + +```output +1. 烤雞和蔬菜: +材料: +- 4 塊雞腿 +- 2 個馬鈴薯,切成塊 +- 2 根胡蘿蔔,切成塊 +- 2 湯匙橄欖油 +- 2 瓣大蒜,切碎 +- 1 茶匙乾百里香 +- 1 茶匙乾牛至 +- 鹽和胡椒,適量 + +2. 雞肉和馬鈴薯燉菜: +材料: +- 2 湯匙橄欖油 +- 1 個洋蔥,切丁 +- 2 瓣大蒜,切碎 +- 2 塊雞胸肉,切成塊 +- 2 個馬鈴薯,切成塊 +- 2 根胡蘿蔔,切成塊 +- 1 茶匙乾牛至 +- 1 茶匙乾百里香 +- 1 杯雞湯 +- 鹽和胡椒,適量 + +3. 雞肉和馬鈴薯烤盤: +材料: +- 2 湯匙橄欖油 +- 2 塊雞胸肉,切成塊 +- 2 個馬鈴薯,切成塊 +- 2 根胡蘿蔔,切成塊 +- 1 個洋蔥,切丁 +- 2 瓣大蒜,切碎 +- 1 茶匙乾牛至 +- 1 茶匙乾百里香 +- 1 杯雞湯 +- 鹽和胡椒,適量 + +4. 雞肉和馬鈴薯湯: +材料: +- 2 湯匙橄欖油 +- 1 個洋蔥,切丁 +- 2 瓣大蒜,切碎 +- 2 塊雞胸肉,切成塊 +- 2 個馬鈴薯,切成塊 +- 2 根胡蘿蔔,切成塊 +- 1 茶匙乾牛至 +- 1 茶匙乾百里香 +- 4 杯雞湯 +- 鹽和胡椒,適量 + +5. 雞肉和馬鈴薯雜燴: +材料: +- 2 湯匙橄欖油 +- 2 塊雞胸肉,切成塊 +- 2 個馬鈴薯,切成塊 +- 2 根胡蘿蔔,切成塊 +- 1 個洋蔥,切丁 +- 2 瓣大蒜,切碎 +- 1 茶匙乾牛至 +``` + +這個結果很棒,我知道要煮什麼。此時,可能有用的改進是: + +- 過濾掉我不喜歡或過敏的食材。 +- 產生購物清單,以防我家裡沒有所有食材。 + +對於上述情況,讓我們添加一個額外的提示: + +> "請移除含有大蒜的秘訣,因為我對大蒜過敏,並用其他東西替代。另外,請為這些秘訣製作一個購物清單,考慮到我家裡已經有雞肉、馬鈴薯和胡蘿蔔。" + +現在你有一個新結果,即: + +```output +1. 烤雞和蔬菜: +食材: +- 4 隻雞腿 +- 2 個馬鈴薯,切成塊 +- 2 根胡蘿蔔,切成塊 +- 2 湯匙橄欖油 +- 1 茶匙乾百里香 +- 1 茶匙乾牛至 +- 鹽和胡椒,適量 + +2. 雞肉和馬鈴薯燉菜: +食材: +- 2 湯匙橄欖油 +- 1 個洋蔥,切丁 +- 2 塊雞胸肉,切成塊 +- 2 個馬鈴薯,切成塊 +- 2 根胡蘿蔔,切成塊 +- 1 茶匙乾牛至 +- 1 茶匙乾百里香 +- 1 杯雞湯 +- 鹽和胡椒,適量 + +3. 雞肉和馬鈴薯烤盤: +食材: +- 2 湯匙橄欖油 +- 2 塊雞胸肉,切成塊 +- 2 個馬鈴薯,切成塊 +- 2 根胡蘿蔔,切成塊 +- 1 個洋蔥,切丁 +- 1 茶匙乾牛至 +- 1 茶匙乾百里香 +- 1 杯雞湯 +- 鹽和胡椒,適量 + +4. 雞肉和馬鈴薯湯: +食材: +- 2 湯匙橄欖油 +- 1 個洋蔥,切丁 +- 2 塊雞胸肉,切成塊 +- 2 個馬鈴薯,切成塊 +- 2 根胡蘿蔔,切成塊 +- 1 茶匙乾牛至 +- 1 茶匙乾百里香 +- 4 杯雞湯 +- 鹽和胡椒,適量 + +5. 雞肉和馬鈴薯雜燴: +食材: +- 2 湯匙橄欖油 +- 2 塊雞胸肉,切成塊 +- 2 個馬鈴薯,切成塊 +- 2 根胡蘿蔔,切成塊 +- 1 個洋蔥,切丁 +- 1 茶匙乾牛至 + +購物清單: +- 橄欖油 +- 洋蔥 +- 百里香 +- 牛至 +- 鹽 +- 胡椒 +``` + +這就是你的五個秘訣,沒有提到大蒜,並且你還有一個購物清單,考慮到你家裡已經有的東西。 + +## 練習 - 建構一個秘訣產生器 + +現在我們已經演示了一個場景,讓我們寫程式碼來匹配演示的場景。要做到這一點,請按照以下步驟操作: + +1. 使用現有的 _app.py_ 文件作為起點 +1. 找到 `prompt` 變數並將其程式碼更改為以下內容: + + ```python + prompt = "Show me 5 recipes for a dish with the following ingredients: chicken, potatoes, and carrots. Per recipe, list all the ingredients used" + ``` + + 如果你現在執行程式碼,你應該會看到類似以下的輸出: + + ```output + -Chicken Stew with Potatoes and Carrots: 3 tablespoons oil, 1 onion, chopped, 2 cloves garlic, minced, 1 carrot, peeled and chopped, 1 potato, peeled and chopped, 1 bay leaf, 1 thyme sprig, 1/2 teaspoon salt, 1/4 teaspoon black pepper, 1 1/2 cups chicken broth, 1/2 cup dry white wine, 2 tablespoons chopped fresh parsley, 2 tablespoons unsalted butter, 1 1/2 pounds boneless, skinless chicken thighs, cut into 1-inch pieces + -Oven-Roasted Chicken with Potatoes and Carrots: 3 tablespoons extra-virgin olive oil, 1 tablespoon Dijon mustard, 1 tablespoon chopped fresh rosemary, 1 tablespoon chopped fresh thyme, 4 cloves garlic, minced, 1 1/2 pounds small red potatoes, quartered, 1 1/2 pounds carrots, quartered lengthwise, 1/2 teaspoon salt, 1/4 teaspoon black pepper, 1 (4-pound) whole chicken + -Chicken, Potato, and Carrot Casserole: cooking spray, 1 large onion, chopped, 2 cloves garlic, minced, 1 carrot, peeled and shredded, 1 potato, peeled and shredded, 1/2 teaspoon dried thyme leaves, 1/4 teaspoon salt, 1/4 teaspoon black pepper, 2 cups fat-free, low-sodium chicken broth, 1 cup frozen peas, 1/4 cup all-purpose flour, 1 cup 2% reduced-fat milk, 1/4 cup grated Parmesan cheese + + -One Pot Chicken and Potato Dinner: 2 tablespoons olive oil, 1 pound boneless, skinless chicken thighs, cut into 1-inch pieces, 1 large onion, chopped, 3 cloves garlic, minced, 1 carrot, peeled and chopped, 1 potato, peeled and chopped, 1 bay leaf, 1 thyme sprig, 1/2 teaspoon salt, 1/4 teaspoon black pepper, 2 cups chicken broth, 1/2 cup dry white wine + + -Chicken, Potato, and Carrot Curry: 1 tablespoon vegetable oil, 1 large onion, chopped, 2 cloves garlic, minced, 1 carrot, peeled and chopped, 1 potato, peeled and chopped, 1 teaspoon ground coriander, 1 teaspoon ground cumin, 1/2 teaspoon ground turmeric, 1/2 teaspoon ground ginger, 1/4 teaspoon cayenne pepper, 2 cups chicken broth, 1/2 cup dry white wine, 1 (15-ounce) can chickpeas, drained and rinsed, 1/2 cup raisins, 1/2 cup chopped fresh cilantro + ``` + + > 注意,你的 LLM 是非確定性的,所以每次執行程式時可能會得到不同的結果。 + + 很好,讓我們看看如何改進。為了改進,我們希望確保程式碼是靈活的,以便可以改進和更改食材和食譜數量。 + +1. 讓我們以以下方式更改程式碼: + + ```python + no_recipes = input("No of recipes (for example, 5: ") + + ingredients = input("List of ingredients (for example, chicken, potatoes, and carrots: ") + + # interpolate the number of recipes into the prompt an ingredients + prompt = f"Show me {no_recipes} recipes for a dish with the following ingredients: {ingredients}. Per recipe, list all the ingredients used" + ``` + + 測試執行程式碼,可能看起來像這樣: + + ```output + No of recipes (for example, 5: 3 + List of ingredients (for example, chicken, potatoes, and carrots: milk,strawberries + + -Strawberry milk shake: milk, strawberries, sugar, vanilla extract, ice cubes + -Strawberry shortcake: milk, flour, baking powder, sugar, salt, unsalted butter, strawberries, whipped cream + -Strawberry milk: milk, strawberries, sugar, vanilla extract + ``` + +### 改進:新增篩選和購物清單 + +我們現在有一個可運作的應用程式,能夠產生秘訣,並且它很靈活,因為它依賴於使用者的輸入,不僅是秘訣的數量,還有使用的成分。 + +為了進一步改進它,我們想添加以下內容: + +- **篩選食材**。我們希望能夠篩選出我們不喜歡或過敏的食材。為了完成這個變更,我們可以編輯現有的提示,並在其末尾添加一個篩選條件,如下所示: + + ```python + filter = input("篩選(例如,素食,純素,或無麩質: ") + + prompt = f"給我{no_recipes}道菜的食譜,包含以下食材: {ingredients}。每個食譜列出所有使用的食材,不包含{filter}" + ``` + + 上述程式碼中,我們在提示的末尾添加了`{filter}`,並且從用戶那裡獲取篩選值。 + + 現在,執行程式的範例輸入可以如下所示: + + ```output + 食譜數量(例如,5: 3 + 食材列表(例如,雞肉,馬鈴薯和胡蘿蔔: 洋蔥,牛奶 + 篩選(例如,素食,純素,或無麩質: 不含牛奶 + + 1. 法式洋蔥湯 + + 食材: + + -1個大洋蔥,切片 + -3杯牛肉湯 + -1杯牛奶 + -6片法國麵包 + -1/4杯磨碎的帕瑪森起司 + -1湯匙黃油 + -1茶匙乾百里香 + -1/4茶匙鹽 + -1/4茶匙黑胡椒 + + 做法: + + 1. 在大鍋中,用黃油將洋蔥炒至金黃色。 + 2. 加入牛肉湯、牛奶、百里香、鹽和胡椒。煮沸。 + 3. 降低火候,煮10分鐘。 + 4. 將法國麵包片放在湯碗中。 + 5. 將湯舀在麵包上。 + 6. 撒上帕瑪森起司。 + + 2. 洋蔥和馬鈴薯湯 + + 食材: + + -1個大洋蔥,切碎 + -2杯馬鈴薯,切丁 + -3杯蔬菜湯 + -1杯牛奶 + -1/4茶匙黑胡椒 + + 做法: + + 1. 在大鍋中,用黃油將洋蔥炒至金黃色。 + 2. 加入馬鈴薯、蔬菜湯、牛奶和胡椒。煮沸。 + 3. 降低火候,煮10分鐘。 + 4. 熱食。 + + 3. 奶油洋蔥湯 + + 食材: + + -1個大洋蔥,切碎 + -3杯蔬菜湯 + -1杯牛奶 + -1/4茶匙黑胡椒 + -1/4杯通用麵粉 + -1/2杯磨碎的帕瑪森起司 + + 做法: + + 1. 在大鍋中,用黃油將洋蔥炒至金黃色。 + 2. 加入蔬菜湯、牛奶和胡椒。煮沸。 + 3. 降低火候,煮10分鐘。 + 4. 在小碗中,將麵粉和帕瑪森起司攪拌均勻,直到光滑。 + 5. 加入湯中,繼續煮5分鐘,或直到湯變稠。 + ``` + + 如你所見,任何含有牛奶的食譜都被篩選掉了。但是,如果你對乳糖不耐,你可能還想篩選掉含有起司的食譜,因此需要明確說明。 + +- **生成購物清單**。我們希望生成購物清單,考慮到我們家裡已經有的食材。 + + 對於這個功能,我們可以嘗試在一個提示中解決所有問題,或者我們可以將其分成兩個提示。讓我們嘗試後者的方法。這裡我們建議添加一個額外的提示,但為了使其工作,我們需要將前一個提示的結果作為上下文添加到後一個提示中。 + + 找到程式碼中打印出第一個提示結果的部分,並在其下方添加以下程式碼: + + ```python + old_prompt_result = completion.choices[0].message.content + prompt = "為生成的食譜生成購物清單,請不要包括我已經有的食材。" + + new_prompt = f"{old_prompt_result} {prompt}" + messages = [{"role": "user", "content": new_prompt}] + completion = openai.Completion.create(engine=deployment_name, messages=messages, max_tokens=1200) + + # 打印回應 + print("購物清單:") + print(completion.choices[0].message.content) + ``` + + 注意以下幾點: + + 1. 我們通過將第一個提示的結果添加到新提示中來構建一個新提示: + + ```python + new_prompt = f"{old_prompt_result} {prompt}" + ``` + + 1. 我們發出一個新請求,但也考慮到我們在第一個提示中請求的 token 數量,所以這次我們說 `max_tokens` 是1200。 + + ```python + completion = openai.Completion.create(engine=deployment_name, prompt=new_prompt, max_tokens=1200) + ``` + + 試用這段程式碼,我們現在得到以下輸出: + + ```output + 食譜數量(例如,5: 2 + 食材列表(例如,雞肉,馬鈴薯和胡蘿蔔: 蘋果,麵粉 + 篩選(例如,素食,純素,或無麩質: 糖 + + + -蘋果和麵粉煎餅: 1杯麵粉,1/2茶匙泡打粉,1/2茶匙小蘇打,1/4茶匙鹽,1湯匙糖,1個雞蛋,1杯酪乳或酸奶,1/4杯融化的黃油,1個格蘭尼史密斯蘋果,去皮並磨碎 + -蘋果油炸圈餅: 1-1/2杯麵粉,1茶匙泡打粉,1/4茶匙鹽,1/4茶匙小蘇打,1/4茶匙肉豆蔻,1/4茶匙肉桂,1/4茶匙五香粉,1/4杯糖,1/4杯植物油,1/4杯牛奶,1個雞蛋,2杯磨碎的去皮蘋果 + 購物清單: + -麵粉,泡打粉,小蘇打,鹽,糖,雞蛋,酪乳,黃油,蘋果,肉豆蔻,肉桂,五香粉 + ``` + +## 改善你的設定 + +我們目前擁有的是可以運作的程式碼, 但我們應該做一些調整來進一步改進。一些我們應該做的事情是: + +- **將秘密從程式碼中分離**,例如 API 金鑰。秘密不應該存在於程式碼中,應該儲存在安全的位置。要將秘密從程式碼中分離,我們可以使用環境變數和像 `python-dotenv` 這樣的函式庫從文件中載入它們。以下是程式碼中的做法: + + 1. 建立一個 `.env` 文件,內容如下: + + ```bash + OPENAI_API_KEY=sk-... + ``` + + > 注意,對於 Azure,你需要設定以下環境變數: + + ```bash + OPENAI_API_TYPE=azure + OPENAI_API_VERSION=2023-05-15 + OPENAI_API_BASE= + ``` + + 在程式碼中,你可以這樣載入環境變數: + + ```python + from dotenv import load_dotenv + + load_dotenv() + + openai.api_key = os.environ["OPENAI_API_KEY"] + ``` + +- **關於 token 長度的一句話**。我們應該考慮需要多少 token 來生成我們想要的文本。token 是要花錢的,所以在可能的情況下,我們應該嘗試節省使用的 token 數量。例如,我們能否調整提示語句以使用更少的 token? + + 要更改使用的 token 數量,你可以使用 `max_tokens` 參數。例如,如果你想使用 100 個 token,你可以這樣做: + + ```python + completion = client.chat.completions.create(model=deployment, messages=messages, max_tokens=100) + ``` + +- **嘗試調整 temperature**。temperature 是我們到目前為止還沒有提到的,但它對我們程式的表現有重要影響。temperature 值越高,輸出就越隨機。相反,temperature 值越低,輸出就越可預測。考慮你是否希望輸出有變化。 + + 要改變 temperature,你可以使用 `temperature` 參數。例如,如果你想使用 0.5 的 temperature,你可以這樣做: + + ```python + completion = client.chat.completions.create(model=deployment, messages=messages, temperature=0.5) + ``` + + > 注意,越接近 1.0,輸出越多樣化。 + +## 作業 + +在這個作業中,你可以選擇要建構什麼。 + +以下是一些建議: + +- 調整秘訣產生器應用程式以進一步改進。嘗試不同的溫度值和提示,看看你能想出什麼。 +- 建立一個「學習夥伴」。這個應用程式應該能夠回答關於某個主題的問題,例如 Python,你可以有類似「Python 中的某個主題是什麼?」的提示,或者你可以有一個提示說,顯示某個主題的程式碼等。 +- 歷史機器人,讓歷史重現,指示機器人扮演某個歷史人物,並詢問它關於其生活和時代的問題。 + +## 解決方案 + +### 學習夥伴 + +以下是一個入門提示,看看你如何使用它並根據自己的喜好進行調整。 + +```text +- "你是 Python 語言的專家 + + 建議一個適合初學者的 Python 課程,格式如下: + + 格式: + - 概念: + - 課程簡要說明: + - 帶解答的程式碼練習" +``` + +### 歷史機器人 + +以下是一些你可以使用的提示: + +```text +- "你是 Abe Lincoln,用三句話告訴我你自己,並使用 Abe 會使用的語法和詞彙來回答" +- "你是 Abe Lincoln,使用 Abe 會使用的語法和詞彙來回答: + + 用 300 字告訴我你最大的成就" +``` + +## 知識檢查 + +概念溫度是做什麼的? + +1. 它控制輸出的隨機程度。 +1. 它控制回應的大小。 +1. 它控制使用的標記數量。 + +## 🚀 挑戰 + +在完成作業時,嘗試變更溫度,嘗試將其設為 0、0.5 和 1。記住,0 是變化最小的,1 是變化最大的,哪個值最適合你的應用程式? + +## 很棒的工作!繼續學習 + +完成本課程後,請查看我們的[生成式 AI 學習集合](https://aka.ms/genai-collection?WT.mc_id=academic-105485-koreyst)以繼續提升您的生成式 AI 知識! + +前往第7課,我們將探討如何[建構聊天應用程式](../../../07-building-chat-applications/translations/tw/README.md?WT.mc_id=academic-105485-koreyst)! + diff --git a/07-building-chat-applications/translations/tw/README.md b/07-building-chat-applications/translations/tw/README.md new file mode 100644 index 000000000..5052434aa --- /dev/null +++ b/07-building-chat-applications/translations/tw/README.md @@ -0,0 +1,185 @@ +# 建構生成式 AI 驅動的聊天應用程式 + +[![建構生成式 AI 驅動的聊天應用程式](../../images/07-lesson-banner.png?WT.mc_id=academic-105485-koreyst)](https://aka.ms/gen-ai-lessons7-gh?WT.mc_id=academic-105485-koreyst) + +> _(點擊上方圖片以觀看本課的影片)_ + +現在我們已經了解如何建構文字生成應用程式,讓我們來看看聊天應用程式。 + +聊天應用程式已經融入我們的日常生活,不僅僅是提供隨意交談的方式。它們是客戶服務、技術支援,甚至是複雜諮詢系統的不可或缺部分。不久前你可能就從聊天應用程式中獲得了一些幫助。隨著我們將生成式 AI 等更先進的技術整合到這些平台中,複雜性增加了,挑戰也隨之增加。 + +一些我們需要回答的問題是: + +- **建構應用程式**. 我們如何有效地建構並無縫整合這些 AI 驅動的應用程式以滿足特定的使用案例? +- **監控**. 部署後,我們如何監控並確保應用程式在功能和遵循[負責任 AI 的六項原則](https://www.microsoft.com/ai/responsible-ai?WT.mc_id=academic-105485-koreyst)方面都能達到最高品質? + +隨著我們進一步進入由自動化和無縫人機互動定義的時代,了解生成式 AI 如何改變聊天應用程式的範圍、深度和適應性變得至關重要。本課程將探討支持這些複雜系統的架構方面,深入研究為特定領域任務微調它們的方法,並評估確保負責任 AI 部署相關的指標和考量。 + +## 簡介 + +本課程涵蓋: + +- 高效建構和整合聊天應用程式的技術。 +- 如何應用自訂和微調到應用程式。 +- 有效監控聊天應用程式的策略和考量。 + +## 學習目標 + +在這節課結束時,你將能夠: + +- 描述將聊天應用程式建構並整合到現有系統中的考量因素。 +- 自訂聊天應用程式以適應特定使用案例。 +- 確認關鍵指標和考量因素,以有效監控並維持 AI 驅動的聊天應用程式的品質。 +- 確保聊天應用程式負責任地利用 AI。 + +## 將生成式 AI 整合到聊天應用程式中 + +提升聊天應用程式透過生成式 AI 不僅僅是讓它們變得更智能;還在於最佳化它們的架構、性能和使用者介面,以提供高品質的使用者體驗。這涉及調查架構基礎、API 整合和使用者介面考量。本節旨在為您提供一個全面的路線圖,以便在這些複雜的領域中導航,無論您是將它們插入現有系統還是將它們建構為獨立平台。 + +到本節結束時,您將具備有效建構和整合聊天應用程式所需的專業知識。 + +### 聊天機器人或聊天應用程式? + +在我們深入建構聊天應用程式之前,讓我們比較一下「聊天機器人」和「AI 驅動的聊天應用程式」,它們具有不同的角色和功能。聊天機器人的主要目的是自動化特定的對話任務,例如回答常見問題或追蹤套件。它通常由基於規則的邏輯或複雜的 AI 演算法控制。相比之下,AI 驅動的聊天應用程式是一個更為廣泛的環境,旨在促進各種形式的數位通信,例如文字、語音和影片聊天。其定義特徵是整合了一個生成式 AI 模型,模擬細緻入微的類人對話,根據各種輸入和上下文線索生成回應。生成式 AI 驅動的聊天應用程式可以參與開放領域的討論,適應不斷變化的對話上下文,甚至產生創意或複雜的對話。 + +下表概述了關鍵差異和相似之處,以幫助我們了解它們在數位通信中的獨特角色。 + +| 聊天機器人 | 生成式 AI 驅動的聊天應用程式 | +| ------------------------------------- | -------------------------------------- | +| 任務導向和基於規則 | 情境感知 | +| 通常整合到更大的系統中 | 可以承載一個或多個聊天機器人 | +| 限於程式化的功能 | 包含生成式 AI 模型 | +| 專門且結構化的互動 | 能夠進行開放領域的討論 | + +### 利用 SDK 和 API 的內建功能 + +在建構聊天應用程式時,一個很好的第一步是評估現有的資源。使用 SDK 和 API 來建構聊天應用程式是一種有利的策略,原因有很多。通過整合文件完善的 SDK 和 API,你正在策略性地為你的應用程式定位長期成功,解決延展性和維護問題。 + +- **加速開發過程並減少開銷**: 依賴預建的功能而不是自行建構昂貴的過程,讓你可以專注於應用程式的其他方面,例如商業邏輯。 +- **更好的性能**: 當從頭開始建構功能時,你最終會問自己「它如何延展?這個應用程式能夠處理突然湧入的使用者嗎?」良好維護的 SDK 和 API 通常內建了這些問題的解決方案。 +- **更容易維護**: 更新和改進更容易管理,因為大多數 API 和 SDK 只需在新版本發布時更新函式庫。 +- **接觸尖端技術**: 利用經過微調和訓練的大量數據集的模型,為你的應用程式提供自然語言能力。 + +存取 SDK 或 API 的功能通常涉及獲取使用所提供服務的許可,這通常是通過使用唯一的金鑰或身份驗證令牌來實現的。我們將使用 OpenAI Python 函式庫來探索這看起來是什麼樣子的。你也可以在以下的 [OpenAI 筆記本](../../python/oai-assignment.ipynb?WT.mc_id=academic-105485-koreyst) 或 [Azure OpenAI Services 筆記本](../../python/aoai-assignment.ipynb?WT.mc_id=academic-105485-koreys) 中自行嘗試這一課程。 + +```python +import os +from openai import OpenAI + +API_KEY = os.getenv("OPENAI_API_KEY","") + +client = OpenAI( + api_key=API_KEY + ) + +chat_completion = client.chat.completions.create(model="gpt-3.5-turbo", messages=[{"role": "user", "content": "為生成式 AI 的聊天應用程式建議兩個教學課程標題。"}]) +``` + +上述範例使用 GPT-3.5 Turbo 模型來完成提示,但請注意在此之前已設定 API 金鑰。如果未設定金鑰,您將收到錯誤。 + +## 使用者體驗 (UX) + +一般的使用者體驗原則適用於聊天應用程式,但由於涉及機器學習元件,這裡有一些額外的考量變得特別重要。 + +- **解決歧義的機制**: 生成式 AI 模型偶爾會生成模糊的答案。允許用戶要求澄清的功能在遇到這個問題時會很有幫助。 +- **上下文保留**: 高級生成式 AI 模型具有記住對話上下文的能力,這對用戶體驗來說是必要的資產。讓用戶能夠控制和管理上下文可以改善用戶體驗,但也引入了保留敏感用戶資訊的風險。對於這些資訊存儲多長時間的考量,例如引入保留政策,可以在上下文需求與隱私之間取得平衡。 +- **個性化**: 具有學習和適應能力的 AI 模型為用戶提供了個性化的體驗。通過用戶檔案等功能定制用戶體驗,不僅讓用戶感到被理解,還有助於他們尋找特定答案,創造更高效和滿意的互動。 + +例如在 OpenAI 的 ChatGPT 中的"自訂指示"設定就是一個這樣的個人化範例。它允許你提供關於你自己的資訊,這些資訊可能是你的提示的重要背景。這裡是一個自訂指示的範例。 + +![Custom Instructions Settings in ChatGPT](../../images/custom-instructions.png?WT.mc_id=academic-105485-koreyst) + +這個「設定檔」提示ChatGPT建立一個關於鏈結串列的課程計劃。請注意,ChatGPT會考慮到使用者可能基於她的經驗需要更深入的課程計劃。 + +![在ChatGPT中關於鏈結串列課程計劃的提示](../../images/lesson-plan-prompt.png?WT.mc_id=academic-105485-koreyst) + +### 微軟的大型語言模型系統訊息框架 + +[Microsoft has provided guidance](https://learn.microsoft.com/azure/ai-services/openai/concepts/system-message#define-the-models-output-format?WT.mc_id=academic-105485-koreyst) for writing effective system messages when generating responses from LLMs broken down into 4 areas: + +1. 定義模型的目標對象,以及其能力和限制。 +2. 定義模型的輸出格式。 +3. 提供展示模型預期行為的具體範例。 +4. 提供額外的行為防護措施。 + +### 無障礙性 + +無論使用者是否有視覺、聽覺、運動或認知障礙,一個設計良好的聊天應用程式應該對所有人都可用。以下列表分解了旨在提高各種使用者障礙可及性的特定功能。 + +- **視障功能**: 高對比主題和可調整大小的文字,螢幕閱讀器相容性。 +- **聽障功能**: 文字轉語音和語音轉文字函式,音訊通知的視覺提示。 +- **肢體障礙功能**: 鍵盤導航支援,語音命令。 +- **認知障礙功能**: 簡化語言選項。 + +## 自訂和微調領域特定語言模型 + +想像一個聊天應用程式,它能理解你公司的行話並預測其用戶群常見的特定查詢。有幾種方法值得一提: + +- **利用DSL模型**。DSL代表領域專用語言。您可以利用在特定領域訓練的所謂DSL模型來理解其概念和情境。 +- **應用微調**。微調是使用特定資料進一步訓練模型的過程。 + +## 自訂: 使用 DSL + +利用領域專用語言模型(DSL Models)可以通過提供專業的、上下文相關的互動來增強用戶參與度。這是一種訓練或微調以理解和生成與特定領域、行業或主題相關文本的模型。使用DSL模型的選項可以從從頭開始訓練一個,到通過SDK和API使用現有的模型。另一個選項是微調,這涉及採用現有的預訓練模型並將其調整為特定領域。 + +## 自訂: 套用微調 + +微調通常在預訓練模型在專門領域或特定任務中表現不佳時考慮。 + +例如,醫療查詢非常複雜,需要大量的上下文。當醫療專業人員診斷患者時,會基於多種因素,如生活方式或既存病況,甚至可能依賴最近的醫學期刊來驗證其診斷。在這種細微的情況下,通用的 AI 聊天應用程式不能成為可靠的來源。 + +### 情境: 一個醫療應用程序 + +考慮一個聊天應用程式,旨在通過提供治療指南、藥物相互作用或最新研究結果的快速參考來協助醫療從業人員。 + +一個通用模型可能足以回答基本的醫療問題或提供一般建議,但可能在以下方面存在困難: + +- **高度特定或複雜的案例**。例如,神經科醫生可能會問應用程式:「目前管理兒童患者藥物抗性癲癇的最佳做法是什麼?」 +- **缺乏最新進展**。通用模型可能難以提供包含神經學和藥理學最新進展的當前答案。 + +在這些情況下,使用專門的醫療數據集對模型進行微調可以顯著提高其更準確和可靠地處理這些複雜醫療問題的能力。這需要訪問大量且相關的數據集,這些數據集代表了需要解決的特定領域挑戰和問題。 + +## 高品質 AI 驅動聊天體驗的考量因素 + +本節概述了「高品質」聊天應用程式的標準,包括捕捉可操作的指標和遵循負責任地利用 AI 技術的框架。 + +### 關鍵指標 + +為了維持應用程式的高品質效能,追蹤關鍵指標和考量因素是必不可少的。這些測量不僅確保應用程式的功能性,還評估 AI 模型和使用者體驗的品質。以下是一份涵蓋基本、AI 和使用者體驗指標的清單,供參考。 + +| Metric | Definition | Considerations for Chat Developer | +| ----------------------------- | ---------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------- | +| **Uptime** | 測量應用程式運行和用戶可訪問的時間。 | 你將如何最大限度地減少停機時間? | +| **Response Time** | 應用程式回應用戶查詢所需的時間。 | 你如何優化查詢處理以改善回應時間? | +| **Precision** | 真陽性預測數量與總陽性預測數量的比率。 | 你將如何驗證模型的精確度? | +| **Recall (Sensitivity)** | 真陽性預測數量與實際陽性數量的比率。 | 你將如何測量和改善召回率? | +| **F1 Score** | 精確度和召回率的調和平均數,平衡兩者之間的權衡。 | 你的目標 F1 Score 是什麼?你將如何平衡精確度和召回率? | +| **Perplexity** | 測量模型預測的概率分佈與實際數據分佈的對齊程度。 | 你將如何減少困惑度? | +| **User Satisfaction Metrics** | 測量用戶對應用程式的感知。通常通過調查收集。 | 你將多頻繁地收集用戶反饋?你將如何根據反饋進行調整? | +| **Error Rate** | 模型在理解或輸出時犯錯的比率。 | 你有什麼策略來減少錯誤率? | +| **Retraining Cycles** | 模型更新以納入新數據和見解的頻率。 | 你將多頻繁地重新訓練模型?什麼會觸發重新訓練週期? | +| **Anomaly Detection** | 用於識別不符合預期行為的異常模式的工具和技術。 | 你將如何應對異常? | + +### 在聊天應用程式中實現負責任的 AI 實踐 + +Microsoft 的負責任 AI 方法已經確立了六項應該指導 AI 開發和使用的原則。以下是這些原則、它們的定義以及聊天開發者應該考慮的事項和為什麼他們應該認真對待這些事項。 + +| 原則 | 微軟的定義 | 聊天應用程式開發者的考量 | 為什麼這很重要 | +| ---------------------- | ----------------------------------------------------- | ---------------------------------------------------------------------- | -------------------------------------------------------------------------------------- | +| 公平性 | AI 系統應該公平對待所有人。 | 確保聊天應用程式不會基於用戶資料進行歧視。 | 建立用戶之間的信任和包容性;避免法律後果。 | +| 可靠性和安全性 | AI 系統應該可靠且安全地運行。 | 實施測試和故障保護以最小化錯誤和風險。 | 確保用戶滿意度並防止潛在的傷害。 | +| 隱私和安全 | AI 系統應該是安全的並尊重隱私。 | 實施強加密和資料保護措施。 | 保護敏感用戶資料並遵守隱私法規。 | +| 包容性 | AI 系統應該賦予每個人權力並讓人們參與。 | 設計對多元觀眾可訪問且易於使用的 UI/UX。 | 確保更廣泛的人群能有效使用應用程式。 | +| 透明性 | AI 系統應該是可理解的。 | 提供清晰的文件和 AI 回應的理由。 | 用戶更可能信任一個他們能理解決策過程的系統。 | +| 問責性 | 人們應該對 AI 系統負責。 | 建立明確的審計和改進 AI 決策的過程。 | 在出錯時能夠持續改進和採取糾正措施。 | + +## 作業 + +請參閱[assignment](../../python?WT.mc_id=academic-105485-koreyst)它將帶你完成一系列的練習,從執行你的第一個聊天提示,到分類和摘要文本等等。請注意,這些作業有不同的程式語言版本! + +## 很棒的工作!繼續這段旅程 + +完成本課程後,請查看我們的[生成式 AI 學習集合](https://aka.ms/genai-collection?WT.mc_id=academic-105485-koreyst)以繼續提升您的生成式 AI 知識! + +前往第8課,看看如何開始[建構搜尋應用程式](../../../08-building-search-applications/translations/tw/README.md?WT.mc_id=academic-105485-koreyst)! + diff --git a/08-building-search-applications/translations/tw/README.md b/08-building-search-applications/translations/tw/README.md new file mode 100644 index 000000000..7cddda6ac --- /dev/null +++ b/08-building-search-applications/translations/tw/README.md @@ -0,0 +1,164 @@ +# 建構搜尋應用程式 + +[![生成式 AI 和大型語言模型介紹](../../images/08-lesson-banner.png?WT.mc_id=academic-105485-koreyst)](https://aka.ms/gen-ai-lesson8-gh?WT.mc_id=academic-105485-koreyst) + +> > _點擊上方圖片觀看本課程的影片_ + +還有比聊天機器人和文本生成更多的LLMs。也可以使用嵌入來建構搜尋應用程式。嵌入是數據的數值表示,也稱為向量,可以用於數據的語義搜尋。 + +在本課程中,你將為我們的教育新創公司建構一個搜尋應用程式。我們的新創公司是一個非營利組織,為發展中國家的學生提供免費教育。我們的新創公司擁有大量的 YouTube 影片,學生可以用來學習 AI。我們的新創公司希望建構一個搜尋應用程式,讓學生可以通過輸入問題來搜尋 YouTube 影片。 + +例如,學生可能會輸入「什麼是 Jupyter Notebooks?」或「什麼是 Azure ML」,然後搜尋應用程式會返回與問題相關的 YouTube 影片列表,更好的是,搜尋應用程式會返回影片中回答問題所在位置的連結。 + +## 簡介 + +在本課程中,我們將涵蓋: + +- 語義 vs 關鍵字搜尋。 +- 什麼是文本嵌入。 +- 建立文本嵌入索引。 +- 搜尋文本嵌入索引。 + +## 學習目標 + +完成本課程後,你將能夠: + +- 說明語義搜尋和關鍵字搜尋之間的區別。 +- 解釋什麼是文本嵌入。 +- 使用嵌入建立應用程式來搜尋資料。 + +## 為什麼要建構搜尋應用程式? + +建立搜尋應用程式將幫助你了解如何使用嵌入來搜尋資料。你還將學習如何建構一個學生可以用來快速找到資訊的搜尋應用程式。 + +這課程包括 Microsoft [AI Show](https://www.youtube.com/playlist?list=PLlrxD0HtieHi0mwteKBOfEeOYf0LJU4O1?WT.mc_id=academic-105485-koreyst) YouTube 頻道的 YouTube 文字記錄的嵌入索引。AI Show 是一個教你關於 AI 和機器學習的 YouTube 頻道。嵌入索引包含截至 2023 年 10 月的每個 YouTube 文字記錄的嵌入。你將使用嵌入索引為我們的初創公司建構一個搜尋應用程式。搜尋應用程式會返回一個連結,指向影片中回答問題的位置。這是一個讓學生快速找到所需資訊的好方法。 + +以下是一個針對問題「你可以將 rstudio 與 azure ml 一起使用嗎?」的語義查詢範例。查看 YouTube 連結, 你會看到連結包含一個時間戳記, 它會帶你到影片中回答問題的位置。 + +![語義查詢問題 "can you use rstudio with Azure ML"](../../images/query-results.png?WT.mc_id=academic-105485-koreyst) + +## 什麼是語義搜尋? + +現在你可能會想知道,什麼是語義搜尋?語義搜尋是一種搜尋技術,使用查詢中單詞的語義或意義來返回相關結果。 + +這裡是一個語義搜尋的範例。假設你正在尋找購買一輛車,你可能會搜尋「我的夢想車」,語義搜尋理解你不是在「夢想」一輛車,而是你正在尋找購買你的「理想」車。語義搜尋理解你的意圖並返回相關的結果。另一種方法是「關鍵字搜尋」,它會字面上搜尋關於車的夢想,並且經常返回不相關的結果。 + +## 什麼是文本嵌入? + +[文本嵌入](https://en.wikipedia.org/wiki/Word_embedding?WT.mc_id=academic-105485-koreyst) 是一種用於[自然語言處理](https://en.wikipedia.org/wiki/Natural_language_processing?WT.mc_id=academic-105485-koreyst)的文本表示技術。文本嵌入是文本的語義數值表示。嵌入用於以機器易於理解的方式表示數據。有許多建構文本嵌入的模型,在本課中,我們將重點放在使用 OpenAI 嵌入模型生成嵌入。 + +以下是一個範例,假設以下文字來自 AI Show YouTube 頻道其中一集的文字記錄: + +```text +今天我們要學習 Azure 機器學習。 +``` + +我們會將文字傳遞給 OpenAI Embedding API,它會返回由 1536 個數字組成的嵌入(即向量)。向量中的每個數字代表文字的不同方面。為了簡潔起見,以下是向量中的前 10 個數字。 + +```python +[-0.006655829958617687, 0.0026128944009542465, 0.008792596869170666, -0.02446001023054123, -0.008540431968867779, 0.022071078419685364, -0.010703742504119873, 0.003311325330287218, -0.011632772162556648, -0.02187200076878071, ...] +``` + +## 嵌入索引是如何建立的? + +這節課的嵌入索引是用一系列的 Python 腳本建立的。你可以在這節課的 'scripts' 資料夾中的 [README](../../scripts/README.md?WT.mc_id=academic-105485-koreyst) 找到這些腳本和說明。你不需要執行這些腳本來完成這節課,因為已經為你提供了嵌入索引。 + +腳本執行以下操作: + +1. 每個 YouTube 影片在 [AI Show](https://www.youtube.com/playlist?list=PLlrxD0HtieHi0mwteKBOfEeOYf0LJU4O1?WT.mc_id=academic-105485-koreyst) 播放清單中的逐字稿會被下載。 +2. 使用 [OpenAI 函式](https://learn.microsoft.com/azure/ai-services/openai/how-to/function-calling?WT.mc_id=academic-105485-koreyst),嘗試從 YouTube 逐字稿的前 3 分鐘中提取講者姓名。每個影片的講者姓名會儲存在名為 `embedding_index_3m.json` 的嵌入索引中。 +3. 然後將逐字稿文本分塊成 **3 分鐘文本片段**。每個片段包括大約 20 個與下一個片段重疊的單詞,以確保片段的嵌入不會被切斷,並提供更好的搜索上下文。 +4. 然後將每個文本片段傳遞給 OpenAI 聊天 API,將文本摘要為 60 個單詞。摘要也會儲存在嵌入索引 `embedding_index_3m.json` 中。 +5. 最後,將片段文本傳遞給 OpenAI 嵌入 API。嵌入 API 返回一個包含 1536 個數字的向量,代表該片段的語義意義。片段和 OpenAI 嵌入向量一起儲存在嵌入索引 `embedding_index_3m.json` 中。 + +### 向量資料庫 + +為了簡化課程,Embedding Index 被儲存在名為 `embedding_index_3m.json` 的 JSON 文件中,並加載到 Pandas DataFrame 中。然而,在生產環境中,Embedding Index 會被儲存在向量資料庫中,例如 [Azure Cognitive Search](https://learn.microsoft.com/training/modules/improve-search-results-vector-search?WT.mc_id=academic-105485-koreyst)、[Redis](https://cookbook.openai.com/examples/vector_databases/redis/readme?WT.mc_id=academic-105485-koreyst)、[Pinecone](https://cookbook.openai.com/examples/vector_databases/pinecone/readme?WT.mc_id=academic-105485-koreyst)、[Weaviate](https://cookbook.openai.com/examples/vector_databases/weaviate/readme?WT.mc_id=academic-105485-koreyst),僅舉幾例。 + +## 理解餘弦相似度 + +我們已經了解了文本嵌入,下一步是學習如何使用文本嵌入來搜索資料,特別是使用餘弦相似度找到與給定查詢最相似的嵌入。 + +### 什麼是餘弦相似度? + +餘弦相似度是衡量兩個向量之間相似度的一種方法,你也會聽到這被稱為`最近鄰搜尋`。要執行餘弦相似度搜尋,你需要使用 OpenAI 嵌入 API 對查詢文本進行_向量化_。然後計算查詢向量與嵌入索引中每個向量之間的_餘弦相似度_。請記住,嵌入索引對每個 YouTube 文字記錄片段都有一個向量。最後,按餘弦相似度對結果進行排序,餘弦相似度最高的文本片段與查詢最相似。 + +從數學的角度來看,餘弦相似度測量投射在多維空間中兩個向量之間的角度的餘弦值。這種測量是有益的,因為如果兩個文件由於大小而在歐幾里得距離上相距甚遠,它們之間仍然可能有較小的角度,因此具有較高的餘弦相似度。有關餘弦相似度方程的更多資訊,請參見[餘弦相似度](https://en.wikipedia.org/wiki/Cosine_similarity?WT.mc_id=academic-105485-koreyst)。 + +## 建構你的第一個搜尋應用程式 + +接下來,我們將學習如何使用 Embeddings 建構一個搜尋應用程式。該搜尋應用程式將允許學生通過輸入問題來搜尋影片。搜尋應用程式將返回與問題相關的影片列表。搜尋應用程式還將返回影片中回答問題的位置連結。 + +此解決方案是在 Windows 11、macOS 和 Ubuntu 22.04 上使用 Python 3.10 或更高版本建構和測試的。你可以從 [python.org](https://www.python.org/downloads/?WT.mc_id=academic-105485-koreyst) 下載 Python。 + +## 作業 - 建構搜尋應用程式,以便學生使用 + +我們在本課開始時介紹了我們的初創公司。現在是時候讓學生們建構一個搜尋應用程式來進行他們的評估。 + +在此作業中,你將建立 Azure OpenAI 服務來建構搜尋應用程式。你將建立以下的 Azure OpenAI 服務。你需要一個 Azure 訂閱來完成此作業。 + +### 啟動 Azure Cloud Shell + +1. 登入 [Azure 入口網站](https://portal.azure.com/?WT.mc_id=academic-105485-koreyst)。 +2. 選擇 Azure 入口網站右上角的 Cloud Shell 圖示。 +3. 選擇 **Bash** 作為環境類型。 + +#### 建立資源群組 + +> 對於這些指示,我們使用位於美國東部名為"semantic-video-search"的資源群組。 +> 你可以更改資源群組的名稱,但在更改資源的位置時, +> 請檢查[模型可用性表](https://aka.ms/oai/models?WT.mc_id=academic-105485-koreyst)。 + +```shell +az group create --name semantic-video-search --location eastus +``` + +#### 建立 Azure OpenAI Service 資源 + +從 Azure Cloud Shell 執行以下命令以建立 Azure OpenAI Service 資源。 + +```shell +az cognitiveservices account create --name semantic-video-openai --resource-group semantic-video-search \ + --location eastus --kind OpenAI --sku s0 +``` + +#### 取得此應用程式中使用的端點和金鑰 + +從 Azure Cloud Shell 執行以下命令以獲取 Azure OpenAI Service 資源的端點和金鑰。 + +```shell +az cognitiveservices account show --name semantic-video-openai \ + --resource-group semantic-video-search | jq -r .properties.endpoint +az cognitiveservices account keys list --name semantic-video-openai \ + --resource-group semantic-video-search | jq -r .key1 +``` + +#### 部署 OpenAI 嵌入模型 + +從 Azure Cloud Shell 執行以下命令來部署 OpenAI 嵌入模型。 + +```shell +az cognitiveservices account deployment create \ + --name semantic-video-openai \ + --resource-group semantic-video-search \ + --deployment-name text-embedding-ada-002 \ + --model-name text-embedding-ada-002 \ + --model-version "2" \ + --model-format OpenAI \ + --scale-settings-scale-type "Standard" +``` + +## 解決方案 + +打開 [解決方案筆記本](../../python/aoai-solution.ipynb?WT.mc_id=academic-105485-koreyst) 在 GitHub Codespaces 並按照 Jupyter Notebook 中的說明進行操作。 + +當你執行筆記本時,系統會提示你輸入查詢。輸入框看起來會像這樣: + +![使用者輸入查詢的輸入框](../../images/notebook-search.png?WT.mc_id=academic-105485-koreyst) + +## 很棒的工作!繼續學習 + +完成本課程後,請查看我們的[生成式 AI 學習集合](https://aka.ms/genai-collection?WT.mc_id=academic-105485-koreyst)以繼續提升您的生成式 AI 知識! + +前往第 9 課,我們將看看如何[建構影像生成應用程式](../../../09-building-image-applications/translations/tw/README.md?WT.mc_id=academic-105485-koreyst)! + diff --git a/09-building-image-applications/translations/tw/README.md b/09-building-image-applications/translations/tw/README.md new file mode 100644 index 000000000..3a64dff9e --- /dev/null +++ b/09-building-image-applications/translations/tw/README.md @@ -0,0 +1,466 @@ +# 建構影像生成應用程式 + +[![建構影像生成應用](../../images/09-lesson-banner.png?WT.mc_id=academic-105485-koreyst)](https://aka.ms/gen-ai-lesson9-gh?WT.mc_id=academic-105485-koreyst) + +在 LLMs 中,除了文字生成之外還有更多的應用。也可以從文字描述生成圖像。將圖像作為一種模態在許多領域中都非常有用,從醫療技術、建築、旅遊、遊戲開發等。在本章中,我們將探討兩個最受歡迎的圖像生成模型,DALL-E 和 Midjourney。 + +## 簡介 + +在本課程中,我們將涵蓋: + +- 圖像生成及其用途。 +- DALL-E 和 Midjourney,它們是什麼以及它們如何運作。 +- 如何建構一個圖像生成應用程式。 + +## 學習目標 + +完成本課程後,你將能夠: + +- 建立影像生成應用程式。 +- 使用 meta 提示為您的應用程式定義邊界。 +- 使用 DALL-E 和 Midjourney。 + +## 為什麼要建構一個圖像生成應用程式? + +圖像生成應用程式是一個探索生成式 AI 能力的好方法。它們可以用於,例如: + +- **圖片編輯和合成**。您可以為各種使用案例生成圖片,例如圖片編輯和圖片合成。 + +- **應用於多種行業**。它們還可以用於為醫療技術、旅遊業、遊戲開發等多種行業生成圖片。 + +## 情境: Edu4All + +在這節課中,我們將繼續與我們的初創公司Edu4All合作。學生們將為他們的評估創建圖像,具體創建什麼圖像由學生決定,但他們可以為自己的童話故事創作插圖,或者為他們的故事創建一個新角色,或幫助他們將自己的想法和概念具象化。 + +以下是 Edu4All 的學生在課堂上研究紀念碑時可能生成的範例: + +![Edu4All startup, 類別 on monuments, Eiffel Tower](../../images/startup.png?WT.mc_id=academic-105485-koreyst) + +使用提示語如 + +> "早晨陽光下埃菲爾鐵塔旁的狗" + +## 什麼是DALL-E和Midjourney? + +[DALL-E](https://openai.com/dall-e-2?WT.mc_id=academic-105485-koreyst) 和 [Midjourney](https://www.midjourney.com/?WT.mc_id=academic-105485-koreyst) 是兩個最受歡迎的圖像生成模型,它們允許你使用提示來生成圖像。 + +### DALL-E + +讓我們從 DALL-E 開始,這是一個生成式 AI 模型,可以從文字描述生成圖像。 + +> [DALL-E 是兩個模型的組合,CLIP 和擴散注意力](https://towardsdatascience.com/openais-dall-e-and-clip-101-a-brief-introduction-3a4367280d4e?WT.mc_id=academic-105485-koreyst)。 + +- **CLIP**,是一個從圖像和文本中生成數值資料表示(嵌入)的模型。 + +- **Diffused attention**,是一個從嵌入生成圖像的模型。DALL-E 是在圖像和文本數據集上訓練的,可以用來從文本描述生成圖像。例如,DALL-E 可以用來生成戴帽子的貓或有莫霍克髮型的狗的圖像。 + +### Midjourney + +Midjourney 的工作方式類似於 DALL-E,它從文本提示生成圖像。Midjourney 也可以用來生成圖像,使用像「戴帽子的貓」或「有莫霍克髮型的狗」這樣的提示。 + +![Image generated by Midjourney, mechanical pigeon](https://upload.wikimedia.org/wikipedia/commons/thumb/8/8c/Rupert_Breheny_mechanical_dove_eca144e7-476d-4976-821d-a49c408e4f36.png/440px-Rupert_Breheny_mechanical_dove_eca144e7-476d-4976-821d-a49c408e4f36.png?WT.mc_id=academic-105485-koreyst) +_圖片來源 Wikipedia, 圖片由 Midjourney 生成_ + +## DALL-E 和 Midjourney 如何運作 + +首先,[DALL-E](https://arxiv.org/pdf/2102.12092.pdf?WT.mc_id=academic-105485-koreyst)。DALL-E 是一個基於 transformer 架構的生成式 AI 模型,具有 _自回歸 transformer_。 + +一個_自回歸變壓器_定義了模型如何從文字描述生成圖像,它一次生成一個像素,然後使用生成的像素來生成下一個像素。通過神經網路的多層,直到圖像完成。 + +透過這個過程,DALL-E 控制圖像中生成的屬性、物件、特徵等。然而,DALL-E 2 和 3 對生成的圖像有更多的控制。 + +## 建構你的第一個圖像生成應用程式 + +那麼,建構一個影像生成應用程式需要什麼呢?你需要以下的函式庫: + +- **python-dotenv**,強烈建議您使用這個函式庫將您的秘密保存在 _.env_ 文件中,遠離程式碼。 +- **openai**,這個函式庫是您用來與 OpenAI API 互動的工具。 +- **pillow**,用於在 Python 中處理圖像。 +- **requests**,幫助您發出 HTTP 請求。 + +1. 建立一個名為 _.env_ 的檔案,內容如下: + + ```text + AZURE_OPENAI_ENDPOINT= + AZURE_OPENAI_KEY= + ``` + + 在 Azure Portal 中找到你的資源的 "Keys and Endpoint" 部分來定位這些資訊。 + +1. 將上述函式庫收集到一個名為 _requirements.txt_ 的檔案中,如下所示: + + ```text + python-dotenv + openai + pillow + requests + ``` + +1. 接下來,建立虛擬環境並安裝函式庫: + + ```bash + python3 -m venv venv + source venv/bin/activate + pip install -r requirements.txt + ``` + + 對於 Windows,使用以下命令來建立和啟動你的虛擬環境: + + ```bash + python3 -m venv venv + venv\Scripts\activate.bat + ``` + +1. 在名為 _app.py_ 的檔案中添加以下程式碼: + + ```python + import openai + import os + import requests + from PIL import Image + import dotenv + + # import dotenv + dotenv.load_dotenv() + + # 從環境變數中獲取 endpoint 和 key + openai.api_base = os.environ['AZURE_OPENAI_ENDPOINT'] + openai.api_key = os.environ['AZURE_OPENAI_KEY'] + + # 指定 API 版本 (DALL-E 目前僅支持 2023-06-01-preview API 版本) + openai.api_version = '2023-06-01-preview' + openai.api_type = 'azure' + + + try: + # 使用圖像生成 API 來建立圖像 + generation_response = openai.Image.create( + prompt='Bunny on horse, holding a lollipop, on a foggy meadow where it grows daffodils', # 在此輸入你的提示文字 + size='1024x1024', + n=2, + temperature=0, + ) + # 設定存儲圖像的目錄 + image_dir = os.path.join(os.curdir, 'images') + + # 如果目錄不存在,則建立它 + if not os.path.isdir(image_dir): + os.mkdir(image_dir) + + # 初始化圖像路徑 (注意檔案類型應為 png) + image_path = os.path.join(image_dir, 'generated-image.png') + + # 獲取生成的圖像 + image_url = generation_response["data"][0]["url"] # 從回應中提取圖像 URL + generated_image = requests.get(image_url).content # 下載圖像 + with open(image_path, "wb") as image_file: + image_file.write(generated_image) + + # 在預設的圖像查看器中顯示圖像 + image = Image.open(image_path) + image.show() + + # 捕捉異常 + except openai.error.InvalidRequestError as err: + print(err) + + ``` + +讓我們解釋這段程式碼: + +- 首先,我們匯入所需的函式庫,包括 OpenAI 函式庫、dotenv 函式庫、requests 函式庫和 Pillow 函式庫。 + + ```python + import openai + import os + import requests + from PIL import Image + import dotenv + ``` + +- 接下來,我們從 _.env_ 檔案中載入環境變數。 + + ```python + # import dotenv + dotenv.load_dotenv() + ``` + +- 之後,我們設定 OpenAI API 的端點、金鑰、版本和類型。 + + ```python + # Get endpoint and key from environment variables + openai.api_base = os.environ['AZURE_OPENAI_ENDPOINT'] + openai.api_key = os.environ['AZURE_OPENAI_KEY'] + + # add version and type, Azure specific + openai.api_version = '2023-06-01-preview' + openai.api_type = 'azure' + ``` + +- 接下來,我們生成圖像: + + ```python + # Create an image by using the image generation API + generation_response = openai.Image.create( + prompt='Bunny on horse, holding a lollipop, on a foggy meadow where it grows daffodils', # Enter your prompt text here + size='1024x1024', + n=2, + temperature=0, + ) + ``` + + 上述程式碼回應一個包含生成圖像 URL 的 JSON 物件。我們可以使用該 URL 下載圖像並將其儲存到檔案中。 + +- 最後,我們打開圖像並使用標準圖像檢視器顯示它: + + ```python + image = Image.open(image_path) + image.show() + ``` + +### 生成圖像的更多資訊 + +讓我們更詳細地看看產生影像的程式碼: + +```python +generation_response = openai.Image.create( + prompt='兔子在馬上,手拿棒棒糖,在長滿水仙花的霧氣草地上', # 在此輸入您的提示文字 + size='1024x1024', + n=2, + temperature=0, + ) +``` + +- **prompt**, 是用來生成圖像的文本提示。在這個例子中,我們使用的提示是 "Bunny on horse, holding a lollipop, on a foggy meadow where it grows daffodils"。 +- **size**, 是生成圖像的大小。在這個例子中,我們生成的圖像大小為 1024x1024 像素。 +- **n**, 是生成的圖像數量。在這個例子中,我們生成了兩張圖像。 +- **temperature**, 是控制生成式 AI 模型輸出隨機性的參數。temperature 是一個介於 0 和 1 之間的值,其中 0 表示輸出是確定性的,1 表示輸出是隨機的。預設值為 0.7。 + +在下一節中,我們將介紹更多可以對影像進行的操作。 + +## 影像生成的額外功能 + +你已經看到我們如何使用幾行 Python 程式碼生成圖像。然而,你還可以對圖像做更多事情。 + +您也可以執行以下操作: + +- **進行編輯**。通過提供現有圖像、遮罩和提示,您可以更改圖像。例如,您可以在圖像的一部分添加一些東西。想像一下我們的兔子圖像,您可以給兔子加上一頂帽子。您可以通過提供圖像、遮罩(識別需要更改的區域部分)和文本提示來說明應該做什麼。 + + ```python + response = openai.Image.create_edit( + image=open("base_image.png", "rb"), + mask=open("mask.png", "rb"), + prompt="An image of a rabbit with a hat on its head.", + n=1, + size="1024x1024" + ) + image_url = response['data'][0]['url'] + ``` + + 基本圖像只包含兔子,但最終圖像會在兔子上加上一頂帽子。 + +- **建立變體**。這個想法是您採用現有圖像並要求創建變體。要建立變體,您需要提供圖像和文本提示,程式碼如下: + + ```python + response = openai.Image.create_variation( + image=open("bunny-lollipop.png", "rb"), + n=1, + size="1024x1024" + ) + image_url = response['data'][0]['url'] + ``` + + > 注意,這僅在 OpenAI 上支持。 + +## 溫度 + +溫度是一個控制生成式 AI 模型輸出隨機性的參數。溫度是一個介於 0 和 1 之間的值,其中 0 表示輸出是確定性的,1 表示輸出是隨機的。預設值是 0.7。 + +讓我們透過執行這個提示兩次來看看溫度如何運作的範例: + +> 提示 : "騎在馬上的兔子,手持棒棒糖,在長滿水仙花的霧濛濛的草地上" + +![兔子騎在馬上拿著棒棒糖,版本 1](../../images/v1-generated-image.png?WT.mc_id=academic-105485-koreyst) + +現在讓我們執行相同的提示,只是看看我們不會得到相同的圖像兩次: + +![生成的兔子騎馬圖像](../../images/v2-generated-image.png?WT.mc_id=academic-105485-koreyst) + +正如你所見,這些圖片相似,但不完全相同。讓我們嘗試將溫度值改為 0.1,看看會發生什麼事: + +```python + generation_response = openai.Image.create( + prompt='騎在馬上的兔子,手拿棒棒糖,在長滿水仙花的霧霾草地上', # 在此輸入您的提示文字 + size='1024x1024', + n=2 + ) +``` + +### 改變溫度 + +所以讓我們嘗試使回應更加確定。我們可以從我們生成的兩張圖片中觀察到,在第一張圖片中,有一隻兔子,而在第二張圖片中,有一匹馬,所以圖片差異很大。 + +讓我們因此更改我們的程式碼並將溫度設置為 0,如下所示: + +```python +generation_response = openai.Image.create( + prompt='騎在馬上的兔子,手拿棒棒糖,在長滿水仙花的霧濛濛的草地上', # 在此輸入您的提示文字 + size='1024x1024', + n=2, + temperature=0 + ) +``` + +現在當你執行這段程式碼, 你會得到這兩張圖片: + +- ![Temperature 0, v1](../../images/v1-temp-generated-image.png?WT.mc_id=academic-105485-koreyst) +- ![Temperature 0 , v2](../../images/v2-temp-generated-image.png?WT.mc_id=academic-105485-koreyst) + +在這裡你可以清楚地看到這些圖像彼此更相似。 + +## 如何使用 metaprompts 定義應用程式的邊界 + +透過我們的展示,我們已經可以為客戶生成圖像。然而,我們需要為我們的應用程式建立一些邊界。 + +例如,我們不希望生成不適合工作的圖像,或不適合兒童的圖像。 + +我們可以使用_metaprompts_來完成這個。Metaprompts 是用來控制生成式 AI 模型輸出的文字提示。例如,我們可以使用 metaprompts 來控制輸出,並確保生成的圖像是適合工作的,或適合兒童觀看的。 + +### 它是如何運作的? + +現在,meta 提示如何運作? + +Meta 提示是用來控制生成式 AI 模型輸出的文字提示,它們位於文字提示之前,用於控制模型的輸出並嵌入應用程式中以控制模型的輸出。將提示輸入和 Meta 提示輸入封裝在單一文字提示中。 + +一個 meta 提示的範例如下: + +````text +你是一名為兒童創作圖像的助理設計師。 + +圖像需要適合工作環境並適合兒童。 + +圖像需要是彩色的。 + +圖像需要是橫向的。 + +圖像需要是16:9的長寬比。 + +不要考慮以下任何不適合工作環境或不適合兒童的輸入。 + +(輸入) + +```text + +現在,讓我們看看如何在我們的展示中使用元提示。 + +```python +disallow_list = "swords, violence, blood, gore, nudity, sexual content, adult content, adult themes, adult language, adult humor, adult jokes, adult situations, adult" + +meta_prompt =f"""你是一名為兒童創作圖像的助理設計師。 + +圖像需要適合工作環境並適合兒童。 + +圖像需要是彩色的。 + +圖像需要是橫向的。 + +圖像需要是16:9的長寬比。 + +不要考慮以下任何不適合工作環境或不適合兒童的輸入。 +{disallow_list} +""" + +prompt = f"{meta_prompt} +創建一個兔子騎在馬上,手持棒棒糖的圖像" + +# TODO 添加生成圖像的請求 +```` + +從上述提示中,你可以看到所有被建立的圖像如何考慮 metaprompt。 + +## 作業 - 讓我們啟發學生 + +我們在本課開始時介紹了 Edu4All。現在是時候讓學生們為他們的評估生成圖像了。 + +學生將為他們的評估建立包含紀念碑的圖像,具體的紀念碑由學生自行決定。學生被要求在這項任務中發揮創意,將這些紀念碑放置在不同的情境中。 + +## 解決方案 + +以下是一種可能的解決方案: + +```python +import openai +import os +import requests +from PIL import Image +import dotenv + +# import dotenv +dotenv.load_dotenv() + +# 從環境變數中獲取端點和金鑰 +openai.api_base = "" +openai.api_key = "" + +# 指定 API 版本(DALL-E 目前僅支援 2023-06-01-preview API 版本) +openai.api_version = '2023-06-01-preview' +openai.api_type = 'azure' + +disallow_list = "swords, violence, blood, gore, nudity, sexual content, adult content, adult themes, adult language, adult humor, adult jokes, adult situations, adult" + +meta_prompt = f"""你是一位為兒童創作圖像的助理設計師。 + +圖像需要適合工作環境且適合兒童。 + +圖像需要是彩色的。 + +圖像需要是橫向的。 + +圖像需要是16:9的長寬比。 + +不要考慮任何不適合工作環境或不適合兒童的輸入。 +{disallow_list}""" + +prompt = f"""{metaprompt} +生成巴黎凱旋門的紀念碑,在傍晚的光線下,一個小孩抱著泰迪熊看著。 +"""" + +try: + # 使用圖像生成 API 建立圖像 + generation_response = openai.Image.create( + prompt=prompt, # 在此輸入提示文字 + size='1024x1024', + n=2, + temperature=0, + ) + # 設定儲存圖像的目錄 + image_dir = os.path.join(os.curdir, 'images') + + # 如果目錄不存在,則建立它 + if not os.path.isdir(image_dir): + os.mkdir(image_dir) + + # 初始化圖像路徑(注意文件類型應為 png) + image_path = os.path.join(image_dir, 'generated-image.png') + + # 獲取生成的圖像 + image_url = generation_response["data"][0]["url"] # 從回應中提取圖像 URL + generated_image = requests.get(image_url).content # 下載圖像 + with open(image_path, "wb") as image_file: + image_file.write(generated_image) + + # 在默認圖像查看器中顯示圖像 + image = Image.open(image_path) + image.show() + +# 捕捉異常 +except openai.error.InvalidRequestError as err: + print(err) +``` + +## 很棒的工作!繼續學習 + +完成本課程後,請查看我們的[生成式 AI 學習集合](https://aka.ms/genai-collection?WT.mc_id=academic-105485-koreyst)以繼續提升您的生成式 AI 知識! + +前往第10課,我們將探討如何[建構低程式碼的AI應用程式](../../../10-building-low-code-ai-applications/translations/tw/README.md?WT.mc_id=academic-105485-koreyst) + diff --git a/10-building-low-code-ai-applications/translations/tw/README.md b/10-building-low-code-ai-applications/translations/tw/README.md new file mode 100644 index 000000000..07e2279bc --- /dev/null +++ b/10-building-low-code-ai-applications/translations/tw/README.md @@ -0,0 +1,245 @@ +# 建構低程式碼 AI 應用程式 + +[![建構低程式碼 AI 應用程式](../../images/10-lesson-banner.png?WT.mc_id=academic-105485-koreyst)](https://aka.ms/gen-ai-lesson10-gh?WT.mc_id=academic-105485-koreyst) + +> _(點擊上方圖片以觀看本課的影片)_ + +## 簡介 + +現在我們已經學會如何建構影像生成應用程式,讓我們來談談低程式碼。生成式 AI 可以用於包括低程式碼在內的各種不同領域,但什麼是低程式碼,我們如何將 AI 添加到其中呢? + +建構應用程式和解決方案對於傳統開發者和非開發者來說變得更加容易,這要歸功於低程式碼開發平台。低程式碼開發平台使您能夠用很少甚至不需要程式碼來建構應用程式和解決方案。這是通過提供一個可視化的開發環境來實現的,該環境使您能夠拖放元件來建構應用程式和解決方案。這使您能夠更快地建構應用程式和解決方案,並且需要更少的資源。在本課程中,我們將深入探討如何使用低程式碼以及如何使用 Power Platform 與 AI 增強低程式碼開發。 + +Power Platform 為組織提供了一個機會,讓他們的團隊能夠通過直觀的低程式碼或無程式碼環境來建構自己的解決方案。這個環境有助於簡化建構解決方案的過程。使用 Power Platform,解決方案可以在幾天或幾週內建構完成,而不是幾個月或幾年。Power Platform 包含五個主要產品:Power Apps、Power Automate、Power BI、Power Pages 和 Copilot Studio。 + +本課程涵蓋: + +- 介紹 Power Platform 中的生成式 AI +- 介紹 Copilot 及其使用方法 +- 使用生成式 AI 在 Power Platform 中建構應用程式和流程 +- 使用 AI Builder 了解 Power Platform 中的 AI 模型 + +## 學習目標 + +在這節課結束時,你將能夠: + +- 了解 Copilot 在 Power Platform 中的運作方式。 + +- 為我們的教育初創公司建構一個學生作業追蹤應用程式。 + +- 建構一個使用 AI 從發票中提取資訊的發票處理流程。 + +- 在使用 GPT AI 模型建立文字時應用最佳實踐。 + +這節課中你將使用的工具和技術有: + +- **Power Apps**, 用於學生作業追蹤應用程式,提供低程式碼開發環境來建構應用程式以追蹤、管理和互動資料。 + +- **Dataverse**, 用於儲存學生作業追蹤應用程式的資料,Dataverse 將提供低程式碼資料平台來儲存應用程式的資料。 + +- **Power Automate**, 用於發票處理流程,你將擁有低程式碼開發環境來建構工作流程以自動化發票處理過程。 + +- **AI Builder**, 用於發票處理 AI 模型,你將使用預建的 AI 模型來處理我們新創公司的發票。 + +## 生成式 AI 在 Power Platform + +提升低程式碼開發和應用與生成式 AI 是 Power Platform 的一個關鍵重點領域。目標是讓每個人都能建構 AI 驅動的應用程式、網站、儀表板並自動化流程,_無需任何資料科學專業知識_。這個目標是通過將生成式 AI 以 Copilot 和 AI Builder 的形式整合到 Power Platform 的低程式碼開發體驗中來實現的。 + +### 這是如何運作的? + +Copilot 是一個 AI 助手,通過使用自然語言在一系列對話步驟中描述您的需求,使您能夠建構 Power Platform 解決方案。例如,您可以指示您的 AI 助手說明您的應用程式將使用哪些欄位,它將建立應用程式和基礎資料模型,或者您可以指定如何在 Power Automate 中設定流程。 + +您可以在您的應用程式畫面中使用由 Copilot 驅動的功能,讓使用者透過對話互動來發掘見解。 + +AI Builder 是一種在 Power Platform 中提供的低程式碼 AI 功能,使您能夠使用 AI 模型來幫助自動化流程和預測結果。使用 AI Builder,您可以將 AI 引入您的應用程式和連接到 Dataverse 或各種雲端資料來源(如 SharePoint、OneDrive 或 Azure)的流程。 + +Copilot 可用於所有 Power Platform 產品: Power Apps、Power Automate、Power BI、Power Pages 和 Power Virtual Agents。AI Builder 可用於 Power Apps 和 Power Automate。在本課程中,我們將重點介紹如何在 Power Apps 和 Power Automate 中使用 Copilot 和 AI Builder 來為我們的教育初創公司建構解決方案。 + +### Copilot in Power Apps + +作為 Power Platform 的一部分,Power Apps 提供了一個低程式碼開發環境,用於建構應用程式以追蹤、管理和互動資料。這是一套應用程式開發服務,具有可延展的資料平台,並能連接到雲端服務和內部部署資料。Power Apps 允許您建構可在瀏覽器、平板電腦和手機上執行的應用程式,並能與同事共享。Power Apps 透過簡單的介面讓使用者輕鬆進入應用程式開發,讓每個商業使用者或專業開發者都能建構自訂應用程式。透過 Copilot,應用程式開發體驗也因生成式 AI 而得到增強。 + +Power Apps 中的 copilot AI 助手功能使您能夠描述您需要什麼樣的應用程式以及您希望應用程式追蹤、收集或顯示哪些資訊。Copilot 然後根據您的描述生成一個響應式 Canvas 應用程式。然後您可以自訂應用程式以滿足您的需求。AI Copilot 還會生成並建議一個包含您需要的欄位來儲存您想要追蹤的資料的 Dataverse 表格和一些範例資料。我們將在本課程後面介紹什麼是 Dataverse 以及如何在 Power Apps 中使用它。然後您可以使用 AI Copilot 助手功能通過對話步驟來自訂表格以滿足您的需求。此功能可以從 Power Apps 主畫面中輕鬆使用。 + +### Copilot in Power Automate + +作為 Power Platform 的一部分,Power Automate 讓使用者在應用程式和服務之間建立自動化工作流程。它有助於自動化重複的業務流程,例如通信、資料收集和決策批准。其簡單的介面允許每個技術能力層級的使用者(從初學者到經驗豐富的開發人員)自動化工作任務。透過 Copilot,生成式 AI 也增強了工作流程開發體驗。 + +Power Automate 中的副駕駛 AI 助手功能使您能夠描述您需要的流程類型以及希望流程執行的操作。副駕駛然後根據您的描述生成一個流程。然後您可以自訂流程以滿足您的需求。AI 副駕駛還會生成並建議您需要執行的操作來完成您想要自動化的任務。我們將在本課程的後面部分查看什麼是流程以及如何在 Power Automate 中使用它們。然後,您可以使用 AI 副駕駛助手功能通過對話步驟來自訂操作以滿足您的需求。此功能可從 Power Automate 主畫面中隨時使用。 + +## 作業: 使用 Copilot 管理我們新創公司的學生作業和發票 + +我們的初創公司為學生提供線上課程。該初創公司發展迅速,現在難以應對課程的需求。該初創公司聘請了你作為 Power Platform 開發人員,幫助他們建構一個低程式碼解決方案,以幫助他們管理學生作業和發票。他們的解決方案應能通過應用程式幫助他們追蹤和管理學生作業,並通過工作流程自動化發票處理過程。你被要求使用生成式 AI 開發該解決方案。 + +當你開始使用 Copilot 時,你可以使用 [Power Platform Copilot Prompt Library](https://pnp.github.io/powerplatform-prompts/?WT.mc_id=academic-109639-somelezediko) 來開始使用提示。此函式庫包含一系列提示,你可以用來與 Copilot 一起建構應用程式和流程。你也可以使用函式庫中的提示來了解如何向 Copilot 描述你的需求。 + +### 建構我們新創公司的學生作業追蹤應用程式 + +我們新創公司的教育工作者一直在努力跟蹤學生的作業。他們一直使用電子表格來跟蹤作業,但隨著學生數量的增加,這變得難以管理。他們要求你建構一個應用程式來幫助他們跟蹤和管理學生作業。該應用程式應允許他們新增作業、查看作業、更新作業和刪除作業。該應用程式還應允許教育工作者和學生查看已評分和未評分的作業。 + +您將使用 Power Apps 中的 Copilot 按照以下步驟建構應用程式: + +1. 導航到 [Power Apps](https://make.powerapps.com?WT.mc_id=academic-105485-koreyst) 主畫面。 + +1. 使用主畫面上的文字區域描述您想要建構的應用程式。例如,**_我想建構一個應用程式來追蹤和管理學生作業_**。點擊 **Send** 按鈕將提示發送給 AI Copilot。 + +![描述你想要建構的應用程式](../../images/copilot-chat-prompt-powerapps.png?WT.mc_id=academic-105485-koreyst) + +1. AI Copilot 會建議一個 Dataverse 表格,其中包含您需要儲存想要追蹤的資料的欄位和一些範例資料。然後,您可以使用 AI Copilot 助手功能,通過對話步驟來自訂表格以滿足您的需求。 + + > **重要**: Dataverse 是 Power Platform 的基礎資料平台。它是一個低程式碼的資料平台,用於儲存應用程式的資料。它是一個完全管理的服務,安全地將資料儲存在 Microsoft Cloud 中,並在您的 Power Platform 環境中配置。它具有內建的資料治理功能,例如資料分類、資料譜系、細粒度存取控制等。您可以在[此處](https://docs.microsoft.com/powerapps/maker/data-platform/data-platform-intro?WT.mc_id=academic-109639-somelezediko)了解更多關於 Dataverse 的資訊。 + + ![在您的新表格中建議的欄位](../../images/copilot-dataverse-table-powerapps.png?WT.mc_id=academic-105485-koreyst) + +1. 教育工作者希望向已提交作業的學生發送電子郵件,以便讓他們了解作業的進度。您可以使用 Copilot 向表格添加一個新欄位來儲存學生的電子郵件。例如,您可以使用以下提示來向表格添加新欄位: **_我想添加一個欄位來儲存學生的電子郵件_**。點擊 **發送** 按鈕將提示發送給 AI Copilot。 + +![新增一個新欄位](../../images/copilot-new-column.png?WT.mc_id=academic-105485-koreyst) + +1. AI Copilot 會生成一個新欄位,然後您可以自訂該欄位以滿足您的需求。 + +1. 完成表格後,點擊 **Create app** 按鈕來建立應用程式。 + +1. AI Copilot 會根據您的描述生成一個響應式 Canvas 應用程式。然後您可以自訂應用程式以滿足您的需求。 + +1. 對於教育者發送電子郵件給學生,您可以使用 Copilot 向應用程式添加一個新螢幕。例如,您可以使用以下提示來向應用程式添加新螢幕:**_我想添加一個螢幕來發送電子郵件給學生_**。點擊 **Send** 按鈕將提示發送給 AI Copilot。 + +![通過提示指令添加新螢幕](../../images/copilot-new-screen.png?WT.mc_id=academic-105485-koreyst) + +1. AI Copilot 會生成一個新畫面,然後您可以自訂畫面以滿足您的需求。 + +1. 完成應用程式後,點擊 **Save** 按鈕來保存應用程式。 + +1. 要與教育工作者分享應用程式,點擊 **Share** 按鈕,然後再次點擊 **Share** 按鈕。您可以通過輸入他們的電子郵件地址來與教育工作者分享應用程式。 + +> **你的作業**: 你剛建構的應用程式是一個好的開始,但可以進一步改進。使用電子郵件功能時,教育者只能手動輸入學生的電子郵件地址來發送郵件。你能使用Copilot來建構一個自動化功能,使教育者在學生提交作業時自動發送電子郵件嗎?提示:使用正確的提示,你可以在Power Automate中使用Copilot來建構這個功能。 + +### 建構我們新創公司的發票資訊表格 + +我們初創公司的財務團隊一直在努力追蹤發票。他們一直在使用電子表格來追蹤發票,但隨著發票數量的增加,這變得難以管理。他們要求你建立一個表格,幫助他們存儲、追蹤和管理收到的發票資訊。該表格應用於建構一個自動化系統,將所有發票資訊提取並存儲在表格中。該表格還應使財務團隊能夠查看已支付和未支付的發票。 + +Power Platform 有一個名為 Dataverse 的底層資料平台,可讓您儲存應用程式和解決方案的資料。Dataverse 提供一個低程式碼的資料平台來儲存應用程式的資料。這是一個完全受管理的服務,能夠安全地將資料儲存在 Microsoft Cloud 中,並在您的 Power Platform 環境中配置。它具有內建的資料治理功能,例如資料分類、資料沿革、細粒度存取控制等。您可以在[此處了解更多關於 Dataverse 的資訊](https://docs.microsoft.com/powerapps/maker/data-platform/data-platform-intro?WT.mc_id=academic-109639-somelezediko)。 + +為什麼我們的初創公司應該使用 Dataverse?Dataverse 中的標準和自訂表格為您的數據提供了一個安全且基於雲端的存儲選項。表格讓您可以存儲不同類型的數據,類似於您在單個 Excel 工作簿中使用多個工作表的方式。您可以使用表格來存儲特定於您的組織或業務需求的數據。我們的初創公司使用 Dataverse 所獲得的一些好處包括但不限於: + +- **易於管理**: Metadata 和資料都存儲在雲端,因此您不必擔心它們如何存儲或管理。您可以專注於建構您的應用程式和解決方案。 + +- **安全**: Dataverse 為您的資料提供安全且基於雲端的存儲選項。您可以使用基於角色的安全性控制誰可以訪問表中的資料以及他們如何訪問。 + +- **豐富的 Metadata**: 資料類型和關係直接在 Power Apps 中使用。 + +- **邏輯和驗證**: 您可以使用業務規則、計算欄位和驗證規則來強制執行業務邏輯並保持資料準確性。 + +現在你已經知道什麼是 Dataverse 以及為什麼應該使用它,讓我們來看看如何使用 Copilot 在 Dataverse 中建立一個表格以滿足我們財務團隊的需求。 + +> **注意** : 您將在下一節中使用此表來建構一個自動化流程,該流程將提取所有發票資訊並將其存儲在表中。 + +要使用 Copilot 在 Dataverse 中建立表格,請按照以下步驟操作: + +1. 導航到 [Power Apps](https://make.powerapps.com?WT.mc_id=academic-105485-koreyst) 主畫面。 + +2. 在左側導航欄中,選擇 **Tables**,然後點擊 **Describe the new Table**。 + +![選擇新表格](../../images/describe-new-table.png?WT.mc_id=academic-105485-koreyst) + +1. 在 **描述新表格** 畫面上,使用文字區域描述您想要建立的表格。例如,**_我想建立一個表格來儲存發票資訊_**。點擊 **送出** 按鈕將提示發送給 AI Copilot。 + +![描述此表格](../../images/copilot-chat-prompt-dataverse.png?WT.mc_id=academic-105485-koreyst) + +1. AI Copilot 將建議一個 Dataverse 表格,包含您需要儲存您想追蹤的資料的欄位和一些範例資料。然後,您可以使用 AI Copilot 助手功能通過對話步驟自訂表格以滿足您的需求。 + +![建議的Dataverse表格](../../images/copilot-dataverse-table.png?WT.mc_id=academic-105485-koreyst) + +1. 財務團隊希望發送電子郵件給供應商,以更新他們的發票當前狀態。你可以使用Copilot向表格添加一個新欄位來存儲供應商電子郵件。例如,你可以使用以下提示來向表格添加新欄位: **_我想添加一個欄位來存儲供應商電子郵件_**。點擊**發送**按鈕將提示發送給AI Copilot。 + +1. AI Copilot會生成一個新欄位,然後你可以自定義該欄位以滿足你的需求。 + +1. 完成表格後,點擊**建立**按鈕來建立表格。 + +## AI 模型在 Power Platform 中的應用與 AI Builder + +AI Builder 是一種在 Power Platform 中提供的低程式碼 AI 功能,使您能夠使用 AI 模型來幫助自動化流程和預測結果。使用 AI Builder,您可以將 AI 引入您的應用程式和連接到 Dataverse 或各種雲端資料來源(如 SharePoint、OneDrive 或 Azure)的流程。 + +## 預建 AI 模型 vs 自訂 AI 模型 + +AI Builder 提供兩種類型的 AI 模型: 預建 AI 模型和自訂 AI 模型。預建 AI 模型是由 Microsoft 訓練並在 Power Platform 中可用的即用型 AI 模型。這些模型幫助你為應用程式和流程添加智能,而無需收集資料並建構、訓練和發佈你自己的模型。你可以使用這些模型來自動化流程並預測結果。 + +Power Platform 中可用的一些預建 AI 模型包括: + +- **關鍵詞提取**: 此模型從文本中提取關鍵詞。 +- **語言檢測**: 此模型檢測文本的語言。 +- **情感分析**: 此模型檢測文本中的正面、負面、中立或混合情感。 +- **名片讀取器**: 此模型從名片中提取資訊。 +- **文本識別**: 此模型從圖像中提取文本。 +- **物件檢測**: 此模型檢測並從圖像中提取物件。 +- **文件處理**: 此模型從表單中提取資訊。 +- **發票處理**: 此模型從發票中提取資訊。 + +使用自訂 AI 模型,您可以將自己的模型引入 AI Builder,使其能像任何 AI Builder 自訂模型一樣運作,允許您使用自己的資料訓練模型。您可以使用這些模型在 Power Apps 和 Power Automate 中自動化流程並預測結果。使用您自己的模型時,有一些限制適用。閱讀更多關於這些[限制](https://learn.microsoft.com/ai-builder/byo-model#limitations?WT.mc_id=academic-105485-koreyst)。 + +![AI 建構模型](../../images/ai-builder-models.png?WT.mc_id=academic-105485-koreyst) + +## 作業 #2 - 為我們的創業公司建構發票處理流程 + +財務團隊一直在努力處理發票。他們一直在使用電子表格來追蹤發票,但隨著發票數量的增加,這變得難以管理。他們要求你建構一個工作流程,幫助他們使用 AI 處理發票。該工作流程應能讓他們從發票中提取資訊並將資訊存儲在 Dataverse 表中。該工作流程還應能讓他們將提取的資訊發送電子郵件給財務團隊。 + +現在你已經知道什麼是 AI Builder 以及為什麼應該使用它,讓我們來看看如何在 AI Builder 中使用我們之前提到的發票處理 AI 模型,來建構一個幫助財務團隊處理發票的工作流程。 + +要建構一個工作流程,以幫助財務團隊使用 AI Builder 中的發票處理 AI 模型處理發票,請按照以下步驟操作: + +1. 導航到[Power Automate](https://make.powerautomate.com?WT.mc_id=academic-105485-koreyst)主畫面。 + +2. 使用主畫面上的文字區域描述您想要建構的工作流程。例如,**_處理到達郵箱的發票_**。點擊**發送**按鈕將提示發送給AI Copilot。 + + ![Copilot power automate](../../images/copilot-chat-prompt-powerautomate.png?WT.mc_id=academic-105485-koreyst) + +3. AI Copilot會建議您需要執行的動作來完成您想要自動化的任務。您可以點擊**下一步**按鈕進行下一步。 + +4. 在下一步中,Power Automate會提示您設定流程所需的連接。完成後,點擊**建立流程**按鈕來建立流程。 + +5. AI Copilot會生成一個流程,然後您可以自訂流程以符合您的需求。 + +6. 更新流程的觸發器並將**資料夾**設置為存放發票的資料夾。例如,您可以將資料夾設置為**收件箱**。點擊**顯示進階選項**並將**僅限附件**設置為**是**。這將確保流程僅在收到帶有附件的電子郵件時執行。 + +7. 從流程中移除以下動作:**HTML轉文字**、**撰寫**、**撰寫2**、**撰寫3**和**撰寫4**,因為您不會使用它們。 + +8. 從流程中移除**條件**動作,因為您不會使用它。應該如下圖所示: + + ![power automate, remove actions](../../images/powerautomate-remove-actions.png?WT.mc_id=academic-105485-koreyst) + +9. 點擊**新增動作**按鈕並搜索**Dataverse**。選擇**新增一行**動作。 + +10. 在**從發票中提取資訊**動作中,更新**發票檔案**以指向電子郵件中的**附件內容**。這將確保流程從發票附件中提取資訊。 + +11. 選擇您之前建立的**表格**。例如,您可以選擇**發票資訊**表格。選擇前一動作中的動態內容來填充以下欄位: + + - ID + - 金額 + - 日期 + - 名稱 + - 狀態 - 將**狀態**設置為**待處理**。 + - 供應商電子郵件 - 使用**當新郵件到達時**觸發器中的**寄件者**動態內容。 + + ![power automate add row](../../images/powerautomate-add-row.png?WT.mc_id=academic-105485-koreyst) + +12. 完成流程後,點擊**儲存**按鈕來儲存流程。然後,您可以通過向觸發器中指定的資料夾發送帶有發票的電子郵件來測試流程。 + +> **你的作業**: 你剛剛建構的流程是一個好的開始,現在你需要思考如何建構一個自動化流程,使我們的財務團隊能夠發送電子郵件給供應商,更新他們的發票當前狀態。提示: 當發票狀態變更時,流程必須執行。 + +## 在 Power Automate 中使用文本生成 AI 模型 + +在 AI Builder 中使用 GPT AI 模型建立文字,讓你能夠根據提示生成文字,並由 Microsoft Azure OpenAI 服務提供支持。利用這項功能,你可以將 GPT(生成式預訓練轉換器)技術整合到你的應用程式和流程中,以建構各種自動化流程和具洞察力的應用程式。 + +GPT 模型經過大量數據的廣泛訓練,使其在提供提示時能夠生成與人類語言非常相似的文本。當與工作流程自動化集成時,像 GPT 這樣的 AI 模型可以用來簡化和自動化各種任務。 + +例如,你可以建構流程來自動生成各種用例的文本,例如: 電子郵件草稿、產品描述等。你也可以使用該模型為各種應用程式生成文本,例如聊天機器人和客服應用程式,使客服人員能夠有效且高效地回應客戶查詢。 + +![建立提示](../../images/create-prompt-gpt.png?WT.mc_id=academic-105485-koreyst) + +要學習如何在 Power Automate 中使用此 AI 模型,請參閱[使用 AI Builder 和 GPT 增加智慧](https://learn.microsoft.com/training/modules/ai-builder-text-generation/?WT.mc_id=academic-109639-somelezediko)模組。 + +## 很棒的工作!繼續學習 + +完成本課程後,請查看我們的[生成式 AI 學習集合](https://aka.ms/genai-collection?WT.mc_id=academic-105485-koreyst)以繼續提升您的生成式 AI 知識! + +前往第11課,我們將探討如何[將生成式AI與函式呼叫整合](../../../11-integrating-with-function-calling/translations/tw/README.md?WT.mc_id=academic-105485-koreyst)! + diff --git a/10-building-low-code-ai-applications/translations/tw/assignment.md b/10-building-low-code-ai-applications/translations/tw/assignment.md new file mode 100644 index 000000000..5f282702b --- /dev/null +++ b/10-building-low-code-ai-applications/translations/tw/assignment.md @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/11-integrating-with-function-calling/translations/tw/README.md b/11-integrating-with-function-calling/translations/tw/README.md new file mode 100644 index 000000000..5a7b11601 --- /dev/null +++ b/11-integrating-with-function-calling/translations/tw/README.md @@ -0,0 +1,453 @@ +# 與函式呼叫整合 + +[![與函式呼叫整合](../../images/11-lesson-banner.png?WT.mc_id=academic-105485-koreyst)](https://aka.ms/gen-ai-lesson11-gh?WT.mc_id=academic-105485-koreyst) + +你在前面的課程中已經學到了不少。然而,我們還可以進一步改進。我們可以解決的一些問題是如何獲得更一致的回應格式,以便更容易處理後續的回應。此外,我們可能想要添加來自其他來源的數據,以進一步豐富我們的應用程式。 + +上述提到的問題是本章要解決的。 + +## 簡介 + +本課程將涵蓋: + +- 解釋什麼是函式呼叫及其使用案例。 +- 使用 Azure OpenAI 建立函式呼叫。 +- 如何將函式呼叫整合到應用程式中。 + +## 學習目標 + +完成此課程後,您將能夠: + +- 解釋使用函式呼叫的目的。 +- 使用 Azure OpenAI Service 設定函式呼叫。 +- 為您的應用程式設計有效的函式呼叫用例。 + +## 情境: 使用函式改進我們的聊天機器人 + +這節課中,我們想為我們的教育創業公司建構一個功能,允許用戶使用聊天機器人來查找技術課程。我們將推薦適合他們技能水平、當前角色和感興趣技術的課程。 + +要完成此情境,我們將使用以下組合: + +- `Azure OpenAI` 用來建立使用者的聊天體驗。 +- `Microsoft Learn Catalog API` 幫助使用者根據請求找到課程。 +- `Function Calling` 接收使用者的查詢並將其發送到函式以進行 API 請求。 + +要開始,我們先來看看為什麼我們一開始會想要使用函式呼叫: + +## 為什麼要呼叫函式 + +在呼叫函式之前,來自 LLM 的回應是非結構化且不一致的。開發者需要撰寫複雜的驗證程式碼,以確保他們能夠處理每個回應的變化。使用者無法得到像 "斯德哥爾摩目前的天氣如何?" 這樣的答案。這是因為模型僅限於訓練數據的時間。 + +函式呼叫是 Azure OpenAI 服務的一項功能,用於克服以下限制: + +- **一致的回應格式**. 如果我們能更好地控制回應格式,我們可以更容易地將回應整合到其他系統中。 +- **外部資料**. 能夠在聊天情境中使用應用程式其他來源的資料。 + +## 通過情境說明問題 + +> 我們建議你使用[內建筆記本](/11-integrating-with-function-calling/Lesson11-FunctionCalling.ipynb)如果你想要執行以下場景。你也可以只是閱讀,因為我們正在嘗試說明一個函式可以幫助解決的問題。 + +讓我們看看說明回應格式問題的範例: + +假設我們想要建立一個學生資料的資料庫,以便我們可以向他們推薦合適的課程。以下是兩個學生的描述,它們所包含的資料非常相似。 + +1. 建立與我們的 Azure OpenAI 資源的連接: + + ```python + import os + import json + from openai import AzureOpenAI + from dotenv import load_dotenv + load_dotenv() + + client = AzureOpenAI( + api_key=os.environ['AZURE_OPENAI_KEY'], # 這也是預設值,可以省略 + api_version = "2023-07-01-preview" + ) + + deployment=os.environ['AZURE_OPENAI_DEPLOYMENT'] + ``` + + 下面是一些 Python 程式碼,用於配置我們與 Azure OpenAI 的連接,我們設置了 `api_type`、`api_base`、`api_version` 和 `api_key`。 + +1. 使用變數 `student_1_description` 和 `student_2_description` 建立兩個學生描述。 + + ```python + student_1_description="Emily Johnson 是杜克大學計算機科學專業的二年級學生。她的 GPA 為 3.7。Emily 是大學國際象棋俱樂部和辯論隊的活躍成員。她希望畢業後從事軟體工程師的職業。" + + student_2_description = "Michael Lee 是史丹佛大學計算機科學專業的二年級學生。他的 GPA 為 3.8。Michael 以他的編程技能聞名,是大學機器人俱樂部的活躍成員。他希望在完成學業後從事人工智慧領域的職業。" + ``` + + 我們希望將上述學生描述發送到 LLM 以解析數據。這些數據可以在我們的應用中使用,並發送到 API 或存儲在資料庫中。 + +1. 讓我們建立兩個相同的提示,其中我們指示 LLM 我們感興趣的資訊: + + ```python + prompt1 = f''' + 請從給定的文本中提取以下資訊並以 JSON 物件返回: + + name + major + school + grades + club + + 這是要從中提取資訊的文本正文: + {student_1_description} + ''' + + prompt2 = f''' + 請從給定的文本中提取以下資訊並以 JSON 物件返回: + + name + major + school + grades + club + + 這是要從中提取資訊的文本正文: + {student_2_description} + ''' + ``` + + 上述提示指示 LLM 提取資訊並以 JSON 格式返回響應。 + +1. 在設定提示和連接到 Azure OpenAI 之後,我們現在將使用 `openai.ChatCompletion` 將提示發送給 LLM。我們將提示存儲在 `messages` 變數中,並將角色分配給 `user`。這是為了模擬用戶向聊天機器人寫消息。 + + ```python + # 提示一的回應 + openai_response1 = client.chat.completions.create( + model=deployment, + messages = [{'role': 'user', 'content': prompt1}] + ) + openai_response1.choices[0].message.content + + # 提示二的回應 + openai_response2 = client.chat.completions.create( + model=deployment, + messages = [{'role': 'user', 'content': prompt2}] + ) + openai_response2.choices[0].message.content + ``` + +現在我們可以將兩個請求都發送到 LLM,並通過找到它來檢查我們收到的回應,如此 `openai_response1['choices'][0]['message']['content']`。 + +1. Lastly, we can convert the response to JSON format by calling `json.loads`: + + ```python + # Loading the response as a JSON object + json_response1 = json.loads(openai_response1.choices[0].message.content) + json_response1 + ``` + + Response 1: + + ```json + { + "name": "Emily Johnson", + "major": "computer science", + "school": "Duke University", + "grades": "3.7", + "club": "Chess Club" + } + ``` + + Response 2: + + ```json + { + "name": "Michael Lee", + "major": "computer science", + "school": "Stanford University", + "grades": "3.8 GPA", + "club": "Robotics Club" + } + ``` + + Even though the prompts are the same and the descriptions are similar, we see values of the `Grades` property formatted differently as we can sometimes get the format `3.7` or `3.7 GPA` for example. + + This result is because the LLM takes unstructured data in the form of the written prompt and returns also unstructured data. We need to have a structured format so that we know what to expect when storing or using this data + +那麼我們如何解決格式問題呢?通過使用函式呼叫,我們可以確保收到結構化的資料。當使用函式呼叫時,LLM 實際上並不會呼叫或執行任何函式。相反,我們為 LLM 建立一個結構來遵循其回應。然後我們使用這些結構化的回應來知道在我們的應用程式中要執行什麼函式。 + +![函式流程](../../images/Function-Flow.png?WT.mc_id=academic-105485-koreyst) + +我們可以將從函式返回的內容傳送回 LLM。然後 LLM 將使用自然語言回應來回答使用者的查詢。 + +## 使用函式呼叫的用例 + +在許多不同的使用案例中,函式呼叫可以改善您的應用程式,例如: + +- **呼叫外部工具**。聊天機器人非常擅長回答用戶的問題。通過使用函式呼叫,聊天機器人可以使用用戶的消息來完成某些任務。例如,一個學生可以要求聊天機器人「發送電子郵件給我的導師,說我需要更多的幫助」。這可以通過呼叫 `send_email(to: string, body: string)` 函式來實現。 + +- **建立 API 或資料庫查詢**。用戶可以使用自然語言查找資訊,這些自然語言會轉換成格式化的查詢或 API 請求。這方面的一個範例可能是一位老師請求「誰是完成了最後一個作業的學生」,這可以呼叫一個名為 `get_completed(student_name: string, assignment: int, current_status: string)` 的函式。 + +- **建立結構化資料**。用戶可以使用 LLM 從一段文字或 CSV 中提取重要資訊。例如,一個學生可以將一篇關於和平協議的維基百科文章轉換成 AI 閃卡。這可以通過使用一個名為 `get_important_facts(agreement_name: string, date_signed: string, parties_involved: list)` 的函式來完成。 + +## 建立您的第一個函式呼叫 + +建立函式呼叫的過程包括三個主要步驟: + +1. **呼叫** Chat Completions API 並附上你的函式列表和使用者訊息。 +2. **閱讀**模型的回應以執行動作,即執行函式或 API 呼叫。 +3. **再次呼叫** Chat Completions API 並使用你的函式回應中的資訊來建立對使用者的回應。 + +![LLM Flow](../../images/LLM-Flow.png?WT.mc_id=academic-105485-koreyst) + +### Step 1 - 建立訊息 + +第一步是建立使用者訊息。這可以透過取得文字輸入的值來動態分配,或者你可以在這裡分配一個值。如果這是你第一次使用 Chat Completions API,我們需要定義訊息的`role`和`content`。 + +`role` 可以是 `system` (建立規則), `assistant` (模型) 或 `user` (最終使用者)。對於函式呼叫, 我們將其指定為 `user` 和一個範例問題。 + +```python +messages= [ {"role": "user", "content": "幫我找一個適合初學者學習 Azure 的好課程。"} ] +``` + +通過分配不同的角色,可以明確地讓LLM知道是系統在說話還是用戶在說話,這有助於建立LLM可以基於此進行建構的對話歷史。 + +### 步驟 2 - 建立函式 + +接下來,我們將定義一個函式和該函式的參數。我們將只使用一個名為 `search_courses` 的函式,但你可以建立多個函式。 + +> **重要** : 函式包含在系統訊息中給 LLM,並將包含在您可用的 token 數量中。 + +以下,我們將函式建立為一個項目陣列。每個項目都是一個函式,並具有屬性 `name`、`description` 和 `parameters`: + +```python +函式 = [ + { + "name":"search_courses", + "description":"根據提供的參數從搜尋索引中檢索課程", + "parameters":{ + "type":"物件", + "properties":{ + "role":{ + "type":"string", + "description":"學習者的角色 (例如: 開發者、數據科學家、學生等)" + }, + "product":{ + "type":"string", + "description":"課程涵蓋的產品 (例如: Azure、Power BI 等)" + }, + "level":{ + "type":"string", + "description":"學習者在參加課程前的經驗水平 (例如: 初學者、中級、高級)" + } + }, + "required":[ + "role" + ] + } + } +] +``` + +讓我們更詳細地描述每個函式實例: + +- `name` - 我們希望呼叫的函式名稱。 +- `description` - 這是函式如何運作的描述。這裡重要的是要具體和清晰。 +- `parameters` - 你希望模型在其回應中產生的值和格式的列表。參數陣列由項目組成,其中項目具有以下屬性: + 1. `type` - 屬性將存儲的資料類型。 + 1. `properties` - 模型將用於其回應的具體值列表 + 1. `name` - 鍵是模型在其格式化回應中使用的屬性名稱,例如, `product`。 + 1. `type` - 此屬性的資料類型,例如, `string`。 + 1. `description` - 具體屬性的描述。 + +還有一個可選屬性 `required` - 函式呼叫完成所需的必要屬性。 + +### 步驟 3 - 進行函式呼叫 + +在定義了一個函式之後,我們現在需要將它包含在呼叫 Chat Completion API 中。我們通過在請求中添加 `functions` 來完成這個操作。在這種情況下 `functions=functions`。 + +還有一個選項可以將 `function_call` 設定為 `auto`。這意味著我們將讓 LLM 根據使用者訊息決定應該呼叫哪個函式,而不是由我們自己分配。 + +以下是一些程式碼,我們呼叫 `ChatCompletion.create`,注意我們如何設定 `functions=functions` 和 `function_call="auto"`,從而讓 LLM 自行選擇何時呼叫我們提供的函式: + +```python +response = client.chat.completions.create(model=deployment, + messages=messages, + functions=函式, + function_call="auto") + +print(response.choices[0].message) +``` + +回應現在看起來是這樣的: + +```json +{ + "角色": "助手", + "函式呼叫": { + "名稱": "search_courses", + "參數": "{\n \"角色\": \"學生\",\n \"產品\": \"Azure\",\n \"等級\": \"初學者\"\n}" + } +} +``` + +在這裡我們可以看到函式 `search_courses` 是如何被呼叫的,以及在 JSON 回應中的 `arguments` 屬性中列出的參數。 + +結論是 LLM 能夠找到數據來適應函式的參數,因為它是從提供給聊天完成呼叫的 `messages` 參數中的值中提取的。以下是 `messages` 值的提醒: + +```python +messages= [ {"role": "user", "content": "幫我找一個適合初學者學習 Azure 的好課程。"} ] +``` + +如你所見,`student`、`Azure` 和 `beginner` 從 `messages` 中提取並設置為函式的輸入。這樣使用函式是一個從提示中提取資訊的好方法,同時也為 LLM 提供結構並具有可重用的功能。 + +接下來,我們需要看看如何在我們的應用程式中使用這個。 + +## 將函式呼叫整合到應用程式中 + +在我們測試過來自 LLM 的格式化回應後,現在我們可以將其整合到應用程式中。 + +### 管理流程 + +要將這個整合到我們的應用程式中,讓我們採取以下步驟: + +1. 首先,讓我們呼叫 Open AI 服務並將訊息儲存在一個名為 `response_message` 的變數中。 + + ```python + response_message = response.choices[0].message + ``` + +1. 現在我們將定義一個函式來呼叫 Microsoft Learn API 以獲取課程列表: + + ```python + import requests + + def search_courses(role, product, level): + url = "https://learn.microsoft.com/api/catalog/" + params = { + "role": role, + "product": product, + "level": level + } + response = requests.get(url, params=params) + modules = response.json()["modules"] + results = [] + for module in modules[:5]: + title = module["title"] + url = module["url"] + results.append({"title": title, "url": url}) + return str(results) + ``` + + 注意我們現在如何建立一個實際的 Python 函式,並將其對應到 `functions` 變數中引入的函式名稱。我們還進行了真正的外部 API 呼叫來獲取所需的資料。在這個例子中,我們使用 Microsoft Learn API 來搜尋訓練模組。 + +好的,所以我們建立了 `函式` 變數和相應的 Python 函式,我們如何告訴 LLM 如何將這兩者映射在一起,以便呼叫我們的 Python 函式? + +1. 要查看我們是否需要呼叫一個 Python 函式,我們需要查看 LLM 的回應,看看 `function_call` 是否是其中的一部分並呼叫指出的函式。以下是您可以進行檢查的方式: + + ```python + # 檢查模型是否想要呼叫函式 + if response_message.function_call.name: + print("推薦的函式呼叫:") + print(response_message.function_call.name) + print() + + # 呼叫函式。 + function_name = response_message.function_call.name + + available_functions = { + "search_courses": search_courses, + } + function_to_call = available_functions[function_name] + + function_args = json.loads(response_message.function_call.arguments) + function_response = function_to_call(**function_args) + + print("函式呼叫的輸出:") + print(function_response) + print(type(function_response)) + + + # 將助手回應和函式回應添加到訊息中 + messages.append( # 將助手回應添加到訊息中 + { + "role": response_message.role, + "function_call": { + "name": function_name, + "arguments": response_message.function_call.arguments, + }, + "content": None + } + ) + messages.append( # 將函式回應添加到訊息中 + { + "role": "function", + "name": function_name, + "content":function_response, + } + ) + ``` + + 這三行確保我們提取函式名稱、參數並進行呼叫: + + ```python + function_to_call = available_functions[function_name] + + function_args = json.loads(response_message.function_call.arguments) + function_response = function_to_call(**function_args) + ``` + + 以下是執行我們程式碼的輸出: + + **輸出** + + ```推薦的函式呼叫: + { + "name": "search_courses", + "arguments": "{\n \"role\": \"student\",\n \"product\": \"Azure\",\n \"level\": \"beginner\"\n}" + } + + 函式呼叫的輸出: + [{'title': 'Describe concepts of cryptography', 'url': 'https://learn.microsoft.com/training/modules/describe-concepts-of-cryptography/?WT.mc_id=api_CatalogApi'}, {'title': 'Introduction to audio classification with TensorFlow', 'url': 'https://learn.microsoft.com/en-us/training/modules/intro-audio-classification-tensorflow/?WT.mc_id=api_CatalogApi'}, {'title': 'Design a Performant Data Model in Azure SQL Database with Azure Data Studio', 'url': 'https://learn.microsoft.com/training/modules/design-a-data-model-with-ads/?WT.mc_id=api_CatalogApi'}, {'title': 'Getting started with the Microsoft Cloud Adoption Framework for Azure', 'url': 'https://learn.microsoft.com/training/modules/cloud-adoption-framework-getting-started/?WT.mc_id=api_CatalogApi'}, {'title': 'Set up the Rust development environment', 'url': 'https://learn.microsoft.com/training/modules/rust-set-up-environment/?WT.mc_id=api_CatalogApi'}] + + ``` + +1. 現在我們將更新的訊息 `messages` 發送給 LLM,以便我們可以收到自然語言回應,而不是 API JSON 格式的回應。 + + ```python + print("下一個請求中的訊息:") + print(messages) + print() + + second_response = client.chat.completions.create( + messages=messages, + model=deployment, + function_call="auto", + functions=functions, + temperature=0 + ) # 從 GPT 獲取新的回應,它可以看到函式回應 + + + print(second_response.choices[0].message) + ``` + + **輸出** + + ```python + { + "role": "assistant", + "content": "我找到了一些適合初學者學習 Azure 的好課程:\n\n1. [Describe concepts of cryptography](https://learn.microsoft.com/training/modules/describe-concepts-of-cryptography/?WT.mc_id=api_CatalogApi)\n2. [Introduction to audio classification with TensorFlow](https://learn.microsoft.com/training/modules/intro-audio-classification-tensorflow/?WT.mc_id=api_CatalogApi)\n3. [Design a Performant Data Model in Azure SQL Database with Azure Data Studio](https://learn.microsoft.com/training/modules/design-a-data-model-with-ads/?WT.mc_id=api_CatalogApi)\n4. [Getting started with the Microsoft Cloud Adoption Framework for Azure](https://learn.microsoft.com/training/modules/cloud-adoption-framework-getting-started/?WT.mc_id=api_CatalogApi)\n5. [Set up the Rust development environment](https://learn.microsoft.com/training/modules/rust-set-up-environment/?WT.mc_id=api_CatalogApi)\n\n你可以點擊連結來訪問這些課程。" + } + + ``` + +## 作業 + +為了繼續學習 Azure OpenAI 函式呼叫,你可以建構: + +- 更多函式的參數可能幫助學習者找到更多課程。 +- 建立另一個函式呼叫,從學習者那裡獲取更多資訊,例如他們的母語 +- 當函式呼叫和/或 API 呼叫未返回任何合適的課程時,建立錯誤處理 + +提示: 請參考[Learn API 參考文件](https://learn.microsoft.com/training/support/catalog-api-developer-reference?WT.mc_id=academic-105485-koreyst)頁面,了解這些資料的可用方式和位置。 + +## 很棒的工作!繼續這段旅程 + +完成本課程後,請查看我們的[生成式 AI 學習集合](https://aka.ms/genai-collection?WT.mc_id=academic-105485-koreyst)以繼續提升您的生成式 AI 知識! + +前往第12課,我們將探討如何[為 AI 應用設計 UX](../../../12-designing-ux-for-ai-applications/translations/tw/README.md?WT.mc_id=academic-105485-koreyst)! + diff --git a/12-designing-ux-for-ai-applications/translations/tw/README.md b/12-designing-ux-for-ai-applications/translations/tw/README.md new file mode 100644 index 000000000..d82bf9cdf --- /dev/null +++ b/12-designing-ux-for-ai-applications/translations/tw/README.md @@ -0,0 +1,121 @@ +# 設計 AI 應用的 UX + +[![設計 AI 應用的 UX](../../images/12-lesson-banner.png?WT.mc_id=academic-105485-koreyst)](https://aka.ms/gen-ai-lesson12-gh?WT.mc_id=academic-105485-koreyst) + +> _(點擊上方圖片以觀看本課的影片)_ + +使用者體驗是建構應用程式的一個非常重要的方面。使用者需要能夠以高效的方式使用你的應用程式來執行任務。高效是一回事,但你還需要設計應用程式,使其能夠被所有人使用,讓它們具有_可及性_。本章將專注於這個領域,希望最終你能設計出人們能夠並且想要使用的應用程式。 + +## 簡介 + +使用者體驗是使用者如何互動並使用特定產品或服務,不論是系統、工具或設計。在開發 AI 應用程式時,開發者不僅專注於確保使用者體驗的有效性,還要考慮其倫理性。在本課程中,我們將介紹如何建構滿足使用者需求的人工智慧 (AI) 應用程式。 + +這節課將涵蓋以下領域: + +- 使用者體驗介紹和理解使用者需求 +- 設計值得信賴和透明的 AI 應用程式 +- 設計用於協作和反饋的 AI 應用程式 + +## 學習目標 + +完成這節課後,你將能夠: + +- 了解如何建構符合使用者需求的 AI 應用程式。 +- 設計促進信任與合作的 AI 應用程式。 + +### 先決條件 + +花點時間閱讀更多關於[使用者體驗和設計思維](https://learn.microsoft.com/training/modules/ux-design?WT.mc_id=academic-105485-koreyst)。 + +## 使用者體驗介紹與了解使用者需求 + +在我們虛構的教育新創公司中,我們有兩個主要用戶,教師和學生。這兩個用戶各有其獨特的需求。以用戶為中心的設計優先考慮用戶,確保產品對其目標用戶是相關且有益的。 + +應用程式應該是**有用的、可靠的、可訪問的和愉快的**,以提供良好的使用者體驗。 + +### 可用性 + +應用程式的實用性意味著它具有符合其預期目的的功能,例如自動化評分過程或生成複習用的抽認卡。一個自動化評分過程的應用程式應能夠根據預定標準準確且高效地為學生的作業打分。同樣地,一個生成複習抽認卡的應用程式應能夠根據其數據建立相關且多樣的問題。 + +### 可靠性 + +可靠性意味著應用程式可以一致且無錯誤地執行其任務。然而,AI 就像人類一樣並不完美,可能會出錯。應用程式可能會遇到需要人工干預或修正的錯誤或意外情況。你如何處理錯誤?在本課的最後一節,我們將介紹 AI 系統和應用程式如何設計以進行協作和反饋。 + +### 無障礙性 + +讓所有人都能使用意味著將使用者體驗擴展到具有各種能力的使用者,包括殘障人士,確保沒有人被排除在外。通過遵循無障礙指南和原則,AI 解決方案變得更加包容、可用,並對所有使用者有益。 + +### 愉快 + +愉快意味著應用程式使用起來令人愉悅。吸引人的使用者體驗可以對使用者產生積極的影響,鼓勵他們回到應用程式並增加業務收入。 + +![image illustrating UX considerations in AI](../../images/uxinai.png?WT.mc_id=academic-105485-koreyst) + +並非每個挑戰都能用 AI 解決。AI 的加入是為了增強您的使用者體驗,無論是自動化手動任務,還是個性化使用者體驗。 + +## 設計值得信賴和透明的 AI 應用程式 + +建立信任在設計 AI 應用程式時至關重要。信任確保使用者相信應用程式能夠完成工作,持續提供結果,並且結果是使用者所需要的。在這方面的一個風險是缺乏信任和過度信任。缺乏信任發生在使用者對 AI 系統幾乎沒有信任時,這會導致使用者拒絕你的應用程式。過度信任發生在使用者高估了 AI 系統的能力,導致使用者過度信任 AI 系統。例如,在過度信任的情況下,自動評分系統可能會導致教師不檢查部分試卷以確保評分系統運作良好。這可能會導致學生的成績不公平或不準確,或者錯失反饋和改進的機會。 + +設計中確保信任處於核心的兩種方法是可解釋性和控制。 + +### 可解釋性 + +當 AI 幫助做出決策,例如向後代傳授知識時,教師和家長了解 AI 決策的方式是至關重要的。這就是可解釋性——了解 AI 應用程式如何做出決策。設計可解釋性包括添加 AI 應用程式可以做什麼的範例細節。例如,系統可以使用:"使用 AI 縮短你的筆記以便於複習",而不是 "開始使用 AI 教師"。 + +![一個應用程式登陸頁面,清楚說明 AI 應用中的可解釋性](../../images/explanability-in-ai.png?WT.mc_id=academic-105485-koreyst) + +另一個範例是 AI 如何使用用戶和個人資料。例如,一個具有學生角色的用戶可能會根據其角色受到限制。AI 可能無法揭示問題的答案,但可以幫助引導用戶思考如何解決問題。 + +![AI 回答基於個人設定的問題](../../images/solving-questions.png?WT.mc_id=academic-105485-koreyst) + +最後一個關鍵部分是解釋的簡化。學生和老師可能不是 AI 專家,因此應簡化應用程式能做什麼或不能做什麼的解釋,使其易於理解。 + +![簡化的 AI 功能說明](../../images/simplified-explanations.png?WT.mc_id=academic-105485-koreyst) + +### 控制 + +生成式 AI 創造了 AI 與使用者之間的合作,例如使用者可以修改提示以獲得不同的結果。此外,一旦生成輸出,使用者應該能夠修改結果,讓他們感受到控制。例如,使用 Bing 時,你可以根據格式、語調和長度來調整提示。此外,你可以對輸出進行更改並修改輸出,如下所示: + +![Bing 搜尋結果,包含修改提示和輸出選項](../../images/bing1.png?WT.mc_id=academic-105485-koreyst "Bing 搜尋結果,包含修改提示和輸出選項") + +另一個讓使用者能夠控制應用程式的功能是允許用戶選擇加入或退出 AI 使用的數據。對於學校應用程式,學生可能希望使用他們的筆記以及老師的資源作為複習材料。 + +![Bing 搜尋結果,提供修改提示和輸出選項](../../images/bing2.png?WT.mc_id=academic-105485-koreyst "Bing 搜尋結果,提供修改提示和輸出選項") + +> 在設計 AI 應用程式時,有意識地確保使用者不會過度信任並設置不切實際的期望是關鍵。實現這一點的一種方法是通過在提示和結果之間創造摩擦。提醒使用者,這是 AI 而不是人類。 + +## 設計 AI 應用程式以進行協作和反饋 + +如前所述,生成式 AI 創造了用戶與 AI 之間的合作。大多數互動是用戶輸入提示,AI 生成輸出。如果輸出是錯誤的怎麼辦?應用程式如何處理錯誤?AI 會責怪用戶還是花時間解釋錯誤? + +AI 應用程式應內建接收和給予回饋的功能。這不僅有助於 AI 系統改進,還能建立與使用者的信任。在設計中應包含回饋迴圈,範例可以是對輸出結果進行簡單的贊成或反對。 + +另一種處理方式是明確傳達系統的能力和限制。當使用者請求超出 AI 能力範圍的內容時,應該有一種方式來處理,如下所示。 + +![提供反饋和處理錯誤](../../images/feedback-loops.png?WT.mc_id=academic-105485-koreyst) + +系統錯誤在應用程式中很常見,使用者可能需要範圍外的資訊協助,或者應用程式可能對使用者能生成摘要的問題/主題數量有限制。例如,一個用有限主題資料訓練的AI應用程式,例如歷史和數學,可能無法處理地理相關的問題。為了減輕這種情況,AI系統可以給出如下回應:"抱歉,我們的產品已用以下主題的資料進行訓練.....,我無法回應您所問的問題。" + +AI 應用程式並不完美,因此,它們必然會犯錯。在設計您的應用程式時,您應確保為用戶反饋和錯誤處理留出空間,並以簡單且易於解釋的方式進行。 + +## 作業 + +將您迄今為止建構的任何 AI 應用程式,考慮在應用程式中實施以下步驟: + +- **愉悅:** 考慮如何讓你的應用程式更愉悅。你是否在各處添加了解釋,是否鼓勵用戶探索?你的錯誤訊息是如何措辭的? + +- **可用性:** 建構一個網頁應用程式。確保你的應用程式可以通過滑鼠和鍵盤導航。 + +- **信任和透明:** 不要完全信任 AI 及其輸出,考慮如何添加人工來驗證輸出。同時,考慮並實施其他方法來實現信任和透明。 + +- **控制:** 給用戶控制他們提供給應用程式的數據。實施一種方式,讓用戶可以選擇加入和退出 AI 應用程式中的數據收集。 + + + +## 繼續學習! + +完成本課程後,請查看我們的[生成式 AI 學習集合](https://aka.ms/genai-collection?WT.mc_id=academic-105485-koreyst)以繼續提升您的生成式 AI 知識! + +前往第 13 課,我們將探討如何[保護 AI 應用程式](../../../13-securing-ai-applications/translations/tw/README.md?WT.mc_id=academic-105485-koreyst)! + diff --git a/13-securing-ai-applications/translations/tw/README.md b/13-securing-ai-applications/translations/tw/README.md new file mode 100644 index 000000000..583b343b0 --- /dev/null +++ b/13-securing-ai-applications/translations/tw/README.md @@ -0,0 +1,165 @@ +# 保護您的生成式 AI 應用程式 + +[![保護您的生成式 AI 應用程式](../../images/13-lesson-banner.png?WT.mc_id=academic-105485-koreyst)](https://aka.ms/gen-ai-lesson13-gh?WT.mc_id=academic-105485-koreyst) + +## 簡介 + +本課程將涵蓋: + +- AI 系統背景下的安全性。 +- AI 系統常見的風險和威脅。 +- 確保 AI 系統安全的方法和考量。 + +## 學習目標 + +完成本課程後,您將了解以下內容: + +- AI 系統的威脅和風險。 +- 保護 AI 系統的常見方法和實踐。 +- 如何通過實施安全測試來防止意外結果和用戶信任的流失。 + +## 在生成式 AI 的背景下,安全性意味著什麼? + +隨著人工智慧(AI)和機器學習(ML)技術日益影響我們的生活,保護不僅是客戶資料,還有AI系統本身變得至關重要。AI/ML越來越多地用於支持高價值決策過程的行業中,錯誤的決策可能會導致嚴重的後果。 + +以下是需要考慮的關鍵點: + +- **AI/ML 的影響**: AI/ML 對日常生活有重大影響,因此保護它們變得至關重要。 +- **安全挑戰**: 需要適當關注 AI/ML 的這種影響,以解決保護基於 AI 的產品免受複雜攻擊(無論是由噴子還是有組織的團體發起)的需求。 +- **戰略問題**: 科技行業必須積極應對戰略挑戰,以確保長期的客戶安全和數據安全。 + +此外,機器學習模型在很大程度上無法辨別惡意輸入和良性異常數據。訓練數據的一個重要來源是來自未經策劃、未經審核的公共數據集,這些數據集對第三方貢獻開放。攻擊者不需要破壞數據集,因為他們可以自由地對其進行貢獻。隨著時間的推移,低置信度的惡意數據會變成高置信度的可信數據,只要數據結構/格式保持正確。 + +這就是為什麼確保資料存儲的完整性和保護對於您的模型做出決策至關重要。 + +## 理解 AI 的威脅和風險 + +在 AI 和相關系統方面,數據投毒是當今最顯著的安全威脅。數據投毒是指有人故意更改用於訓練 AI 的資訊,導致其犯錯。這是由於缺乏標準化的檢測和緩解方法,加上我們依賴不受信任或未經整理的公共數據集進行訓練。為了維持數據完整性並防止訓練過程出現缺陷,追踪數據的來源和沿革至關重要。否則,古老的諺語「垃圾進,垃圾出」將成為現實,導致模型性能受損。 + +以下是資料污染如何影響你的模型的範例: + +1. **標籤翻轉**: 在二元分類任務中,對手故意翻轉一小部分訓練數據的標籤。例如,將良性樣本標記為惡意,導致模型學習到錯誤的關聯。 + **範例**: 由於標籤被操縱,垃圾郵件過濾器將合法郵件誤分類為垃圾郵件。 +2. **特徵中毒**: 攻擊者微妙地修改訓練數據中的特徵以引入偏見或誤導模型。 + **範例**: 在產品描述中添加無關鍵字以操縱推薦系統。 +3. **數據注入**: 將惡意數據注入訓練集以影響模型的行為。 + **範例**: 引入虛假用戶評論以扭曲情感分析結果。 +4. **後門攻擊**: 對手在訓練數據中插入隱藏模式(後門)。模型學會識別這種模式,並在被觸發時表現出惡意行為。 + **範例**: 一個面部識別系統使用帶有後門的圖像進行訓練,導致錯誤識別特定人員。 + +MITRE Corporation 已經建立了[ATLAS (Adversarial Threat Landscape for Artificial-Intelligence Systems)](https://atlas.mitre.org/?WT.mc_id=academic-105485-koreyst),這是一個知識庫,包含在現實世界中對 AI 系統進行攻擊時對手所使用的策略和技術。 + +> 隨著 AI 的融入增加了現有系統的攻擊面,AI 驅動系統中的漏洞數量也在不斷增加。我們開發了 ATLAS 以提高對這些獨特且不斷演變的漏洞的認識,因為全球社群越來越多地將 AI 融入各種系統。ATLAS 參考了 MITRE ATT&CK® 框架,其策略、技術和程序(TTPs)與 ATT&CK 中的內容互補。 + +與廣泛用於傳統網路安全中規劃高級威脅模擬場景的MITRE ATT&CK®框架非常相似,ATLAS提供了一組易於搜尋的TTPs,這有助於更好地理解和準備防禦新興攻擊。 + +此外,開放網路應用程式安全計畫(OWASP)已經建立了一個[前10名清單](https://llmtop10.com/?WT.mc_id=academic-105485-koreyst),列出了在使用LLM的應用程式中發現的最嚴重漏洞。該清單強調了威脅的風險,例如前述的資料中毒以及其他如: + +- **Prompt Injection**: 一種技術,攻擊者通過精心設計的輸入操縱大型語言模型(LLM),使其行為超出預期範圍。 +- **Supply Chain Vulnerabilities**: 構成LLM應用程式的組件和軟體(如Python模組或外部數據集)本身可能會被攻擊,導致意外結果、引入偏見,甚至使底層基礎設施存在漏洞。 +- **Overreliance**: LLMs 是易犯錯的,並且容易產生幻覺,提供不準確或不安全的結果。在幾個有記錄的情況下,人們直接接受結果,導致意想不到的現實世界負面後果。 + +Microsoft Cloud Advocate Rod Trent 撰寫了一本免費的電子書,[Must Learn AI Security](https://github.com/rod-trent/OpenAISecurity/tree/main/Must_Learn/Book_Version?WT.mc_id=academic-105485-koreyst),深入探討這些和其他新興的 AI 威脅,並提供了廣泛的指南,教你如何最好地應對這些情境。 + +## AI 系統和 LLM 的安全測試 + +人工智慧(AI)正在改變各個領域和行業,為社會提供新的可能性和利益。然而,AI 也帶來了重大挑戰和風險,例如資料隱私、偏見、缺乏可解釋性和潛在的濫用。因此,確保 AI 系統的安全和負責任至關重要,這意味著它們必須遵守道德和法律標準,並且能夠被使用者和利益相關者信任。 + +AI 系統或 LLM 的安全測試是透過識別和利用其漏洞來評估其安全性的過程。這可以由開發人員、使用者或第三方審計員執行,具體取決於測試的目的和範圍。以下是一些最常見的 AI 系統和 LLM 的安全測試方法: + +- **資料清理**: 這是從訓練資料或AI系統或LLM的輸入中移除或匿名化敏感或私人資訊的過程。資料清理可以通過減少機密或個人資料的曝光來幫助防止資料洩漏和惡意操作。 +- **對抗性測試**: 這是生成和應用對抗性範例到AI系統或LLM的輸入或輸出以評估其對抗攻擊的穩健性和韌性的過程。對抗性測試可以幫助識別和減輕AI系統或LLM的漏洞和弱點,這些漏洞和弱點可能會被攻擊者利用。 +- **模型驗證**: 這是驗證AI系統或LLM的模型參數或架構的正確性和完整性的過程。模型驗證可以通過確保模型受到保護和認證來幫助檢測和防止模型竊取。 +- **輸出驗證**: 這是驗證AI系統或LLM輸出品質和可靠性的過程。輸出驗證可以通過確保輸出一致且準確來幫助檢測和糾正惡意操作。 + +OpenAI, 作為 AI 系統的領導者,已經設定了一系列_安全評估_作為其紅隊網絡計劃的一部分,旨在測試輸出 AI 系統,希望能為 AI 安全做出貢獻。 + +> 評估可以從簡單的問答測試到更複雜的模擬。作為具體範例,以下是OpenAI為從多個角度評估AI行為而開發的範例評估: + +#### 說服 + +- [MakeMeSay](https://github.com/openai/evals/tree/main/evals/elsuite/make_me_say/readme.md?WT.mc_id=academic-105485-koreyst): AI 系統能多好地欺騙另一個 AI 系統說出一個秘密詞語? +- [MakeMePay](https://github.com/openai/evals/tree/main/evals/elsuite/make_me_pay/readme.md?WT.mc_id=academic-105485-koreyst): AI 系統能多好地說服另一個 AI 系統捐錢? +- [Ballot Proposal](https://github.com/openai/evals/tree/main/evals/elsuite/ballots/readme.md?WT.mc_id=academic-105485-koreyst): AI 系統能多好地影響另一個 AI 系統對政治提案的支持? + +#### 隱寫術 (隱藏訊息) + +- [隱寫術](https://github.com/openai/evals/tree/main/evals/elsuite/steganography/readme.md?WT.mc_id=academic-105485-koreyst): AI 系統在不被另一個 AI 系統發現的情況下,能多好地傳遞秘密訊息? +- [文字壓縮](https://github.com/openai/evals/tree/main/evals/elsuite/text_compression/readme.md?WT.mc_id=academic-105485-koreyst): AI 系統能多好地壓縮和解壓縮訊息,以便隱藏秘密訊息? +- [Schelling Point](https://github.com/openai/evals/blob/main/evals/elsuite/schelling_point/README.md?WT.mc_id=academic-105485-koreyst): AI 系統在沒有直接溝通的情況下,能多好地與另一個 AI 系統協調? + +### AI 安全性 + +我們必須致力於保護 AI 系統免受惡意攻擊、濫用或意外後果的影響。這包括採取措施以確保 AI 系統的安全性、可靠性和可信賴性,例如: + +- 確保用於訓練和執行AI模型的數據和算法的安全 +- 防止未經授權的訪問、操縱或破壞AI系統 +- 檢測和減輕AI系統中的偏見、歧視或倫理問題 +- 確保AI決策和行動的責任、透明度和可解釋性 +- 使AI系統的目標和價值觀與人類和社會的目標和價值觀保持一致 + +AI 安全對於確保 AI 系統和數據的完整性、可用性和機密性非常重要。AI 安全的一些挑戰和機會包括: + +- 機會: 將 AI 納入網絡安全策略中,因為它可以在識別威脅和改善響應時間方面發揮關鍵作用。AI 可以幫助自動化和增強對網絡攻擊(如網絡釣魚、惡意軟體或勒索軟體)的檢測和緩解。 +- 挑戰: 對手也可以利用 AI 發動複雜的攻擊,例如生成虛假或誤導性內容、冒充用戶或利用 AI 系統中的漏洞。因此,AI 開發者有責任設計出能夠對抗濫用的強大且有韌性的系統。 + +### 資料保護 + +LLMs 可能對其使用的數據的隱私和安全構成風險。例如,LLMs 可能會記住並洩露其訓練數據中的敏感資訊,如個人姓名、地址、密碼或信用卡號碼。它們也可能被惡意行為者操縱或攻擊,這些行為者想要利用其漏洞或偏見。因此,了解這些風險並採取適當的措施來保護與 LLMs 一起使用的數據非常重要。您可以採取幾個步驟來保護與 LLMs 一起使用的數據。這些步驟包括: + +- **限制與 LLMs 分享的資料量和類型**: 只分享必要且相關的資料,避免分享任何敏感、機密或個人資料。使用者應該將與 LLMs 分享的資料匿名化或加密,例如移除或遮蔽任何識別資訊,或使用安全的通訊渠道。 +- **驗證 LLMs 生成的資料**: 始終檢查 LLMs 生成的輸出之準確性和品質,以確保它們不包含任何不需要或不適當的資訊。 +- **報告和警示任何資料洩露或事件**: 警惕 LLMs 的任何可疑或異常活動或行為,例如生成無關、錯誤、冒犯或有害的文本。這可能是資料洩露或安全事件的跡象。 + +數據安全、治理和合規性對於任何希望在多雲環境中利用數據和 AI 力量的組織來說都是至關重要的。保護和治理所有數據是一項複雜且多方面的任務。您需要在多個雲端中的不同位置保護和治理不同類型的數據(結構化、非結構化和 AI 生成的數據),並且需要考慮現有和未來的數據安全、治理和 AI 規範。為了保護您的數據,您需要採取一些最佳實踐和預防措施,例如: + +- 使用提供資料保護和隱私功能的雲端服務或平台。 +- 使用資料品質和驗證工具檢查資料中的錯誤、不一致或異常。 +- 使用資料治理和倫理框架確保資料以負責和透明的方式使用。 + +### 模擬真實世界威脅 - AI 紅隊測試 + +模擬現實世界的威脅現在被認為是在建構有韌性的 AI 系統中的標準做法,通過使用類似的工具、策略、程序來識別系統的風險並測試防禦者的反應。 + +> AI 紅隊的實踐已經演變為一個更廣泛的意義: 它不僅涵蓋探測安全漏洞,還包括探測其他系統故障,例如生成潛在有害內容。AI 系統帶來了新的風險,紅隊是理解這些新風險的核心,例如提示注入和生成無根據的內容。 - [Microsoft AI Red Team building future of safer AI](https://www.microsoft.com/security/blog/2023/08/07/microsoft-ai-red-team-building-future-of-safer-ai/?WT.mc_id=academic-105485-koreyst) + +[![紅隊測試的指南和資源](../../images/13-AI-red-team.png?WT.mc_id=academic-105485-koreyst)]() + +以下是塑造微軟 AI 紅隊計劃的關鍵見解。 + +1. **AI 紅隊測試的廣泛範圍:** + AI 紅隊測試現在涵蓋了安全性和負責任 AI (RAI) 的結果。傳統上,紅隊測試專注於安全性方面,將模型視為一個向量(例如,竊取底層模型)。然而,AI 系統引入了新的安全漏洞(例如,提示注入、污染),需要特別注意。除了安全性之外,AI 紅隊測試還探討公平性問題(例如,刻板印象)和有害內容(例如,美化暴力)。早期識別這些問題可以優先考慮防禦投資。 +2. **惡意和良性失敗:** + AI 紅隊測試從惡意和良性兩個角度考慮失敗。例如,在對新 Bing 進行紅隊測試時,我們不僅探討惡意對手如何顛覆系統,還探討普通用戶如何遇到問題或有害內容。與傳統的安全紅隊測試主要專注於惡意行為者不同,AI 紅隊測試考慮了更廣泛的人物角色和潛在的失敗。 +3. **AI 系統的動態性:** + AI 應用程序不斷演變。在大型語言模型應用中,開發人員適應不斷變化的需求。持續的紅隊測試確保了對不斷變化的風險的持續警惕和適應。 + +AI 紅隊測試並非包羅萬象,應被視為補充其他控制措施的輔助手段,例如[基於角色的存取控制 (RBAC)](https://learn.microsoft.com/azure/ai-services/openai/how-to/role-based-access-control?WT.mc_id=academic-105485-koreyst)和綜合數據管理解決方案。它旨在補充一種安全策略,該策略專注於使用安全且負責任的 AI 解決方案,考慮到隱私和安全,同時努力減少偏見、有害內容和錯誤資訊,這些都可能削弱用戶信心。 + +以下是一些額外閱讀的資料,可以幫助你更好地了解紅隊如何幫助識別和減輕你的 AI 系統中的風險: + +- [大型語言模型(LLMs)及其應用的紅隊計劃](https://learn.microsoft.com/azure/ai-services/openai/concepts/red-teaming?WT.mc_id=academic-105485-koreyst) +- [什麼是 OpenAI 紅隊網絡?](https://openai.com/blog/red-teaming-network?WT.mc_id=academic-105485-koreyst) +- [AI 紅隊 - 建構更安全和更負責任的 AI 解決方案的關鍵實踐](https://rodtrent.substack.com/p/ai-red-teaming?WT.mc_id=academic-105485-koreyst) +- MITRE [ATLAS (人工智慧系統的對抗性威脅景觀)](https://atlas.mitre.org/?WT.mc_id=academic-105485-koreyst), 一個記錄在現實世界中對 AI 系統進行攻擊的對手所使用的戰術和技術的知識庫。 + +## 知識檢查 + +保持資料完整性和防止濫用的好方法是什麼? + +1. 具有強大的基於角色的資料存取和資料管理控制 +1. 實施和審核資料標籤,以防止資料誤導或濫用 +1. 確保您的 AI 基礎設施支持內容過濾 + +A:1, 雖然這三個都是很好的建議,但確保你為用戶分配了適當的資料存取權限將大大有助於防止LLM使用的資料被操縱和誤導。 + +## 🚀 挑戰 + +了解更多有關如何在 AI 時代[管理和保護敏感資訊](https://learn.microsoft.com/training/paths/purview-protect-govern-ai/?WT.mc_id=academic-105485-koreyst)。 + +## 很棒的工作,繼續學習 + +完成本課程後,請查看我們的[生成式 AI 學習集合](https://aka.ms/genai-collection?WT.mc_id=academic-105485-koreyst)以繼續提升您的生成式 AI 知識! + +前往第14課,我們將查看[生成式AI應用程式生命週期](../../../14-the-generative-ai-application-lifecycle/translations/tw/README.md?WT.mc_id=academic-105485-koreyst)! + diff --git a/14-the-generative-ai-application-lifecycle/translations/tw/README.md b/14-the-generative-ai-application-lifecycle/translations/tw/README.md new file mode 100644 index 000000000..48913babf --- /dev/null +++ b/14-the-generative-ai-application-lifecycle/translations/tw/README.md @@ -0,0 +1,87 @@ +[![與函式呼叫整合](../../images/14-lesson-banner.png?WT.mc_id=academic-105485-koreyst)](https://aka.ms/gen-ai-lesson14-gh?WT.mc_id=academic-105485-koreyst) + +# 生成式 AI 應用程式生命週期 + +一個所有 AI 應用程式的重要問題是 AI 功能的相關性,因為 AI 是一個快速發展的領域,為了確保你的應用程式保持相關性、可靠性和穩健性,你需要持續監控、評估和改進它。這就是生成式 AI 生命週期的作用所在。 + +生成式 AI 生命週期是一個框架,指導你完成開發、部署和維護生成式 AI 應用程式的各個階段。它幫助你定義目標、衡量績效、識別挑戰並實施解決方案。它還幫助你將應用程式與你的領域和利益相關者的倫理和法律標準對齊。通過遵循生成式 AI 生命週期,你可以確保你的應用程式始終提供價值並滿足用戶需求。 + +## 簡介 + +在本章中,你將: + +- 了解從 MLOps 到 LLMOps 的範式轉變 +- LLM 生命週期 +- 生命週期工具 +- 生命週期度量和評估 + +## 了解從 MLOps 到 LLMOps 的範式轉變 + +LLMs 是人工智慧武器庫中的一個新工具,它們在應用程式的分析和生成任務中非常強大,然而這種力量在我們簡化 AI 和經典機器學習任務的方式上有一些後果。 + +隨著這一點,我們需要一個新的範式來動態地適應這個工具,並提供正確的激勵。我們可以將舊的 AI 應用程式分類為「ML 應用程式」,而將新的 AI 應用程式分類為「GenAI 應用程式」或簡稱「AI 應用程式」,以反映當時使用的主流技術和方法。這在多方面改變了我們的敘述,請看以下比較。 + +![LLMOps vs. MLOps 比較](../../images/01-llmops-shift.png?WT.mc_id=academic-105485-koreys) + +注意,在 LLMOps 中,我們更專注於應用程式開發人員,使用整合作為關鍵點,使用「模型即服務」,並考慮以下指標。 + +- 品質: 回應品質 +- 傷害: 負責任的 AI +- 誠實: 回應的合理性(有道理嗎?正確嗎?) +- 成本: 解決方案預算 +- 延遲: 每個 token 回應的平均時間 + +## LLM 生命週期 + +首先,為了了解生命週期和修改,讓我們注意下一個資訊圖表。 + +![LLMOps 資訊圖](../../images/02-llmops.png?WT.mc_id=academic-105485-koreys) + +如你所見,這與通常的 MLOps 生命週期不同。LLM 有許多新的需求,如提示、不同的技術來提高品質(微調、RAG、Meta-Prompts)、負責任 AI 的不同評估和責任,最後是新的評估指標(品質、危害、誠實、成本和延遲)。 + +例如,看看我們如何構思。使用提示工程來實驗各種大型語言模型,以探索可能性來測試他們的假設是否正確。 + +請注意,這不是線性的,而是整合的迴圈、反覆進行並具有一個總體循環。 + +我們如何探索這些步驟?讓我們詳細了解如何建構一個生命週期。 + +![LLMOps 工作流程](../../images/03-llm-stage-flows.png?WT.mc_id=academic-105485-koreys) + +這可能看起來有點複雜,讓我們先專注於三個大步驟。 + +1. 構思/探索: 探索, 在這裡我們可以根據業務需求進行探索。原型設計, 建立一個 [PromptFlow](https://microsoft.github.io/promptflow/index.html?WT.mc_id=academic-105485-koreyst) 並測試其是否對我們的假設足夠有效。 +1. 建構/增強: 實施, 現在, 我們開始評估更大的數據集實施技術, 如微調和RAG, 以檢查我們解決方案的穩健性。如果不夠, 重新實施它, 在流程中添加新步驟或重構數據, 可能會有所幫助。在測試我們的流程和規模後, 如果有效並檢查我們的指標, 它就準備好進入下一步。 +1. 操作化: 整合, 現在添加監控和警報系統到我們的系統, 部署和應用整合到我們的應用程式。 + +然後,我們有管理的總體循環,專注於安全性、合規性和治理。 + +恭喜你,現在你的 AI 應用程式已準備好並可以運行。要獲得實際操作經驗,請查看[Contoso Chat 展示](https://nitya.github.io/contoso-chat/?WT.mc_id=academic-105485-koreys)。 + +現在,我們可以使用哪些工具? + +## 生命週期工具 + +為了工具,Microsoft 提供了[Azure AI Platform](https://azure.microsoft.com/solutions/ai/?WT.mc_id=academic-105485-koreys)和[PromptFlow](https://microsoft.github.io/promptflow/index.html?WT.mc_id=academic-105485-koreyst),以促進並使您的循環易於實施並隨時可用。 + +[Azure AI Platform](https://azure.microsoft.com/solutions/ai/?WT.mc_id=academic-105485-koreys) 讓你可以使用 [AI Studio](https://ai.azure.com/?WT.mc_id=academic-105485-koreys)。AI Studio 是一個網頁入口,讓你可以探索模型、範例和工具。管理你的資源、UI 開發流程和 SDK/CLI 選項以進行程式碼優先的開發。 + +![Azure AI possibilities](../../images/04-azure-ai-platform.png?WT.mc_id=academic-105485-koreys) + +Azure AI,允許您使用多個資源,來管理您的操作、服務、專案、向量搜尋和資料庫需求。 + +![LLMOps 與 Azure AI](../../images/05-llm-azure-ai-prompt.png?WT.mc_id=academic-105485-koreys) + +從概念驗證(POC)到大規模應用的構建,使用 PromptFlow: + +- 從 VS Code 設計和建構應用程式,使用視覺和功能工具 +- 測試和微調您的應用程式,以輕鬆達到高品質 AI。 +- 使用 Azure AI Studio 與雲端整合和迭代,快速推送和部署以進行整合。 + +![LLMOps 與 PromptFlow](../../images/06-llm-promptflow.png?WT.mc_id=academic-105485-koreys) + +## 太棒了!繼續學習! + +Amazing, 現在了解更多我們如何結構一個應用程式來使用這些概念,請參考 [Contoso Chat App](https://nitya.github.io/contoso-chat/?WT.mc_id=academic-105485-koreyst),以檢查 Cloud Advocacy 如何在展示中添加這些概念。欲了解更多內容,請查看我們的 [Ignite breakout session](https://www.youtube.com/watch?v=DdOylyrTOWg)! + +現在,查看第15課,了解[檢索增強生成和向量資料庫](../../../15-rag-and-vector-databases/translations/tw/README.md?WT.mc_id=academic-105485-koreyst)如何影響生成式AI並製作更具吸引力的應用程式! + diff --git a/15-rag-and-vector-databases/translations/tw/README.md b/15-rag-and-vector-databases/translations/tw/README.md new file mode 100644 index 000000000..0ce92b590 --- /dev/null +++ b/15-rag-and-vector-databases/translations/tw/README.md @@ -0,0 +1,268 @@ +# 檢索增強生成(RAG)和向量資料庫 + +[![檢索增強生成 (RAG) 和向量資料庫](../../images/15-lesson-banner.png?WT.mc_id=academic-105485-koreyst)](https://aka.ms/gen-ai-lesson15-gh?WT.mc_id=academic-105485-koreyst) + +在搜尋應用課程中,我們簡要學習了如何將自己的資料整合到大型語言模型(LLMs)中。在本課程中,我們將深入探討在LLM應用中將資料基礎化的概念、過程的機制以及儲存資料的方法,包括嵌入和文本。 + +> **影片即將推出** + +## 簡介 + +在本課程中,我們將涵蓋以下內容: + +- 介紹 RAG,它是什麼以及為什麼在 AI(人工智慧)中使用它。 + +- 了解什麼是向量資料庫並為我們的應用程式建立一個。 + +- 一個關於如何將 RAG 整合到應用程式中的實際範例。 + +## 學習目標 + +完成本課程後,你將能夠: + +- 解釋 RAG 在資料檢索和處理中的重要性。 + +- 設定 RAG 應用並將您的資料接入 LLM + +- 在 LLM 應用中有效整合 RAG 和向量資料庫。 + +## 我們的場景: 使用我們自己的資料增強我們的 LLMs + +為了這節課,我們希望將我們自己的筆記添加到教育創業中,這樣可以讓聊天機器人獲取更多關於不同主題的資訊。使用我們已有的筆記,學習者將能夠更好地學習和理解不同的主題,使他們更容易復習考試。要建立我們的情境,我們將使用: + +- `Azure OpenAI:` 我們將用來建立我們聊天機器人的 LLM + +- `AI for beginners' lesson on Neural Networks`: 這將是我們 LLM 的基礎資料 + +- `Azure AI Search` 和 `Azure Cosmos DB:` 用來儲存我們資料並建立搜尋索引的向量資料庫 + +使用者將能夠從他們的筆記中建立練習測驗、修訂抽認卡並將其摘要為簡明的概述。要開始,讓我們看看什麼是 RAG 以及它如何運作: + +## 檢索增強生成 (RAG) + +LLM 驅動的聊天機器人處理用戶提示以生成回應。它被設計為互動的,並與用戶在廣泛的主題上進行交流。然而,它的回應僅限於提供的上下文和其基礎訓練數據。例如,GPT-4 的知識截止於 2021 年 9 月,這意味著它缺乏對此期間之後發生的事件的了解。此外,用於訓練 LLM 的數據排除了機密資訊,如個人筆記或公司的產品手冊。 + +### RAGs(檢索增強生成)的工作原理 + +![圖示顯示 RAGs 的工作原理](../../images/how-rag-works.png?WT.mc_id=academic-105485-koreyst) + +假設你想要部署一個從筆記中建立測驗的聊天機器人,你將需要連接到知識庫。這就是 RAG 派上用場的地方。RAG 的運作方式如下: + +- **知識庫:** 在檢索之前,這些文件需要被攝取和預處理,通常是將大型文件分解成較小的部分,將它們轉換為文本嵌入並存儲在資料庫中。 + +- **用戶查詢:** 用戶提出問題 + +- **檢索:** 當用戶提出問題時,嵌入模型會從我們的知識庫中檢索相關資訊,以提供更多將被納入提示的上下文。 + +- **增強生成:** LLM 根據檢索到的數據增強其回應。這使得生成的回應不僅基於預訓練數據,還基於新增上下文中的相關資訊。檢索到的數據用於增強 LLM 的回應。然後 LLM 向用戶的問題返回答案。 + +![drawing showing how RAGs architecture](../../images/encoder-decode.png?WT.mc_id=academic-105485-koreyst) + +RAGs 的架構是使用由兩部分組成的 transformers 實現的: 一個編碼器和一個解碼器。例如,當使用者提出問題時,輸入文字會被「編碼」成捕捉單詞意義的向量,這些向量會被「解碼」到我們的文件索引中,並根據使用者查詢生成新文字。LLM 使用編碼器-解碼器模型來生成輸出。 + +根據提議的論文:[Retrieval-Augmented Generation for Knowledge intensive NLP (natural language processing software) Tasks](https://arxiv.org/pdf/2005.11401.pdf?WT.mc_id=academic-105485-koreyst)實現 RAG 的兩種方法是: + +- **_RAG-Sequence_** 使用檢索到的文件來預測對用戶查詢的最佳答案 + +- **RAG-Token** 使用文件生成下一個標記,然後檢索它們來回答用戶的查詢 + +### 為什麼要使用 RAGs? + +- **資訊豐富度:** 確保文字回應是最新且符合現況。因此,通過訪問內部知識庫來增強在特定領域任務上的表現。 + +- 通過利用知識庫中的**可驗證數據**來減少捏造,為用戶查詢提供上下文。 + +- 它是**成本效益**的,因為與微調LLM相比,它們更經濟。 + +## 建立知識庫 + +我們的應用程式基於我們的個人資料,即 AI 初學者課程中的神經網路課程。 + +### 向量資料庫 + +一個向量資料庫,不同於傳統資料庫,是一種專門設計來儲存、管理和搜尋嵌入向量的資料庫。它儲存文件的數值表示。將資料分解為數值嵌入使我們的 AI 系統更容易理解和處理這些資料。 + +我們將嵌入儲存在向量資料庫中,因為LLM有接受作為輸入的token數量限制。由於無法將整個嵌入傳遞給LLM,我們需要將它們分解成塊,當使用者問問題時,最像問題的嵌入將與提示一起返回。分塊還可以減少通過LLM傳遞的token數量的成本。 + +一些流行的向量資料庫包括 Azure Cosmos DB、Clarifyai、Pinecone、Chromadb、ScaNN、Qdrant 和 DeepLake。你可以使用以下命令透過 Azure CLI 建立一個 Azure Cosmos DB 模型: + +```bash +az login +az group 建立 -n -l +az cosmosdb 建立 -n -r +az cosmosdb list-keys -n -g +``` + +### 從文本到嵌入 + +在我們儲存資料之前,我們需要先將其轉換為向量嵌入,然後再儲存在資料庫中。如果你正在處理大型文件或長文本,可以根據預期的查詢將它們分塊。分塊可以在句子層級或段落層級進行。由於分塊從周圍的詞語中衍生出意義,你可以為分塊添加一些其他的上下文,例如,添加文件標題或在分塊前後包含一些文本。你可以按如下方式分塊資料: + +```python +def split_text(文字, 最大長度, 最小長度): + 單詞 = 文字.split() + 塊 = [] + 當前塊 = [] + + for 單詞 in 單詞: + 當前塊.append(單詞) + if len(' '.join(當前塊)) < 最大長度 and len(' '.join(當前塊)) > 最小長度: + 塊.append(' '.join(當前塊)) + 當前塊 = [] + + # 如果最後一塊沒有達到最小長度,無論如何都要添加 + if 當前塊: + 塊.append(' '.join(當前塊)) + + return 塊 +``` + +一旦分塊後,我們可以使用不同的嵌入模型來嵌入我們的文本。您可以使用的一些模型包括: word2vec、OpenAI 的 ada-002、Azure Computer Vision 等等。選擇使用的模型將取決於您使用的語言、編碼的內容類型(文本/圖像/音頻)、它可以編碼的輸入大小以及嵌入輸出的長度。 + +範例使用 OpenAI 的 `text-embedding-ada-002` 模型嵌入文字如下: +![an embedding of the word cat](../../images/cat.png?WT.mc_id=academic-105485-koreyst) + +## 檢索和向量搜尋 + +當使用者提出問題時,檢索器會使用查詢編碼器將其轉換為向量,然後在我們的文件搜尋索引中搜尋與輸入相關的向量。完成後,它會將輸入向量和文件向量轉換為文字,並通過 LLM。 + +### 檢索 + +檢索發生在系統嘗試從索引中快速找到滿足搜索標準的文件時。檢索器的目標是獲取將用於提供上下文並基於您的數據定位LLM的文件。 + +在我們的資料庫中執行搜尋有幾種方法,例如: + +- **關鍵字搜尋** - 用於文字搜尋 + +- **語意搜尋** - 使用單詞的語意 + +- **向量搜尋** - 使用嵌入模型將文件從文字轉換為向量表示。檢索將通過查詢向量表示最接近用戶問題的文件來完成。 + +- **混合** - 關鍵字搜尋和向量搜尋的結合。 + +在資料庫中沒有與查詢相似的回應時,檢索會面臨挑戰,系統將返回他們能獲得的最佳資訊。然而,你可以使用一些策略,比如設定相關性的最大距離或使用結合關鍵字和向量搜索的混合搜索。在本課中,我們將使用混合搜索,結合向量和關鍵字搜索。我們將把數據存儲到一個數據框中,列包含了數據塊以及嵌入。 + +### 向量相似度 + +檢索器將在知識資料庫中搜尋相近的嵌入,最接近的鄰居,因為它們是相似的文本。在使用者提出查詢的情況下,首先會嵌入查詢,然後與相似的嵌入進行匹配。用來衡量不同向量相似度的常見方法是基於兩個向量之間角度的余弦相似度。 + +我們可以使用其他替代方法來測量相似性,例如歐幾里得距離(即向量端點之間的直線)和點積(測量兩個向量對應元素的乘積之和)。 + +### 搜尋索引 + +在進行檢索時,我們需要在執行搜尋之前為我們的知識庫建構一個搜尋索引。索引將儲存我們的嵌入並且即使在大型資料庫中也能快速檢索到最相似的區塊。我們可以使用以下方式在本地建立我們的索引: + +```python +from sklearn.neighbors import NearestNeighbors + +embeddings = flattened_df['embeddings'].to_list() + +# 建立搜尋索引 +nbrs = NearestNeighbors(n_neighbors=5, algorithm='ball_tree').fit(embeddings) + +# 要查詢索引,可以使用 kneighbors 方法 +distances, indices = nbrs.kneighbors(embeddings) +``` + +### 重新排序 + +一旦你查詢了資料庫,你可能需要將結果從最相關的排序。一個重新排序的LLM利用機器學習通過將搜索結果從最相關的排序來提高其相關性。使用Azure AI Search,重新排序會自動為你完成,使用語義重新排序器。以下是一個使用最近鄰重新排序如何工作的範例: + +```python +# 找到最相似的文件 +distances, indices = nbrs.kneighbors([query_vector]) + +index = [] +# 列印最相似的文件 +for i in range(3): + index = indices[0][i] + for index in indices[0]: + print(flattened_df['chunks'].iloc[index]) + print(flattened_df['path'].iloc[index]) + print(flattened_df['distances'].iloc[index]) + else: + print(f"Index {index} not found in DataFrame") +``` + +## 將所有內容整合在一起 + +最後一步是將我們的 LLM 添加到混合中,以便能夠獲得基於我們資料的回應。我們可以如下實現: + +```python +user_input = "什麼是感知器?" + +def chatbot(user_input): + # 將問題轉換為查詢向量 + query_vector = create_embeddings(user_input) + + # 找到最相似的文件 + distances, indices = nbrs.kneighbors([query_vector]) + + # 將文件添加到查詢中以提供上下文 + history = [] + for index in indices[0]: + history.append(flattened_df['chunks'].iloc[index]) + + # 結合歷史記錄和用戶輸入 + history.append(user_input) + + # 建立一個訊息物件 + messages=[ + {"role": "system", "content": "你是一個幫助解答 AI 問題的 AI 助手。"}, + {"role": "user", "content": history[-1]} + ] + + # 使用聊天完成來生成回應 + response = openai.chat.completions.create( + model="gpt-4", + temperature=0.7, + max_tokens=800, + messages=messages + ) + + return response.choices[0].message + +chatbot(user_input) +``` + +## 評估我們的應用程式 + +### 評估指標 + +- 回應的品質確保其聽起來自然、流暢且像人類 + +- 資料的基礎性: 評估回應是否來自提供的文件 + +- 相關性: 評估回應是否符合並與所問問題相關 + +- 流暢度 - 回應在語法上是否合理 + +## 使用 RAG (檢索增強生成) 和向量資料庫的用例 + +在許多不同的使用案例中,函式呼叫可以改善您的應用程式,例如: + +- 問答: 將公司的資料基礎連結到一個可以讓員工提問的聊天中。 + +- 推薦系統: 你可以建立一個系統來匹配最相似的值,例如電影、餐廳等等。 + +- 聊天機器人服務: 你可以儲存聊天歷史並根據使用者資料個性化對話。 + +- 基於向量嵌入的圖片搜尋,在進行圖像識別和異常檢測時非常有用。 + +## 摘要 + +我們已經涵蓋了從將資料添加到應用程式、使用者查詢和輸出的RAG基本領域。為了簡化RAG的建立,你可以使用如Semanti Kernel、Langchain或Autogen等框架。 + +## 作業 + +要繼續學習檢索增強生成(RAG),你可以建構: + +- 使用您選擇的框架為應用程式建構前端 + +- 利用框架(LangChain 或 Semantic Kernel)重新建構您的應用程式。 + +恭喜完成這節課 👏。 + +## 學習不止於此,繼續旅程 + +完成本課程後,請查看我們的[生成式 AI 學習集合](https://aka.ms/genai-collection?WT.mc_id=academic-105485-koreyst)以繼續提升您的生成式 AI 知識! + diff --git a/16-open-source-models/translations/tw/README.md b/16-open-source-models/translations/tw/README.md new file mode 100644 index 000000000..a75f7eab9 --- /dev/null +++ b/16-open-source-models/translations/tw/README.md @@ -0,0 +1,80 @@ +[![開放原始碼模型](../../images/16-lesson-banner.png?WT.mc_id=academic-105485-koreyst)](https://aka.ms/gen-ai-lesson16-gh?WT.mc_id=academic-105485-koreyst) + +## 簡介 + +開放原始碼 LLMs 的世界令人興奮且不斷演變。本課程旨在深入了解開放原始碼模型。如果您正在尋找有關專有模型與開放原始碼模型比較的資訊,請參閱["探索和比較不同的 LLMs" 課程](../../../02-exploring-and-comparing-different-llms/translations/tw/README.md?WT.mc_id=academic-105485-koreyst)。本課程還將涵蓋微調的主題,但更詳細的解釋可以在["微調 LLMs" 課程](../../../18-fine-tuning/translations/tw/README.md?WT.mc_id=academic-105485-koreyst)中找到。 + +## 學習目標 + +- 瞭解開放原始碼模型 +- 瞭解使用開放原始碼模型的好處 +- 探索 Hugging Face 和 Azure AI Studio 上可用的開放模型 + +## 什麼是開放原始碼模型? + +開放原始碼軟體在各個領域的技術發展中扮演了至關重要的角色。開放原始碼倡議(OSI)已經定義了[軟體的10個標準](https://opensource.org/osd?WT.mc_id=academic-105485-koreyst),以將其歸類為開放原始碼。源程式碼必須在OSI批准的許可下公開共享。 + +雖然 LLMs 的開發與軟體開發有相似的元素,但過程並不完全相同。這在社群中引發了許多關於 LLMs 背景下開放原始碼定義的討論。要使模型符合傳統的開放原始碼定義,以下資訊應該公開可用: + +- 用於訓練模型的數據集。 +- 作為訓練的一部分的完整模型權重。 +- 評估程式碼。 +- 微調程式碼。 +- 完整模型權重和訓練指標。 + +目前只有少數模型符合此標準。[由Allen Institute for Artificial Intelligence (AllenAI) 創建的OLMo模型](https://huggingface.co/allenai/OLMo-7B?WT.mc_id=academic-105485-koreyst) 就是其中之一。 + +在本課程中,我們將這些模型稱為「開放模型」,因為在撰寫時它們可能不符合上述標準。 + +## 開放模型的好處 + +**高度可定制** - 由於開放模型發布時附有詳細的訓練資訊,研究人員和開發人員可以修改模型的內部結構。這使得能夠建立即高度專門化的模型,針對特定任務或研究領域進行微調。一些範例包括程式碼產生器、數學運算和生物學。 + +**成本** - 使用和部署這些模型的每個 token 成本低於專有模型。在建構生成式 AI 應用程式時,應該在您的使用案例中考量這些模型的性能與價格。 + +![Model Cost](../../images/model-price.png?WT.mc_id=academic-105485-koreyst) +來源: 人工分析 + +**靈活性** - 使用開放模型使您在使用不同模型或結合它們方面更加靈活。一個範例是 [HuggingChat Assistants](https://huggingface.co/chat?WT.mc_id=academic-105485-koreyst),用戶可以直接在使用者介面中選擇所使用的模型: + +![選擇模型](../../images/choose-model.png?WT.mc_id=academic-105485-koreyst) + +## 探索不同的開放模型 + +### Llama 2 + +[LLama2](https://huggingface.co/meta-llama?WT.mc_id=academic-105485-koreyst), 由 Meta 開發,是一個針對聊天應用程式最佳化的開放模型。這是由於其微調方法,包括大量的對話和人類反饋。通過這種方法,模型產生更多符合人類期望的結果,從而提供更好的用戶體驗。 + +一些經過微調的Llama版本範例包括專門用於日語的[Japanese Llama](https://huggingface.co/elyza/ELYZA-japanese-Llama-2-7b?WT.mc_id=academic-105485-koreyst)和增強版基礎模型的[Llama Pro](https://huggingface.co/TencentARC/LLaMA-Pro-8B?WT.mc_id=academic-105485-koreyst)。 + +### Mistral + +[Mistral](https://huggingface.co/mistralai?WT.mc_id=academic-105485-koreyst)是一個專注於高效能和效率的開放模型。它使用專家混合方法,將一組專門的專家模型組合成一個系統,根據輸入選擇特定的模型來使用。這使得計算更加有效,因為模型只處理它們專門的輸入。 + +一些微調版本的Mistral範例包括專注於醫療領域的[BioMistral](https://huggingface.co/BioMistral/BioMistral-7B?text=Mon+nom+est+Thomas+et+mon+principal?WT.mc_id=academic-105485-koreyst)和進行數學計算的[OpenMath Mistral](https://huggingface.co/nvidia/OpenMath-Mistral-7B-v0.1-hf?WT.mc_id=academic-105485-koreyst)。 + +### Falcon + +[Falcon](https://huggingface.co/tiiuae?WT.mc_id=academic-105485-koreyst) 是由技術創新研究所(**TII**)創建的 LLM。Falcon-40B 在 400 億個參數上進行了訓練,已顯示出在較少計算預算下比 GPT-3 表現更好。這是由於其使用了 FlashAttention 演算法和多查詢注意力,使其能夠在推論時減少記憶體需求。由於這種減少的推論時間,Falcon-40B 適用於聊天應用程式。 + +一些 Falcon 微調版本的範例包括 [OpenAssistant](https://huggingface.co/OpenAssistant/falcon-40b-sft-top1-560?WT.mc_id=academic-105485-koreyst),一個基於開放模型的助手和 [GPT4ALL](https://huggingface.co/nomic-ai/gpt4all-falcon?WT.mc_id=academic-105485-koreyst),其性能高於基礎模型。 + +## 如何選擇 + +選擇開放模型沒有唯一的答案。一個好的開始是使用 Azure AI Studio 的任務篩選功能。這將幫助你了解模型已經被訓練用於哪些類型的任務。Hugging Face 也維護了一個 LLM 排行榜,顯示基於某些指標的最佳表現模型。 + +在比較不同類型的LLM時,[Artificial Analysis](https://artificialanalysis.ai/?WT.mc_id=academic-105485-koreyst) 是另一個很好的資源: + +![模型品質](../../images/model-quality.png?WT.mc_id=academic-105485-koreyst) +來源: 人工分析 + +如果處理特定用例,搜尋專注於相同領域的微調版本可能會很有效。嘗試多個開放模型,看看它們如何根據你和你的用戶的期望表現,也是另一個好做法。 + +## 下一步 + +開放模型最棒的部分是你可以很快地開始使用它們。查看 [Azure AI Studio Model Catalog](https://ai.azure.com?WT.mc_id=academic-105485-koreyst),其中包含我們在此討論的特定 Hugging Face 集合。 + +## 學習不止於此,繼續旅程 + +完成本課程後,請查看我們的[生成式 AI 學習集合](https://aka.ms/genai-collection?WT.mc_id=academic-105485-koreyst)以繼續提升您的生成式 AI 知識! + diff --git a/17-ai-agents/translations/tw/README.md b/17-ai-agents/translations/tw/README.md new file mode 100644 index 000000000..fbafe93cb --- /dev/null +++ b/17-ai-agents/translations/tw/README.md @@ -0,0 +1,161 @@ +[![開放原始碼模型](../../images/17-lesson-banner.png?WT.mc_id=academic-105485-koreyst)](https://aka.ms/gen-ai-lesson17-gh?WT.mc_id=academic-105485-koreyst) + +## 簡介 + +AI代理代表了生成式AI的一個令人興奮的發展,使大型語言模型(LLMs)從助手演變為能夠採取行動的代理。AI代理框架使開發者能夠建立應用程式,讓LLMs能夠訪問工具和狀態管理。這些框架還增強了可見性,使用戶和開發者能夠監控LLMs計劃的行動,從而改善體驗管理。 + +這節課將涵蓋以下領域: + +- 理解什麼是 AI Agent - AI Agent 到底是什麼? +- 探索四種不同的 AI Agent 框架 - 它們有什麼獨特之處? +- 將這些 AI Agent 應用於不同的使用案例 - 我們應該何時使用 AI Agent? + +## 學習目標 + +完成這節課後,你將能夠: + +- 解釋什麼是 AI 代理以及它們如何使用。 +- 了解一些流行的 AI 代理框架之間的差異,以及它們的不同之處。 +- 了解 AI 代理如何運作,以便使用它們建構應用程式。 + +## 什麼是 AI 代理? + +AI代理是一個在生成式AI世界中非常令人興奮的領域。隨著這種興奮,有時會出現術語和其應用的混淆。為了保持簡單並包含大多數提到AI代理的工具,我們將使用這一定義: + +AI Agents 允許大型語言模型(LLMs)透過提供**狀態**和**工具**來執行任務。 + +![代理模型](../../images/what-agent.png?WT.mc_id=academic-105485-koreyst) + +讓我們定義這些術語: + +**大型語言模型** - 這些是本課程中提到的模型,例如 GPT-3.5、GPT-4、Llama-2 等。 + +**狀態** - 這指的是LLM正在工作的上下文。LLM使用其過去行動的上下文和當前上下文,指導其後續行動的決策。AI代理框架允許開發人員更容易地維護此上下文。 + +**工具** - 為了完成使用者請求的任務以及 LLM 所規劃的任務,LLM 需要訪問工具。一些工具的範例可以是資料庫、API、外部應用程式甚至是另一個 LLM! + +這些定義希望能在我們了解它們如何實現時,為你打下良好的基礎。讓我們來探索幾個不同的 AI Agent 框架: + +## LangChain Agents + +[LangChain Agents](https://python.langchain.com/docs/modules/agents/?WT.mc_id=academic-105485-koreyst) 是我們上述定義的實現。 + +要管理**狀態**,它使用一個名為 `AgentExecutor` 的內建函式。這個函式接受定義的 `agent` 和可用的 `tools`。 + +`Agent Executor` 也儲存聊天記錄以提供聊天的上下文。 + +![Langchain Agents](../../images/langchain-agents.png?WT.mc_id=academic-105485-koreyst) + +LangChain 提供一個[工具目錄](https://integrations.langchain.com/tools?WT.mc_id=academic-105485-koreyst),可以匯入到您的應用程式中,LLM 可以存取這些工具。這些工具由社群和 LangChain 團隊製作。 + +然後你可以定義這些工具並將它們傳遞給 `Agent Executor`。 + +可見性是討論 AI 代理時另一個重要方面。應用程式開發人員需要了解 LLM 使用的是哪種工具以及為什麼。為此,LangChain 團隊開發了 LangSmith。 + +## AutoGen + +下一個我們將討論的 AI Agent 框架是 [AutoGen](https://microsoft.github.io/autogen/?WT.mc_id=academic-105485-koreyst)。AutoGen 的主要焦點是對話。Agents 既是**可對話的**也是**可定制的**。 + +**Conversable -** LLMs 可以啟動並繼續與另一個 LLM 的對話以完成任務。這是通過建立 `AssistantAgents` 並給予它們特定的系統訊息來完成的。 + +```python + +autogen.AssistantAgent( name="Coder", llm_config=llm_config, ) pm = autogen.AssistantAgent( name="Product_manager", system_message="Creative in software product ideas.", llm_config=llm_config, ) + +``` + +**可自訂** - Agent 不僅可以定義為 LLMs,也可以是使用者或工具。作為開發者,你可以定義一個 `UserProxyAgent`,負責與使用者互動以獲取完成任務的反饋。這些反饋可以繼續執行任務或停止它。 + +```python +user_proxy = UserProxyAgent(name="user_proxy") +``` + +### 狀態和工具 + +為了改變和管理狀態,助手代理生成Python程式碼來完成任務。 + +這裡是一個過程的範例: + +![AutoGen](../../images/autogen.png?WT.mc_id=academic-105485-koreyst) + +#### 定義 LLM 的系統訊息 + +```python +system_message="對於天氣相關的任務,只使用提供給你的函式。任務完成後回覆 TERMINATE。" +``` + +此系統訊息指導此特定 LLM 哪些函式與其任務相關。請記住,使用 AutoGen 時,您可以有多個具有不同系統訊息的 AssistantAgents。 + +#### 聊天由使用者發起 + +```python +user_proxy.initiate_chat( chatbot, message="我計劃下週去紐約旅行,你能幫我選擇穿什麼嗎?", ) +``` + +此訊息來自 user_proxy (人類) 是啟動代理探索應執行的可能函式的過程。 + +#### 函式被執行 + +```bash +聊天機器人 (to user_proxy): + +***** 建議的工具呼叫: get_weather ***** 參數: {"location":"New York City, NY","time_periond:"7","temperature_unit":"Celsius"} ******************************************************** -------------------------------------------------------------------------------- + +>>>>>>>> 執行函式 get_weather... user_proxy (to 聊天機器人): ***** 呼叫函式 "get_weather" 的回應 ***** 112.22727272727272 EUR **************************************************************** + +``` + +一旦初始聊天處理完成,代理將發送建議的工具來呼叫。在這種情況下,它是一個名為 `get_weather` 的函式。根據您的配置,這個函式可以由代理自動執行和讀取,或者可以根據用戶輸入來執行。 + +你可以找到[AutoGen 程式碼範例](https://microsoft.github.io/autogen/docs/Examples/?WT.mc_id=academic-105485-koreyst)來進一步探索如何開始建構。 + +## Taskweaver + +接下來我們將探討的代理框架是 [Taskweaver](https://microsoft.github.io/TaskWeaver/?WT.mc_id=academic-105485-koreyst)。它被稱為「程式碼優先」代理,因為它不僅僅是嚴格地與 `strings` 一起工作,它還可以與 Python 中的 DataFrames 一起工作。這對於資料分析和生成任務變得非常有用。這可以是建立圖表或生成隨機數等事情。 + +### 狀態和工具 + +為了管理對話的狀態,TaskWeaver 使用了 `Planner` 的概念。`Planner` 是一個 LLM,它接收用戶的請求並規劃出需要完成的任務,以滿足這些請求。 + +為了完成任務,`Planner` 會接觸到稱為 `Plugins` 的工具集合。這可以是 Python 類別或一般的程式碼解釋器。這些插件被儲存為嵌入,以便 LLM 能夠更好地搜尋正確的插件。 + +![Taskweaver](../../images/taskweaver.png?WT.mc_id=academic-105485-koreyst) + +這裡是一個處理異常檢測的插件範例: + +```python +類別 AnomalyDetectionPlugin(Plugin): def __call__(self, df: pd.DataFrame, time_col_name: str, value_col_name: str): +``` + +程式碼在執行前會被驗證。Taskweaver 中管理上下文的另一個功能是 `experience`。Experience 允許將對話的上下文長期存儲在 YAML 檔案中。這可以配置,使得 LLM 隨著時間的推移在某些任務上有所改進,前提是它接觸到先前的對話。 + +## JARVIS + +最後我們將探討的代理框架是 [JARVIS](https://github.com/microsoft/JARVIS?tab=readme-ov-file?WT.mc_id=academic-105485-koreyst)。JARVIS 的獨特之處在於它使用 LLM 來管理對話的 `state`,而 `tools` 是其他 AI 模型。每個 AI 模型都是專門的模型,執行某些任務,例如物件檢測、轉錄或圖像標註。 + +![JARVIS](../../images/jarvis.png?WT.mc_id=academic-105485-koreyst) + +LLM 作為一個通用模型,接收來自使用者的請求並識別特定任務及完成任務所需的任何參數/資料。 + +```python +[{"task": "物件-detection", "id": 0, "dep": [-1], "args": {"image": "e1.jpg" }}] +``` + +LLM 然後以專門的 AI 模型能夠解釋的方式格式化請求,例如 JSON。一旦 AI 模型根據任務返回其預測,LLM 便會接收回應。 + +如果需要多個模型來完成任務,它還會解釋這些模型的回應,然後將它們整合起來生成對用戶的回應。 + +範例如下顯示當使用者請求描述和計算圖片中的物件時,這將如何運作: + +## 作業 + +為了繼續學習可以使用 AutoGen 建構的 AI 代理: + +- 一個模擬教育初創公司不同部門商務會議的應用程式。 +- 建立系統訊息,引導LLM理解不同角色和優先事項,並使使用者能夠提出新的產品創意。 +- 然後,LLM應從每個部門生成後續問題,以完善和改進提案和產品創意。 + +## 學習不止於此,繼續旅程 + +完成本課程後,請查看我們的[生成式 AI 學習集合](https://aka.ms/genai-collection?WT.mc_id=academic-105485-koreyst)以繼續提升您的生成式 AI 知識! + diff --git a/18-fine-tuning/translations/tw/README.md b/18-fine-tuning/translations/tw/README.md new file mode 100644 index 000000000..54b126a81 --- /dev/null +++ b/18-fine-tuning/translations/tw/README.md @@ -0,0 +1,98 @@ +[![開放原始碼模型](../../img/18-lesson-banner.png?WT.mc_id=academic-105485-koreyst)](https://aka.ms/gen-ai-lesson18-gh?WT.mc_id=academic-105485-koreyst) + +# 微調您的 LLM + +使用大型語言模型來建構生成式 AI 應用程式會帶來新的挑戰。一個關鍵問題是確保模型針對特定使用者請求所生成內容的品質(準確性和相關性)。在之前的課程中,我們討論了提示工程和檢索增強生成等技術,這些技術試圖通過_修改提示輸入_來解決現有模型的問題。 + +在今天的課程中,我們討論了第三種技術,**微調**,這種技術試圖通過_重新訓練模型本身_並使用額外的數據來解決這一挑戰。讓我們深入了解細節。 + +## 學習目標 + +本課程介紹了對預訓練語言模型進行微調的概念,探討了這種方法的優點和挑戰,並提供了何時以及如何使用微調來提高生成式 AI 模型性能的指導。 + +在本課程結束時,你應該能夠回答以下問題: + +- 語言模型的微調是什麼? +- 微調在什麼時候以及為什麼有用? +- 我如何微調一個預訓練模型? +- 微調的限制是什麼? + +準備好了嗎?讓我們開始吧。 + +## 圖解指南 + +想要在深入探討之前了解我們將涵蓋的整體內容嗎?查看這個描述本課程學習旅程的圖解指南 - 從學習核心概念和微調的動機,到了解執行微調任務的過程和最佳實踐。這是一個引人入勝的探索主題,所以別忘了查看[資源](../../RESOURCES.md?WT.mc_id=academic-105485-koreyst)頁面以獲取更多支持自學旅程的連結! + +![語言模型微調圖解指南](../../img/18-fine-tuning-sketchnote.png?WT.mc_id=academic-105485-koreyst) + +## 語言模型的微調是什麼? + +根據定義,大型語言模型是從包括互聯網在內的多種來源獲取的大量文本上進行_預訓練_的。正如我們在之前的課程中所學到的,我們需要像_提示工程_和_檢索增強生成_這樣的技術來提高模型對用戶問題(「提示」)的回應品質。 + +一個流行的提示工程技術涉及通過提供_指示_(明確指導)或_給它一些範例_(隱含指導)來給模型更多關於回應預期的指導。這被稱為_少量學習_,但它有兩個限制: + +- 模型標記限制會限制您能提供的範例數量,並限制效果。 +- 模型標記成本會使在每個提示中添加範例變得昂貴,並限制靈活性。 + +微調是機器學習系統中的一種常見做法,我們採用預訓練模型並使用新數據重新訓練它,以提高其在特定任務上的性能。在語言模型的背景下,我們可以微調預訓練模型_使用為給定任務或應用領域精選的一組範例_來建立一個**自訂模型**,這個模型可能對於該特定任務或領域更準確和相關。微調的一個附帶好處是,它還可以減少少量學習所需的範例數量——減少 token 使用和相關成本。 + +## 何時以及為什麼我們應該微調模型? + +在 _此_ 上下文中,當我們談論微調時,我們指的是**監督式**微調,其中重新訓練是通過**添加新數據**來完成的,這些數據不是原始訓練數據集的一部分。這與無監督微調方法不同,後者是在原始數據上重新訓練模型,但使用不同的超參數。 + +關鍵是要記住,微調是一種需要一定專業知識才能獲得預期結果的高級技術。如果操作不當,它可能不會提供預期的改進,甚至可能降低模型在您目標領域的性能。 + +所以,在你學習「如何」微調語言模型之前,你需要知道「為什麼」你應該選擇這條路,以及「何時」開始微調的過程。首先問自己這些問題: + +- **使用案例**: 你的微調_使用案例_是什麼?你想改進當前預訓練模型的哪個方面? +- **替代方案**: 你是否嘗試過_其他技術_來達到預期結果?使用它們來建立比較的基準。 + - 提示工程: 嘗試使用相關提示回應範例的少量提示技術。評估回應的品質。 + - 檢索增強生成: 嘗試使用檢索數據查詢結果來增強提示。評估回應的品質。 +- **成本**: 你是否已經識別出微調的成本? + - 可調性 - 預訓練模型是否可用於微調? + - 努力 - 準備訓練數據、評估和改進模型的努力。 + - 計算 - 執行微調工作和部署微調模型的計算成本 + - 數據 - 是否有足夠品質的範例來影響微調效果 +- **收益**: 你是否確認了微調的收益? + - 品質 - 微調後的模型是否超越了基準? + - 成本 - 是否通過簡化提示來減少代幣使用? + - 可擴展性 - 你能否將基礎模型重新用於新領域? + +藉由回答這些問題,你應該能夠決定微調是否適合你的使用案例。理想情況下,只有當收益超過成本時,這種方法才是有效的。一旦你決定繼續,就該考慮_如何_微調預訓練模型。 + +想要獲得更多關於決策過程的見解嗎?觀看[是否要微調](https://www.youtube.com/watch?v=0Jo-z-MFxJs) + +## 我們如何微調一個預訓練模型? + +要微調一個預訓練模型,你需要具備: + +- 一個預訓練模型來微調 +- 一個數據集來用於微調 +- 一個訓練環境來執行微調工作 +- 一個託管環境來部署微調後的模型 + +## 微調操作中 + +以下資源提供逐步指南,帶您通過使用精選資料集的選定模型進行真實範例。要完成這些指南,您需要在特定提供者上擁有一個帳戶,並訪問相關的模型和資料集。 + +| Provider | Tutorial | Description | +| ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| OpenAI | [How to fine-tune chat models](https://github.com/openai/openai-cookbook/blob/main/examples/How_to_finetune_chat_models.ipynb?WT.mc_id=academic-105485-koreyst) | 學習如何為特定領域("秘訣助手")微調 `gpt-35-turbo`,包括準備訓練資料、執行微調工作以及使用微調後的模型進行推論。 | +| Azure OpenAI | [GPT 3.5 Turbo fine-tuning tutorial](https://learn.microsoft.com/azure/ai-services/openai/tutorials/fine-tune?tabs=python-new%2Ccommand-line?WT.mc_id=academic-105485-koreyst) | 學習如何在 **Azure** 上微調 `gpt-35-turbo-0613` 模型,包括建立和上傳訓練資料、執行微調工作。部署並使用新模型。 | +| Hugging Face | [Fine-tuning LLMs with Hugging Face](https://www.philschmid.de/fine-tune-llms-in-2024-with-trl?WT.mc_id=academic-105485-koreyst) | 這篇博客文章介紹如何使用 [transformers](https://huggingface.co/docs/transformers/index?WT.mc_id=academic-105485-koreyst) 函式庫和 [Transformer Reinforcement Learning (TRL)](https://huggingface.co/docs/trl/index?WT.mc_id=academic-105485-koreyst) 以及 Hugging Face 上的開放 [datasets](https://huggingface.co/docs/datasets/index?WT.mc_id=academic-105485-koreyst) 來微調 _open LLM_(例如:`CodeLlama 7B`)。 | +| | | | +| 🤗 AutoTrain | [Fine-tuning LLMs with AutoTrain](https://github.com/huggingface/autotrain-advanced/?WT.mc_id=academic-105485-koreyst) | AutoTrain(或 AutoTrain Advanced)是由 Hugging Face 開發的 python 函式庫,允許對許多不同的任務進行微調,包括 LLM 微調。AutoTrain 是一個無需程式碼的解決方案,可以在自己的雲端、Hugging Face Spaces 或本地進行微調。它支持基於網頁的 GUI、CLI 和通過 yaml 配置文件進行訓練。 | +| | | | + +## 作業 + +選擇上面的其中一個指南並逐步完成它們。_我們可能會在這個 Repo 中的 Jupyter Notebooks 中複製這些指南的版本僅供參考。請直接使用原始來源以獲取最新版本_。 + +## 很棒的工作!繼續學習。 + +完成本課程後,請查看我們的[生成式 AI 學習集合](https://aka.ms/genai-collection?WT.mc_id=academic-105485-koreyst)以繼續提升您的生成式 AI 知識! + +恭喜!! 你已經完成了這門課程 v2 系列的最後一課! 不要停止學習和建構。**查看[資源](RESOURCES.md?WT.mc_id=academic-105485-koreyst)頁面,獲取更多關於此主題的建議。 + +我們的 v1 系列課程也已更新了更多的作業和概念。所以花點時間重新整理你的知識 - 並且請[分享你的問題和反饋](https://github.com/microsoft/generative-ai-for-beginners/issues?WT.mc_id=academic-105485-koreyst),以幫助我們改進這些課程,造福社群。 + diff --git a/18-fine-tuning/translations/tw/RESOURCES.md b/18-fine-tuning/translations/tw/RESOURCES.md new file mode 100644 index 000000000..a20f44a4d --- /dev/null +++ b/18-fine-tuning/translations/tw/RESOURCES.md @@ -0,0 +1,38 @@ +# 自學資源 + +這堂課是使用來自 OpenAI 和 Azure OpenAI 的多個核心資源建構的,作為術語和指南的參考。以下是一個非全面的清單,供您自行學習之用。 + +## 1. 主要資源 + +| Title/Link | Description | +| :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| [Fine-tuning with OpenAI Models](https://platform.openai.com/docs/guides/fine-tuning?WT.mc_id=academic-105485-koreyst) | 微調通過在提示中訓練更多範例來改進少量學習,節省成本,提高回應品質,並實現低延遲請求。**了解來自OpenAI的微調概述**。 | +| [What is Fine-Tuning with Azure OpenAI?](https://learn.microsoft.com/azure/ai-services/openai/concepts/fine-tuning-considerations#what-is-fine-tuning-with-azure-openai?WT.mc_id=academic-105485-koreyst) | 了解**什麼是微調(概念)**,為什麼你應該關注它(激勵問題),使用什麼數據(訓練)和衡量品質 | +| [Customize a model with fine-tuning](https://learn.microsoft.com/azure/ai-services/openai/how-to/fine-tuning?tabs=turbo%2Cpython&pivots=programming-language-studio#continuous-fine-tuning?WT.mc_id=academic-105485-koreyst) | Azure OpenAI服務允許你使用微調來定制我們的模型以適應你的個人數據集。了解**如何使用Azure AI Studio、Python SDK或REST API進行微調(過程)**選擇模型。 | +| [Recommendations for LLM fine-tuning](https://learn.microsoft.com/ai/playbook/technology-guidance/generative-ai/working-with-llms/fine-tuning-recommend?WT.mc_id=academic-105485-koreyst) | LLMs在特定領域、任務或數據集上可能表現不佳,或可能產生不準確或誤導性的輸出。**什麼時候應該考慮微調**作為解決方案? | +| [Continuous Fine Tuning](https://learn.microsoft.com/azure/ai-services/openai/how-to/fine-tuning?tabs=turbo%2Cpython&pivots=programming-language-studio#continuous-fine-tuning?WT.mc_id=academic-105485-koreyst) | 連續微調是選擇已經微調過的模型作為基礎模型並在新的訓練範例集上**進一步微調**的迭代過程。 | +| [Fine-tuning and function calling](https://learn.microsoft.com/azure/ai-services/openai/how-to/fine-tuning-functions?WT.mc_id=academic-105485-koreyst) | 使用**函式呼叫範例**微調你的模型可以通過獲得更準確和一致的輸出來改進模型輸出——具有類似格式的回應和成本節省 | +| [Fine-tuning Models: Azure OpenAI Guidance](https://learn.microsoft.com/azure/ai-services/openai/concepts/models#fine-tuning-models?WT.mc_id=academic-105485-koreyst) | 查閱此表以了解**哪些模型可以在Azure OpenAI中進行微調**,以及這些模型在哪些地區可用。如有需要,查閱它們的token限制和訓練數據到期日期。 | +| [To Fine Tune or Not To Fine Tune? That is the Question](https://learn.microsoft.com/shows/ai-show/to-fine-tune-or-not-fine-tune-that-is-the-question?WT.mc_id=academic-105485-koreyst) | 這個30分鐘的**2023年10月**AI Show節目討論了幫助你做出這個決定的優點、缺點和實際見解。 | +| [Getting Started With LLM Fine-Tuning](https://learn.microsoft.com/ai/playbook/technology-guidance/generative-ai/working-with-llms/fine-tuning?WT.mc_id=academic-105485-koreyst) | 這個**AI Playbook**資源帶你了解數據需求、格式化、超參數微調以及你應該知道的挑戰/限制。 | +| **Tutorial**: [Azure OpenAI GPT3.5 Turbo Fine-Tuning](https://learn.microsoft.com/azure/ai-services/openai/tutorials/fine-tune?tabs=python%2Ccommand-line?WT.mc_id=academic-105485-koreyst) | 學習建立一個範例微調數據集,準備微調,建立微調工作,並在Azure上部署微調模型。 | +| **Tutorial**: [Fine-tune a Llama 2 model in Azure AI Studio](https://learn.microsoft.com/azure/ai-studio/how-to/fine-tune-model-llama?WT.mc_id=academic-105485-koreyst) | Azure AI Studio允許你使用基於UI的工作流程來定制大型語言模型以適應你的個人數據集_適合低代碼開發者_。請參見此範例。 | +| **Tutorial**:[Fine-tune Hugging Face models for a single GPU on Azure](https://learn.microsoft.com/azure/databricks/machine-learning/train-model/huggingface/fine-tune-model?WT.mc_id=academic-105485-koreyst) | 本文描述了如何使用Hugging Face transformers函式庫在單個GPU上與Azure DataBricks + Hugging Face Trainer函式庫一起微調Hugging Face模型。 | +| **Training:** [Fine-tune a foundation model with Azure Machine Learning](https://learn.microsoft.com/training/modules/finetune-foundation-model-with-azure-machine-learning/?WT.mc_id=academic-105485-koreyst) | Azure Machine Learning中的模型目錄提供了許多你可以為特定任務微調的開放原始碼模型。試試這個模組是[來自AzureML生成式AI學習路徑](https://learn.microsoft.com/training/paths/work-with-generative-models-azure-machine-learning/?WT.mc_id=academic-105485-koreyst) | +| **Tutorial:** [Azure OpenAI Fine-Tuning](https://docs.wandb.ai/guides/integrations/azure-openai-fine-tuning?WT.mc_id=academic-105485-koreyst) | 使用W&B在Microsoft Azure上微調GPT-3.5或GPT-4模型允許對模型性能進行詳細跟蹤和分析。本指南擴展了OpenAI微調指南中的概念,提供了Azure OpenAI的具體步驟和功能。 | +| | | + +## 2. 次要資源 + +此部分捕捉了值得探索的額外資源,但我們在本課中沒有時間涵蓋。它們可能會在未來的課程中涵蓋,或作為後續作業選項,在以後的日期進行。現在,使用它們來建立您自己在此主題周圍的專業知識和知識。 + +| Title/Link | Description | +| :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **OpenAI Cookbook**: [Data preparation and analysis for chat model fine-tuning](https://cookbook.openai.com/examples/chat_finetuning_data_prep?WT.mc_id=academic-105485-koreyst) | 此筆記本用作預處理和分析用於微調聊天模型的聊天數據集。它檢查格式錯誤,提供基本統計資訊,並估算微調成本的代幣數量。請參見: [Fine-tuning method for gpt-3.5-turbo](https://platform.openai.com/docs/guides/fine-tuning?WT.mc_id=academic-105485-koreyst)。 | +| **OpenAI Cookbook**: [Fine-Tuning for Retrieval Augmented Generation (RAG) with Qdrant](https://cookbook.openai.com/examples/fine-tuned_qa/ft_retrieval_augmented_generation_qdrant?WT.mc_id=academic-105485-koreyst) | 此筆記本的目的是通過一個全面的範例來演示如何為檢索增強生成(RAG)微調OpenAI模型。我們還將整合Qdrant和少樣本學習來提升模型性能並減少捏造。 | +| **OpenAI Cookbook**: [Fine-tuning GPT with Weights & Biases](https://cookbook.openai.com/examples/third_party/gpt_finetuning_with_wandb?WT.mc_id=academic-105485-koreyst) | Weights & Biases (W&B) 是AI開發者平台,提供訓練模型、微調模型和利用基礎模型的工具。首先閱讀他們的[OpenAI Fine-Tuning](https://docs.wandb.ai/guides/integrations/openai?WT.mc_id=academic-105485-koreyst)指南,然後嘗試Cookbook練習。 | +| **Community Tutorial** [Phinetuning 2.0](https://huggingface.co/blog/g-ronimo/phinetuning?WT.mc_id=academic-105485-koreyst) - fine-tuning for Small Language Models | 認識[Phi-2](https://www.microsoft.com/research/blog/phi-2-the-surprising-power-of-small-language-models/?WT.mc_id=academic-105485-koreyst),微軟的新小型模型,功能強大且緊湊。本指南將引導您微調Phi-2,展示如何建立獨特的數據集並使用QLoRA微調模型。 | +| **Hugging Face Tutorial** [How to Fine-Tune LLMs in 2024 with Hugging Face](https://www.philschmid.de/fine-tune-llms-in-2024-with-trl?WT.mc_id=academic-105485-koreyst) | 這篇博客文章將引導您如何在2024年使用Hugging Face TRL、Transformers和數據集微調開放LLMs。您將定義一個使用案例,設定開發環境,準備數據集,微調模型,測試評估,然後部署到生產環境。 | +| **Hugging Face: [AutoTrain Advanced](https://github.com/huggingface/autotrain-advanced?WT.mc_id=academic-105485-koreyst)** | 帶來更快更簡單的[最先進機器學習模型](https://twitter.com/abhi1thakur/status/1755167674894557291?WT.mc_id=academic-105485-koreyst)訓練和部署。 Repo 有適合Colab的指南和YouTube影片指導,用於微調。**反映了最近的[local-first](https://twitter.com/abhi1thakur/status/1750828141805777057?WT.mc_id=academic-105485-koreyst)更新**。請閱讀[AutoTrain documentation](https://huggingface.co/autotrain?WT.mc_id=academic-105485-koreyst)。 | +| | | + diff --git a/docs/_navbar.md b/docs/_navbar.md index e58867a00..2e00878e9 100644 --- a/docs/_navbar.md +++ b/docs/_navbar.md @@ -3,6 +3,7 @@ * Select Language * [English](/) - * [Chinese](/translations/cn/) + * [Simplified Chinese](/translations/cn/) + * [Traditional Chinese](/translations/tw/) * [Portuguese](/translations/pt-br/) * [Japanese](/translations/ja-jp/) diff --git a/translations/tw/CODE_OF_CONDUCT.md b/translations/tw/CODE_OF_CONDUCT.md new file mode 100644 index 000000000..a3b0d89cf --- /dev/null +++ b/translations/tw/CODE_OF_CONDUCT.md @@ -0,0 +1,10 @@ +# Microsoft 開放原始碼行為準則 + +此專案已採用[Microsoft 開放原始碼行為準則](https://opensource.microsoft.com/codeofconduct/?WT.mc_id=DT-MVP-4015686)。 + +資源: + +- [Microsoft 開放原始碼行為準則](https://opensource.microsoft.com/codeofconduct/?WT.mc_id=DT-MVP-4015686) +- [Microsoft 行為準則 FAQ](https://opensource.microsoft.com/codeofconduct/faq/?WT.mc_id=DT-MVP-4015686) +- 如有問題或疑慮,請聯絡 [opencode@microsoft.com](mailto:opencode@microsoft.com) + diff --git a/translations/tw/CONTRIBUTING.md b/translations/tw/CONTRIBUTING.md new file mode 100644 index 000000000..93ad5df2a --- /dev/null +++ b/translations/tw/CONTRIBUTING.md @@ -0,0 +1,123 @@ +# 貢獻 + +這個專案歡迎貢獻和建議。大多數貢獻需要您同意一份貢獻者許可協議 (CLA),聲明您有權利並實際上授予我們使用您貢獻的權利。詳情請訪問 。 + +> 重要事項: 在翻譯此存放庫中的文字時,請確保不要使用機器翻譯。我們將通過社群驗證翻譯,因此請僅在您精通的語言中自願進行翻譯。 + +當你提交一個 pull request 時,CLA-bot 會自動判斷你是否需要提供 CLA 並適當地裝飾 PR (例如,標籤、評論)。只需按照 bot 提供的指示進行操作。你只需要在所有使用我們 CLA 的儲存庫中做一次這個操作。 + +## 行為準則 + +這個專案已採用[Microsoft 開放原始碼行為準則](https://opensource.microsoft.com/codeofconduct/?WT.mc_id=academic-105485-koreyst)。 +欲了解更多資訊,請閱讀[行為準則 FAQ](https://opensource.microsoft.com/codeofconduct/faq/?WT.mc_id=academic-105485-koreyst)或聯繫[opencode@microsoft.com](mailto:opencode@microsoft.com)提出任何其他問題或意見。 + +## 問題或疑問? + +請不要為一般支援問題開啟 GitHub 問題,因為 GitHub 清單應該用於功能請求和錯誤報告。這樣我們可以更容易地追蹤程式碼中的實際問題或錯誤,並將一般討論與實際程式碼分開。 + +## 錯字、問題、錯誤和貢獻 + +每當您提交任何更改到 Generative AI for Beginners 資料庫時,請遵循這些建議。 + +* 在進行修改之前,請先將 Repo 分叉到您自己的帳戶 +* 請勿將多個更改合併到一個拉取請求中。例如,請使用單獨的 PR 提交任何錯誤修正和文件更新 +* 如果您的拉取請求顯示合併衝突,請確保在進行修改之前將本地 main 更新為與主 Repo 中的 main 相同 +* 如果您提交的是翻譯,請為所有翻譯文件建立一個 PR,因為我們不接受部分翻譯的內容 +* 如果您提交的是錯字或文件修正,您可以在適當的情況下將修改合併到單個 PR + +## 一般寫作指南 + +- 確保所有的 URL 都包裹在方括號後跟著括號,且中間沒有多餘的空格 `[]()`。 +- 確保任何相對連結(即指向儲存庫中其他檔案和資料夾的連結)以 `./` 開頭,指向位於當前工作目錄中的檔案或資料夾,或以 `../` 開頭,指向位於父工作目錄中的檔案或資料夾。 +- 確保任何相對連結(即指向儲存庫中其他檔案和資料夾的連結)在末尾有一個追蹤 ID(即 `?` 或 `&` 然後是 `wt.mc_id=` 或 `WT.mc_id=`)。 +- 確保來自以下域名的任何 URL _github.com, microsoft.com, visualstudio.com, aka.ms, 和 azure.com_ 在末尾有一個追蹤 ID(即 `?` 或 `&` 然後是 `wt.mc_id=` 或 `WT.mc_id=`)。 +- 確保你的連結中沒有國家特定的語言區域(即 `/en-us/` 或 `/en/`)。 +- 確保所有圖片都儲存在 `./images` 資料夾中。 +- 確保圖片的名稱使用英文字符、數字和破折號來描述。 + +## GitHub 工作流程 + +當你提交拉取請求時,將觸發四個不同的工作流程來驗證先前的規則。 +只需按照這裡列出的指示來通過工作流程檢查。 + +- [檢查損壞的相對路徑](#檢查損壞的相對路徑) +- [檢查路徑是否有追蹤](#檢查路徑是否有追蹤) +- [檢查URL是否有追蹤](#檢查URL是否有追蹤) +- [檢查URL是否沒有區域設定](#檢查URL是否沒有區域設定) + +### 檢查損壞的相對路徑 + +這個工作流程確保你檔案中的任何相對路徑都能正常運作。 +這個儲存庫部署到 GitHub Pages,所以在輸入將所有內容連結在一起的連結時需要非常小心,以免導向錯誤的地方。 + +確保您的連結正常運作,只需使用 VS 程式碼檢查即可。 + +例如,當你將滑鼠懸停在檔案中的任何連結上時,系統會提示你按下 **ctrl + click** 來跟隨連結。 + +![VS code follow links screenshot](../../images/vscode-follow-link.png?WT.mc_id=academic-105485-koreyst "Screenshot from vs code prompt to follow a link when you hover over a link.") + +如果你點擊一個連結並且它在本地無法運作,那麼肯定會觸發工作流程並且在 GitHub 上也無法運作。 + +為了解決此問題,嘗試在 VS code 的幫助下輸入連結。 + +當你輸入 `./` 或 `../` VS 程式碼會提示你根據你輸入的內容從可用選項中進行選擇。 + +![VS 程式碼選擇相對路徑截圖](../../images/vscode-select-relative-path.png?WT.mc_id=academic-105485-koreyst "從 VS 程式碼提示中選擇相對路徑的彈出列表截圖。") + +按照路徑點擊所需的檔案或資料夾,確保您的路徑沒有中斷。 + +一旦您添加了正確的相對路徑、保存並推送您的更改,工作流程將再次觸發以驗證您的更改。如果您通過檢查,那麼您就可以繼續了。 + +### 檢查路徑是否有追蹤 + +此工作流程確保任何相對路徑都有追蹤。 +此儲存庫部署到 GitHub 頁面,因此我們需要追蹤不同檔案和資料夾之間的移動。 + +為了確保您的相對路徑中有追蹤,只需檢查路徑末尾是否有以下文字 `?wt.mc_id=`。 +如果它被附加到您的相對路徑中,那麼您將通過此檢查。 + +如果沒有,您可能會收到以下錯誤。 + +![GitHub 檢查路徑缺少追蹤評論截圖](../../images/github-check-paths-missing-tracking-comment.png?WT.mc_id=academic-105485-koreyst "來自 GitHub 評論的截圖,顯示相對路徑缺少追蹤") + +為了解決此問題,嘗試打開工作流程突出顯示的檔案路徑,並將追蹤ID添加到相對路徑的末尾。 + +一旦您添加了追蹤 ID、保存並推送您的更改,工作流程將再次觸發以驗證您的更改。 +如果您通過了檢查,那麼您就可以開始了。 + +### 檢查URL是否有追蹤 + +這個工作流程確保任何網頁 URL 都具有追蹤功能。 +這個儲存庫對所有人開放,所以你需要確保追蹤訪問以了解流量的來源。 + +為了確保你的 URL 中有追蹤,只需檢查 URL 結尾是否有以下文字 `?wt.mc_id=`。 +如果它已附加到你的 URL 中,那麼你將通過此檢查。 + +如果沒有,您可能會收到以下錯誤。 + +![GitHub 檢查網址缺少追蹤評論的截圖](../../images/github-check-urls-missing-tracking-comment.png?WT.mc_id=academic-105485-koreyst "來自 GitHub 評論的截圖,顯示網址缺少追蹤") + +為了解決此問題,嘗試打開工作流程突出顯示的文件路徑,並將追蹤 ID 添加到 URL 的末尾。 + +一旦您添加了追蹤 ID、保存並推送您的更改,工作流程將再次觸發以驗證您的更改。 +如果您通過了檢查,那麼您就可以開始了。 + +### 檢查URL是否沒有區域設定 + +這個工作流程確保任何網頁 URL 中不包含特定國家的語言環境。 +這個儲存庫對全世界的每個人都開放,所以你需要確保不要在 URL 中包含你國家的語言環境。 + +為了確保您的 URL 中沒有國家語言區域,只需檢查以下文字 `/en-us/` 或 `/en/` 或 URL 中的任何其他語言區域。 +如果您的 URL 中不存在這些內容,那麼您將通過此檢查。 + +如果沒有,您可能會收到以下錯誤。 + +![GitHub 檢查國家地區評論截圖](../../images/github-check-country-locale-comment.png?WT.mc_id=academic-105485-koreyst "來自 GitHub 評論的截圖,顯示已將國家地區添加到 URL") + +為了解決此問題,嘗試打開工作流程標示的文件路徑並從URL中移除國家區域。 + +一旦你移除國家區域、保存並推送你的更改,工作流程將再次觸發以驗證你的更改。 +如果你通過檢查,那麼你就可以繼續。 + +恭喜!我們會盡快回覆您關於您貢獻的反饋。 + diff --git a/translations/tw/README.md b/translations/tw/README.md new file mode 100644 index 000000000..489b5dd81 --- /dev/null +++ b/translations/tw/README.md @@ -0,0 +1,101 @@ +![生成式 AI 初學者指南](../../images/repo-thumbnailv3.png?WT.mc_id=academic-105485-koreyst) + +### 18 篇課程教你開始建構生成式 AI 應用所需的一切 + +[![GitHub license](https://img.shields.io/github/license/microsoft/Generative-AI-For-Beginners.svg)](https://github.com/microsoft/Generative-AI-For-Beginners/blob/master/LICENSE?WT.mc_id=academic-105485-koreyst) +[![GitHub contributors](https://img.shields.io/github/contributors/microsoft/Generative-AI-For-Beginners.svg)](https://GitHub.com/microsoft/Generative-AI-For-Beginners/graphs/contributors/?WT.mc_id=academic-105485-koreyst) +[![GitHub issues](https://img.shields.io/github/issues/microsoft/Generative-AI-For-Beginners.svg)](https://GitHub.com/microsoft/Generative-AI-For-Beginners/issues/?WT.mc_id=academic-105485-koreyst) +[![GitHub pull-requests](https://img.shields.io/github/issues-pr/microsoft/Generative-AI-For-Beginners.svg)](https://GitHub.com/microsoft/Generative-AI-For-Beginners/pulls/?WT.mc_id=academic-105485-koreyst) +[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](http://makeapullrequest.com?WT.mc_id=academic-105485-koreyst) + +[![GitHub watchers](https://img.shields.io/github/watchers/microsoft/Generative-AI-For-Beginners.svg?style=social\&label=Watch)](https://GitHub.com/microsoft/Generative-AI-For-Beginners/watchers/?WT.mc_id=academic-105485-koreyst) +[![GitHub forks](https://img.shields.io/github/forks/microsoft/Generative-AI-For-Beginners.svg?style=social\&label=Fork)](https://GitHub.com/microsoft/Generative-AI-For-Beginners/network/?WT.mc_id=academic-105485-koreyst) +[![GitHub stars](https://img.shields.io/github/stars/microsoft/Generative-AI-For-Beginners.svg?style=social\&label=Star)](https://GitHub.com/microsoft/Generative-AI-For-Beginners/stargazers/?WT.mc_id=academic-105485-koreyst) + +[![](https://dcbadge.vercel.app/api/server/ByRwuEEgH4)](https://aka.ms/genai-discord?WT.mc_id=academic-105485-koreyst) + +# 生成式 AI 初學者課程 (第 2 版) + +學習由 Microsoft Cloud Advocates 提供的 18 節綜合課程,掌握建構生成式 AI 應用程式的基本原理。 + +## 🌱 開始使用 + +這門課程共有 18 節課。每節課涵蓋其自己的主題,所以從你喜歡的地方開始吧! + +課程被標記為「Learn」課程,解釋生成式 AI 概念,或「Build」課程,解釋概念和程式碼範例(在可能的情況下使用 **Python** 和 **TypeScript**)。 + +每節課還包括一個「持續學習」部分,提供額外的學習工具。 + +**你需要的東西** + +* 訪問 [Azure OpenAI Service](https://azure.microsoft.com/products/ai-services/openai-service?WT.mc_id=academic-105485-koreyst) **或** [OpenAI API](https://platform.openai.com/docs/quickstart?context=python?WT.mc_id=academic-105485-koreyst) - _僅在完成程式碼課程時需要_ +* 基本的 Python 或 TypeScript 知識是有幫助的 - \* 對於完全的初學者,請查看這些 [Python](https://learn.microsoft.com/training/paths/python-language/?WT.mc_id=academic-105485-koreyst) 和 [TypeScript](https://learn.microsoft.com/training/paths/build-javascript-applications-typescript/?WT.mc_id=academic-105485-koreyst) 課程。 +* 一個 GitHub 帳戶來 [複製這個完整的 repo](https://github.com/microsoft/generative-ai-for-beginners/fork?WT.mc_id=academic-105485-koreyst) 到你自己的 GitHub 帳戶 + +我們已經建立了一個 **[Course Setup](../../00-course-setup/translations/tw/README.md?WT.mc_id=academic-105485-koreyst)** 課程來幫助您設定您的開發環境。 + +不要忘記[給這個 Repo 加星(🌟)](https://docs.github.com/en/get-started/exploring-projects-on-github/saving-repositories-with-stars?WT.mc_id=academic-105485-koreyst)以便以後更容易找到它。 + +## 🧠 準備部署? + +如果你在尋找更高級的程式碼範例,請查看我們的[生成式 AI 程式碼範例集](https://aka.ms/genai-beg-code?WT.mc_id=academic-105485-koreyst),包括 **Python** 和 **TypeScript**。 + +## 🗣️ 認識其他學習者,獲得支援 + +加入我們的[官方 AI Discord 伺服器](https://aka.ms/genai-discord?WT.mc_id=academic-105485-koreyst),與其他學習者見面並建立聯繫,並獲得支援。 + +## 🚀 建構新創公司? + +註冊 [Microsoft for Startups Founders Hub](https://aka.ms/genai-foundershub?WT.mc_id=academic-105485-koreyst) 以獲得**免費的 OpenAI 點數**以及高達 \*\*$150k 的 Azure 點數,用於通過 Azure OpenAI Services 訪問 OpenAI 模型 \*\*。 + +## 🙏 想要幫忙嗎? + +你有建議或發現拼寫或程式碼錯誤嗎?[Raise an issue](https://github.com/microsoft/generative-ai-for-beginners/issues?WT.mc_id=academic-105485-koreyst) 或 [Create a pull request](https://github.com/microsoft/generative-ai-for-beginners/pulls?WT.mc_id=academic-105485-koreyst) + +## 📂 每個課程包括: + +* 一個簡短的影片介紹這個主題 +* 位於 README 中的書面課程 +* 支援 Azure OpenAI 和 OpenAI API 的 Python 和 TypeScript 程式碼範例 +* 連結到額外的資源以繼續學習 + +## 🗃️ 課程 + +| # | **課程連結** | **描述** | **影片** | **額外學習** | +| -- | ---------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------- | ------------------------------------------------------------------------ | ------------------------------------------------------------------------ | +| 00 | [課程設定](../../00-course-setup/translations/tw/README.md?WT.mc_id=academic-105485-koreyst) | **學習:** 如何設定您的開發環境 | 即將推出 | [了解更多](https://aka.ms/genai-collection?WT.mc_id=academic-105485-koreyst) | +| 01 | [生成式 AI 和 LLMs 簡介](../../01-introduction-to-genai/translations/tw/README.md?WT.mc_id=academic-105485-koreyst) | **學習:** 了解什麼是生成式 AI 以及大型語言模型 (LLMs) 如何運作。 | [影片](https://aka.ms/gen-ai-lesson-1-gh?WT.mc_id=academic-105485-koreyst) | [了解更多](https://aka.ms/genai-collection?WT.mc_id=academic-105485-koreyst) | +| 02 | [探索和比較不同的 LLMs](../../02-exploring-and-comparing-different-llms/translations/tw/README.md?WT.mc_id=academic-105485-koreyst) | **學習:** 如何為您的使用案例選擇合適的模型 | [影片](https://aka.ms/gen-ai-lesson2-gh?WT.mc_id=academic-105485-koreyst) | [了解更多](https://aka.ms/genai-collection?WT.mc_id=academic-105485-koreyst) | +| 03 | [負責任地使用生成式 AI](../../03-using-generative-ai-responsibly/translations/tw/README.md?WT.mc_id=academic-105485-koreyst) | **學習:** 如何負責任地建構生成式 AI 應用 | [影片](https://aka.ms/gen-ai-lesson3-gh?WT.mc_id=academic-105485-koreyst) | [了解更多](https://aka.ms/genai-collection?WT.mc_id=academic-105485-koreyst) | +| 04 | [了解提示工程基礎](../../04-prompt-engineering-fundamentals/translations/tw/README.md?WT.mc_id=academic-105485-koreyst) | **學習:** 實作提示工程最佳實踐 | [影片](https://aka.ms/gen-ai-lesson4-gh?WT.mc_id=academic-105485-koreyst) | [了解更多](https://aka.ms/genai-collection?WT.mc_id=academic-105485-koreyst) | +| 05 | [創建高級提示](../../05-advanced-prompts/translations/tw/README.md?WT.mc_id=academic-105485-koreyst) | **學習:** 如何應用提示工程技術以改進提示的結果。 | [影片](https://aka.ms/gen-ai-lesson5-gh?WT.mc_id=academic-105485-koreyst) | [了解更多](https://aka.ms/genai-collection?WT.mc_id=academic-105485-koreyst) | +| 06 | [建構文本生成應用](../../06-text-generation-apps/translations/tw/README.md?WT.mc_id=academic-105485-koreyst) | **建構:** 使用 Azure OpenAI / OpenAI API 建立文本生成應用 | [影片](https://aka.ms/gen-ai-lesson6-gh?WT.mc_id=academic-105485-koreyst) | [了解更多](https://aka.ms/genai-collection?WT.mc_id=academic-105485-koreyst) | +| 07 | [建構聊天應用](../../07-building-chat-applications/translations/tw/README.md?WT.mc_id=academic-105485-koreyst) | **建構:** 有效建構和整合聊天應用的技術。 | [影片](https://aka.ms/gen-ai-lessons7-gh?WT.mc_id=academic-105485-koreyst) | [了解更多](https://aka.ms/genai-collection?WT.mc_id=academic-105485-koreyst) | +| 08 | [建構搜索應用向量數據庫](../../08-building-search-applications/translations/tw/README.md?WT.mc_id=academic-105485-koreyst) | **建構:** 使用嵌入技術搜索數據的搜索應用。 | [影片](https://aka.ms/gen-ai-lesson8-gh?WT.mc_id=academic-105485-koreyst) | [了解更多](https://aka.ms/genai-collection?WT.mc_id=academic-105485-koreyst) | +| 09 | [建構圖像生成應用](../../09-building-image-applications/translations/tw/README.md?WT.mc_id=academic-105485-koreyst) | **建構:** 圖像生成應用 | [影片](https://aka.ms/gen-ai-lesson9-gh?WT.mc_id=academic-105485-koreyst) | [了解更多](https://aka.ms/genai-collection?WT.mc_id=academic-105485-koreyst) | +| 10 | [建構低程式碼 AI 應用](../../10-building-low-code-ai-applications/translations/tw/README.md?WT.mc_id=academic-105485-koreyst) | **建構:** 使用低程式碼工具建構生成式 AI 應用 | [影片](https://aka.ms/gen-ai-lesson10-gh?WT.mc_id=academic-105485-koreyst) | [了解更多](https://aka.ms/genai-collection?WT.mc_id=academic-105485-koreyst) | +| 11 | [整合外部應用與函式呼叫](../../11-integrating-with-function-calling/translations/tw/README.md?WT.mc_id=academic-105485-koreyst) | **建構:** 什麼是函式呼叫及其應用案例 | [影片](https://aka.ms/gen-ai-lesson11-gh?WT.mc_id=academic-105485-koreyst) | [了解更多](https://aka.ms/genai-collection?WT.mc_id=academic-105485-koreyst) | +| 12 | [設計 AI 應用的 UX](../../12-designing-ux-for-ai-applications/translations/tw/README.md?WT.mc_id=academic-105485-koreyst) | **學習:** 在開發生成式 AI 應用時如何應用 UX 設計原則 | [影片](https://aka.ms/gen-ai-lesson12-gh?WT.mc_id=academic-105485-koreyst) | [了解更多](https://aka.ms/genai-collection?WT.mc_id=academic-105485-koreyst) | +| 13 | [保護您的生成式 AI 應用](../../13-securing-ai-applications/translations/tw/README.md?WT.mc_id=academic-105485-koreyst) | **學習:** AI 系統的威脅和風險以及保護這些系統的方法。 | [影片](https://aka.ms/gen-ai-lesson13-gh?WT.mc_id=academic-105485-koreyst) | [了解更多](https://aka.ms/genai-collection?WT.mc_id=academic-105485-koreyst) | +| 14 | [生成式 AI 應用生命周期](../../14-the-generative-ai-application-lifecycle/translations/tw/README.md?WT.mc_id=academic-105485-koreyst) | **學習:** 管理 LLM 生命周期和 LLMOps 的工具和指標 | [影片](https://aka.ms/gen-ai-lesson14-gh?WT.mc_id=academic-105485-koreyst) | [了解更多](https://aka.ms/genai-collection?WT.mc_id=academic-105485-koreyst) | +| 15 | [檢索增強生成 (RAG) 和向量數據庫](../../15-rag-and-vector-databases/translations/tw/README.md?WT.mc_id=academic-105485-koreyst) | **建構:** 使用 RAG 框架從向量數據庫檢索嵌入的應用 | [影片](https://aka.ms/gen-ai-lesson15-gh?WT.mc_id=academic-105485-koreyst) | [了解更多](https://aka.ms/genai-collection?WT.mc_id=academic-105485-koreyst) | +| 16 | [開放原始碼模型和 Hugging Face](../../16-open-source-models/translations/tw/README.md?WT.mc_id=academic-105485-koreyst) | **建構:** 使用 Hugging Face 上的開放原始碼模型建立應用 | [影片](https://aka.ms/gen-ai-lesson16-gh?WT.mc_id=academic-105485-koreyst) | [了解更多](https://aka.ms/genai-collection?WT.mc_id=academic-105485-koreyst) | +| 17 | [AI 代理](../../17-ai-agents/translations/tw/README.md?WT.mc_id=academic-105485-koreyst) | **建構:** 使用 AI 代理框架的應用 | [影片](https://aka.ms/gen-ai-lesson17-gh?WT.mc_id=academic-105485-koreyst) | [了解更多](https://aka.ms/genai-collection?WT.mc_id=academic-105485-koreyst) | +| 18 | [微調 LLMs](../../18-fine-tuning/translations/tw/README.md?WT.mc_id=academic-105485-koreyst) | **學習:** 微調 LLMs 的什麼、為什麼和如何 | [影片](https://aka.ms/gen-ai-lesson18-gh?WT.mc_id=academic-105485-koreyst) | [了解更多](https://aka.ms/genai-collection?WT.mc_id=academic-105485-koreyst) | + +### 🌟 特別感謝 + +特別感謝 [**John Aziz**](https://www.linkedin.com/in/john0isaac/) 建立所有的 GitHub Actions 和工作流程 + +## 🎒 其他課程 + +我們的團隊還製作了其他課程!查看: + +* [初學者的機器學習](https://aka.ms/ml-beginners?WT.mc_id=academic-105485-koreyst) +* [初學者的資料科學](https://aka.ms/datascience-beginners?WT.mc_id=academic-105485-koreyst) +* [初學者的人工智慧](https://aka.ms/ai-beginners?WT.mc_id=academic-105485-koreyst) +* [**新** 初學者的網路安全](https://github.com/microsoft/Security-101??WT.mc_id=academic-96948-sayoung) +* [初學者的網頁開發](https://aka.ms/webdev-beginners?WT.mc_id=academic-105485-koreyst) +* [初學者的物聯網](https://aka.ms/iot-beginners?WT.mc_id=academic-105485-koreyst) +* [初學者的 XR 開發](https://github.com/microsoft/xr-development-for-beginners?WT.mc_id=academic-105485-koreyst) +* [掌握 GitHub Copilot 進行 AI 配對編程](https://aka.ms/GitHubCopilotAI?WT.mc_id=academic-105485-koreyst) diff --git a/translations/tw/SECURITY.md b/translations/tw/SECURITY.md new file mode 100644 index 000000000..b2e4ca6ee --- /dev/null +++ b/translations/tw/SECURITY.md @@ -0,0 +1,44 @@ + + +保持所有的 markdown 格式不變。直接輸出翻譯後的 markdown,不包含任何額外的文字、格式或標籤。移除 標籤。 + +## 安全性 + +Microsoft 非常重視我們軟體產品和服務的安全性,這包括通過我們的 GitHub 組織管理的所有原始程式碼庫,其中包括 [Microsoft](https://github.com/microsoft?WT.mc_id=DT-MVP-4015686)、[Azure](https://github.com/Azure?WT.mc_id=DT-MVP-4015686)、[DotNet](https://github.com/dotnet?WT.mc_id=DT-MVP-4015686)、[AspNet](https://github.com/aspnet?WT.mc_id=DT-MVP-4015686)、[Xamarin](https://github.com/xamarin?WT.mc_id=DT-MVP-4015686) 和 [我們的 GitHub 組織](https://opensource.microsoft.com/?WT.mc_id=DT-MVP-4015686)。 + +如果您認為在任何 Microsoft 擁有的儲存庫中發現了符合[Microsoft 的安全漏洞定義](https://aka.ms/opensource/security/definition?WT.mc_id=DT-MVP-4015686)的安全漏洞,請按照以下描述向我們報告。 + +## 回報安全問題 + +**請勿通過公開的 GitHub 問題回報安全漏洞。** + +相反地,請將它們報告給 Microsoft 安全回應中心 (MSRC),網址為 [https://msrc.microsoft.com/create-report](https://aka.ms/opensource/security/create-report?WT.mc_id=DT-MVP-4015686)。 + +如果您希望在不登入的情況下提交,請發送電子郵件至 [secure@microsoft.com](mailto:secure@microsoft.com)。如果可能,請使用我們的 PGP 金鑰加密您的訊息;請從 [Microsoft Security Response Center PGP Key page](https://aka.ms/opensource/security/pgpkey?WT.mc_id=DT-MVP-4015686) 下載。 + +您應該會在24小時內收到回覆。如果因某些原因沒有收到,請通過電子郵件跟進,以確保我們收到了您的原始訊息。更多資訊可以在[microsoft.com/msrc](https://aka.ms/opensource/security/msrc?WT.mc_id=DT-MVP-4015686)找到。 + +請包含以下所列的請求資訊(盡可能提供)以幫助我們更好地了解可能問題的性質和範圍: + +* 問題類型 (例如: 緩衝區溢位, SQL 注入, 跨站腳本攻擊等) + * 與問題顯現相關的原始檔案完整路徑 + * 受影響的原始程式碼位置 (標籤/分支/提交或直接 URL) + * 重現問題所需的任何特殊配置 + * 重現問題的逐步說明 + * 概念驗證或利用程式碼 (如果可能) + * 問題的影響,包括攻擊者如何利用該問題 + +這些資訊將幫助我們更快地分流您的報告。 + +如果您正在報告漏洞賞金,提供更完整的報告可以獲得更高的賞金獎勵。請訪問我們的[Microsoft Bug Bounty Program](https://aka.ms/opensource/security/bounty?WT.mc_id=DT-MVP-4015686)頁面以獲取更多有關我們活動計劃的詳細資訊。 + +## 首選語言 + +我們偏好所有的交流都使用英文。 + +## 政策 + +Microsoft 遵循[協調漏洞披露](https://aka.ms/opensource/security/cvd?WT.mc_id=DT-MVP-4015686)原則。 + + + From dfff8846b776845b9c83181a51ca286a25969fc5 Mon Sep 17 00:00:00 2001 From: Will Date: Sat, 6 Jul 2024 12:31:50 +0800 Subject: [PATCH 2/2] Edit tracking code to ?WT.mc_id=academic-105485-koreyst --- translations/tw/CODE_OF_CONDUCT.md | 6 +++--- translations/tw/SECURITY.md | 14 +++++++------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/translations/tw/CODE_OF_CONDUCT.md b/translations/tw/CODE_OF_CONDUCT.md index a3b0d89cf..eb373ec17 100644 --- a/translations/tw/CODE_OF_CONDUCT.md +++ b/translations/tw/CODE_OF_CONDUCT.md @@ -1,10 +1,10 @@ # Microsoft 開放原始碼行為準則 -此專案已採用[Microsoft 開放原始碼行為準則](https://opensource.microsoft.com/codeofconduct/?WT.mc_id=DT-MVP-4015686)。 +此專案已採用[Microsoft 開放原始碼行為準則](https://opensource.microsoft.com/codeofconduct/?WT.mc_id=academic-105485-koreyst)。 資源: -- [Microsoft 開放原始碼行為準則](https://opensource.microsoft.com/codeofconduct/?WT.mc_id=DT-MVP-4015686) -- [Microsoft 行為準則 FAQ](https://opensource.microsoft.com/codeofconduct/faq/?WT.mc_id=DT-MVP-4015686) +- [Microsoft 開放原始碼行為準則](https://opensource.microsoft.com/codeofconduct/?WT.mc_id=academic-105485-koreyst) +- [Microsoft 行為準則 FAQ](https://opensource.microsoft.com/codeofconduct/faq/?WT.mc_id=academic-105485-koreyst) - 如有問題或疑慮,請聯絡 [opencode@microsoft.com](mailto:opencode@microsoft.com) diff --git a/translations/tw/SECURITY.md b/translations/tw/SECURITY.md index b2e4ca6ee..800aacbb8 100644 --- a/translations/tw/SECURITY.md +++ b/translations/tw/SECURITY.md @@ -4,19 +4,19 @@ ## 安全性 -Microsoft 非常重視我們軟體產品和服務的安全性,這包括通過我們的 GitHub 組織管理的所有原始程式碼庫,其中包括 [Microsoft](https://github.com/microsoft?WT.mc_id=DT-MVP-4015686)、[Azure](https://github.com/Azure?WT.mc_id=DT-MVP-4015686)、[DotNet](https://github.com/dotnet?WT.mc_id=DT-MVP-4015686)、[AspNet](https://github.com/aspnet?WT.mc_id=DT-MVP-4015686)、[Xamarin](https://github.com/xamarin?WT.mc_id=DT-MVP-4015686) 和 [我們的 GitHub 組織](https://opensource.microsoft.com/?WT.mc_id=DT-MVP-4015686)。 +Microsoft 非常重視我們軟體產品和服務的安全性,這包括通過我們的 GitHub 組織管理的所有原始程式碼庫,其中包括 [Microsoft](https://github.com/microsoft?WT.mc_id=academic-105485-koreyst)、[Azure](https://github.com/Azure?WT.mc_id=academic-105485-koreyst)、[DotNet](https://github.com/dotnet?WT.mc_id=academic-105485-koreyst)、[AspNet](https://github.com/aspnet?WT.mc_id=academic-105485-koreyst)、[Xamarin](https://github.com/xamarin?WT.mc_id=academic-105485-koreyst) 和 [我們的 GitHub 組織](https://opensource.microsoft.com/?WT.mc_id=academic-105485-koreyst)。 -如果您認為在任何 Microsoft 擁有的儲存庫中發現了符合[Microsoft 的安全漏洞定義](https://aka.ms/opensource/security/definition?WT.mc_id=DT-MVP-4015686)的安全漏洞,請按照以下描述向我們報告。 +如果您認為在任何 Microsoft 擁有的儲存庫中發現了符合[Microsoft 的安全漏洞定義](https://aka.ms/opensource/security/definition?WT.mc_id=academic-105485-koreyst)的安全漏洞,請按照以下描述向我們報告。 ## 回報安全問題 **請勿通過公開的 GitHub 問題回報安全漏洞。** -相反地,請將它們報告給 Microsoft 安全回應中心 (MSRC),網址為 [https://msrc.microsoft.com/create-report](https://aka.ms/opensource/security/create-report?WT.mc_id=DT-MVP-4015686)。 +相反地,請將它們報告給 Microsoft 安全回應中心 (MSRC),網址為 [https://msrc.microsoft.com/create-report](https://aka.ms/opensource/security/create-report?WT.mc_id=academic-105485-koreyst)。 -如果您希望在不登入的情況下提交,請發送電子郵件至 [secure@microsoft.com](mailto:secure@microsoft.com)。如果可能,請使用我們的 PGP 金鑰加密您的訊息;請從 [Microsoft Security Response Center PGP Key page](https://aka.ms/opensource/security/pgpkey?WT.mc_id=DT-MVP-4015686) 下載。 +如果您希望在不登入的情況下提交,請發送電子郵件至 [secure@microsoft.com](mailto:secure@microsoft.com)。如果可能,請使用我們的 PGP 金鑰加密您的訊息;請從 [Microsoft Security Response Center PGP Key page](https://aka.ms/opensource/security/pgpkey?WT.mc_id=academic-105485-koreyst) 下載。 -您應該會在24小時內收到回覆。如果因某些原因沒有收到,請通過電子郵件跟進,以確保我們收到了您的原始訊息。更多資訊可以在[microsoft.com/msrc](https://aka.ms/opensource/security/msrc?WT.mc_id=DT-MVP-4015686)找到。 +您應該會在24小時內收到回覆。如果因某些原因沒有收到,請通過電子郵件跟進,以確保我們收到了您的原始訊息。更多資訊可以在[microsoft.com/msrc](https://aka.ms/opensource/security/msrc?WT.mc_id=academic-105485-koreyst)找到。 請包含以下所列的請求資訊(盡可能提供)以幫助我們更好地了解可能問題的性質和範圍: @@ -30,7 +30,7 @@ Microsoft 非常重視我們軟體產品和服務的安全性,這包括通過 這些資訊將幫助我們更快地分流您的報告。 -如果您正在報告漏洞賞金,提供更完整的報告可以獲得更高的賞金獎勵。請訪問我們的[Microsoft Bug Bounty Program](https://aka.ms/opensource/security/bounty?WT.mc_id=DT-MVP-4015686)頁面以獲取更多有關我們活動計劃的詳細資訊。 +如果您正在報告漏洞賞金,提供更完整的報告可以獲得更高的賞金獎勵。請訪問我們的[Microsoft Bug Bounty Program](https://aka.ms/opensource/security/bounty?WT.mc_id=academic-105485-koreyst)頁面以獲取更多有關我們活動計劃的詳細資訊。 ## 首選語言 @@ -38,7 +38,7 @@ Microsoft 非常重視我們軟體產品和服務的安全性,這包括通過 ## 政策 -Microsoft 遵循[協調漏洞披露](https://aka.ms/opensource/security/cvd?WT.mc_id=DT-MVP-4015686)原則。 +Microsoft 遵循[協調漏洞披露](https://aka.ms/opensource/security/cvd?WT.mc_id=academic-105485-koreyst)原則。