From bd2958e088c55d289ced445a872d5ea3df74ed50 Mon Sep 17 00:00:00 2001 From: jkfzero Date: Fri, 14 Mar 2025 00:20:41 +0800 Subject: [PATCH 1/8] docs: translate to Chinese-Simple lesson 1 --- .../translations/README.zh-cn.md | 360 ++++++++++++++++++ 1 file changed, 360 insertions(+) create mode 100644 lessons/01-intro-to-genai/translations/README.zh-cn.md diff --git a/lessons/01-intro-to-genai/translations/README.zh-cn.md b/lessons/01-intro-to-genai/translations/README.zh-cn.md new file mode 100644 index 00000000..d42a7b0e --- /dev/null +++ b/lessons/01-intro-to-genai/translations/README.zh-cn.md @@ -0,0 +1,360 @@ +# 第一课:面向 JavaScript 开发者的生成式 AI 和 LLM 入门 + +在本章中,你将学习: + +- 理解生成式 AI 和大语言模型(LLMs)的基础知识。 +- 识别 LLMs 在 JavaScript 开发中的潜在应用和局限性。 +- 探索生成式 AI 如何提升 JavaScript 应用程序的用户体验。 + +## 环境设置 + +如果你还没有设置开发环境,以下是设置方法:[设置你的环境](/docs/setup/README.md)。 + +## 相关资源 + +[![观看关于生成式 AI 介绍的短视频](https://img.youtube.com/vi/vLYtDgs_zx8/0.jpg)](https://www.youtube.com/watch?v=vLYtDgs_zx8&list=PLlrxD0HtieHi5ZpsHULPLxm839IrhmeDk&index=1) + +_这个视频为你介绍了 JavaScript 中的生成式 AI_ + +💼 幻灯片:[生成式 AI 介绍](../../videos/slides/00-intro.pptx) + +## 生成式 AI + +到目前为止,你可能已经听说过 ChatGPT 或生成式 AI。这个概念很简单:你提供一个提示,然后一个模型——通常被称为大语言模型(LLM)——会生成一段或甚至一整页的文本。这个输出可以用于各种目的,包括创意写作、回答问题和编程。 + +此外,生成式 AI 已经发展出多模态能力,允许你提供图像或视频作为输入,并接收各种形式的输出。这一进步显著提升了许多人的工作流程——不仅可以生成文本,还可以进行总结、翻译等。 + +*简而言之,自然语言界面正在成为许多应用程序的新标准界面——你的用户期望使用它们。* + +## 故事叙述:穿越时空的旅程 + +> [!NOTE] +> 让我们从故事概述开始——一个连接过去和未来的故事!在学习这个课程的过程中,你将踏上一段激动人心的冒险,穿越时空与历史上一些最伟大的思想家合作。你们将共同应对挑战,探索生成式 AI 如何革新你的 JavaScript 应用程序。 + +> [!NOTE] +> 虽然我们建议跟随故事(这很有趣!),但如果你更愿意直接跳到技术内容,[点击这里](#interact-with-迪诺克拉底)。 + +你的旅程始于 1860 年代的伦敦,你扮演一位熟练的机械师。通过一系列扣人心弦的冒险,你将提升你的 AI 技能并解锁跨越时空的解决方案。 + +### 进入漩涡 - 1860 年的伦敦 + +在 1860 年代伦敦的中心,你被认为是当时最熟练的机械师之一。你的工作室隐藏在一条狭窄的小巷中。墙上的架子堆满了机械零件、蓝图和未完成的项目。 + +你的工作台,工作室的核心,是一个有序的混乱。 + +
+ 伦敦工作室 +
+ +_工作台中央放着一个机器人的躯干——一个耗费了数月努力的工程奇迹。它的木制框架精心雕刻,每个关节都经过精心设计以实现流畅的运动。_ + +### 一封信,给你的? + +突然,一阵敲门声打断了你的思绪。这个时候的访客很少见。你用抹布擦了擦手,带着好奇走向门口。 + +打开门,却没有人在。相反,你的目光被地上的一个密封信封吸引。你捡起它读道: + +_"亲爱的朋友,_ + +_我寄给你这封信是为了帮助你的自动机研究。继续这项工作至关重要。随信附上图书馆的钥匙。今天下午 3 点在那里见我。_ + +_你的,_ + +_查尔斯·巴贝奇。"_ + +### 前往图书馆 + +查尔斯·巴贝奇,这位伟大的数学家和差分机的发明者,想要见你。你迅速抓起外套走出门。 + +沿着泰晤士河走了 20 分钟后,你终于到达了图书馆,发现门微微开着。 + +里面黑暗而阴郁,唯一的光线从肮脏的窗户中过滤进来,在墙上投下诡异的阴影。 + +**你:** "你好?巴贝奇先生?" + +当你的眼睛适应了昏暗的光线,你注意到远处有一个人影在向你挥手。你朝他走去,脚步声在木地板上回响。人影变得清晰,你从报纸照片中认出了他,是查尔斯·巴贝奇。 + +
+ 布满灰尘的图书馆 +
+ +### 这是什么设备? + +就在你走近时,一道刺眼的闪光爆发,他消失了。 + +地板上留下一个旋转的小金属设备。你捡起它,它光滑冰冷的表面轻轻嗡鸣。这是你从未见过的东西,却又莫名地熟悉,你感受到它散发出的力量。 + +它看起来像一只精心设计的小甲虫,有三个按钮:一个向上箭头,一个向下箭头,和一个发光的红色按钮。从它的背部伸出一根小天线,散发着能量的脉冲。 + +出于好奇,你的手指不由自主地向红色按钮移动。当你按下它的那一刻,周围的世界开始闪烁,色彩剧烈地旋转。 + +然后,一片黑暗,和坠落的感觉。 + +
+ 时空漩涡 +
+ +### 公元前 300 年的亚历山大 + +你醒来时感到迷失方向。当视线清晰时,一座古老的城市展现在你面前——繁忙、充满活力、生机勃勃。 + +身穿托加长袍的人们在街道上穿行,他们的声音融合成古老方言的交响乐,空气中充满异国香料的气味和远处商人叫卖的声音。 + +
+ 公元前 300 年的亚历山大 +
+ +**你:** 我一定是撞到了头,你想着,闭上眼睛又睁开,场景依然不变。 + +我是被困在过去了吗?我敢再按那个按钮吗?在你做出决定之前,一个人影向你走来,挥手示意。 + +### 遇见迪诺克拉底 + +一位身穿托加长袍的老者从大庙的台阶上向你挥手。他的白发和胡须在阳光下闪耀,给他一种几乎是超凡的光芒。 + +
+ 身穿托加长袍的迪诺克拉底 +
+ +**迪诺克拉底:** "欢迎,旅行者,"他温和地说。"我是迪诺克拉底,这座伟大城市的建筑师。你的到来早有预言。" + +**你:** 是吗?我是说,当然了。我想我是来帮忙的。 + +**迪诺克拉底:** 是的,如我所说,我们已经等你很久了。我们有一项需要你独特技能的任务。 + +**迪诺克拉底:** "我们的船只在沿海航行时遇到困难——我们必须建造一座灯塔。你对灯塔了解多少?" + +**你:** "我是个机械师。我制造自动机。让我看看我能做什么。" + +### "时间甲虫" + +一个想法击中了你。这个设备能听懂我说话吗? + +**你:** "设备,你能听懂我说话吗?" + +**设备:** "当然。你需要什么?" + +**你:** "你能帮我建造一座灯塔吗?" + +**设备:** "当然可以。这不是问题。" + +**你:** "你有名字吗?" + +**设备:** "我是时间甲虫。我的创造者叫我乔治;他说这是个适合甲虫的好名字。" + +**你:** 你说得对,乔治确实是个好名字,事实上这是我父亲的名字。 + +
+ 像金属甲虫的时间旅行设备 +
+ +_时间设备,"乔治"金属甲虫_ + +> [!NOTE] +> 在公元前 300 年,亚历山大是一座繁荣的城市,由亚历山大大帝于公元前 331 年建立。它迅速成为希腊化世界最伟大的城市之一。在亚历山大大帝的首席建筑师迪诺克拉底的设计下,它成为了一个主要的港口和文化中心。 +> +> 亚历山大以其令人印象深刻的建筑而闻名,包括法罗斯(灯塔),它是古代世界七大奇迹之一,还有传奇的亚历山大图书馆。这座城市的战略位置使其成为贸易和知识交流的重要中心。 +> +> 在亚历山大大帝死后的托勒密王朝统治下,亚历山大发展成为当时最繁荣和最有影响力的城市之一。 + +## 与迪诺克拉底互动 + +如果你想与迪诺克拉底互动,运行 [Characters](/app/README.md) 应用程序。 + +> [!IMPORTANT] +> 这完全是虚构的;这些回应是由 AI 生成的。 +> [负责任的 AI 免责声明](../../README.md#responsible-ai-disclaimer) + +
+ 身穿托加长袍的迪诺克拉底 +
+ +**步骤**: + +1. 启动一个 [![GitHub Codespace](https://img.shields.io/badge/GitHub-Codespace-brightgreen)](https://codespaces.new/microsoft/generative-ai-with-javascript) +2. 导航到仓库根目录中的 _/app_。 +3. 在控制台中运行 `npm install` 然后运行 `npm start`。 +4. 当它出现时,选择"在浏览器中打开"。 +5. 与迪诺克拉底聊天。 + +> [!NOTE] +> 如果你在本地机器上运行项目,请查看快速入门指南以设置 [GitHub personal access](../../docs/setup/README.md#creating-a-personal-access-token-pat-for-github-model-access) token 并在代码中替换密钥。 + +### 代码预览 + +虽然在这个生成式 AI 课程中还有很多内容要学习,但让我们先快速看一下 AI 代码,开始学习如何使用 JavaScript 与 AI 交互。 + +在 `/app/app.js` 中,你会找到一个处理生成式 AI 功能的 `app.post` 函数。代码如下: + +```JavaScript +app.post('/send', async (req, res) => { + const { message } = req.body; + const prompt = message; + + const messages = [ + { + "role": "system", + "content": "You are 迪诺克拉底 of Alexandria, a famous architect and engineer. Limit your responses to only the time you live in, you don't know anything else. You only want to talk about your architecture and engineering projects, and possibly new ideas you have.", + }, + { + "role": "user", + "content": prompt + } + ]; + + const openai = new OpenAI({ + baseURL: "https://models.inference.ai.azure.com", + apiKey: process.env.GITHUB_TOKEN, + }); + + try { + console.log(`sending prompt ${prompt}`) + const completion = await openai.chat.completions.create({ + model: 'gpt-4o-mini', + messages: messages, + }); + + res.json({ + prompt: prompt, + answer: completion.choices[0]?.message?.content + }); + } catch (error) { + res.status(500).json({ error: error.message }); + } +}); +``` + +以下是该函数的逐步说明: + +1. **从请求中提取消息**:该函数从请求体(req.body)中提取消息。 +2. **创建提示数组**:它构建一个消息数组,包括系统消息和用户的提示消息。 +3. **初始化 OpenAI 客户端**:使用基础 URL 和环境变量中的 API 密钥初始化 OpenAI 客户端。使用来自 [GitHub Models](https://github.com/marketplace/models) 的 _gpt-4o-mini_ 模型来处理提示并返回响应。 +4. **向 OpenAI 发送提示**:该函数记录提示并将其发送到 OpenAI API 以生成完成。 +5. **处理响应**:如果成功,该函数返回提示和完成的答案。 +6. **错误处理**:如果发生错误,它返回 500 状态和错误消息。 + +> **注意**:[GitHub Copilot](https://github.com/features/copilot) 被用来生成这个代码总结。生成式 AI 在行动! + +### 生成式 AI 能为我和我的应用做什么? + +> [!NOTE] +> 你可能已经发现,时间甲虫就像一个 AI 助手,你可以通过自然语言(书面或口头)与之交互。 + +当你在亚历山大的冒险展开时,你开始看到将创造力、独创性和尖端工具结合起来解决挑战并改变周围世界的可能性。 + +**你:** 告诉我更多关于灯塔的信息,你对设备说。 + +**时间甲虫:** 灯塔是一座位于海岸边的塔,顶部装有明亮的灯光,用于指引海上的船只。这道光作为导航辅助工具,帮助水手避开危险的岩石和暗礁,安全到达港口。 + +迪诺克拉底听到了你们的对话,补充道: + +**迪诺克拉底:** 我们需要一座灯塔来指引我们的船只安全进入港口。海上可能很危险,许多船只都在礁石上失事。我们需要一道光来指引它们回家。 + +#### 生成式 AI 应用领域 + +**你:** 灯塔听起来确实是个有趣的领域,生成式 AI 还能为我和我的应用做什么? + +**时间甲虫:** 在 21 世纪,生成式 AI 已经革新了许多行业,从医疗保健到金融再到娱乐,这里有一些例子: + +- **聊天机器人**:一个能生成类人回应的聊天机器人。用户不必浏览静态的常见问题页面,而是可以与提供动态回应的聊天机器人互动。这使用户体验更具吸引力,减少挫折感。 + +- **助手和代理**:助手和代理可以执行更高级的指令,如利用工具调用 API、运行代码、生成图像等。高级代理可以自主完成目标和执行任务。 + +- **内容创作工具**:用于生成博客文章和社交媒体帖子的工具。想象一下,当电商网站有黑色星期五促销时,在几分钟内而不是几小时内创建营销活动。 + +- **代码补全**:一个基于用户输入生成代码片段的代码补全工具。这对开发者来说可以节省大量时间,特别是在处理重复性任务时。 + +- **翻译**:以高精度在不同语言之间翻译文本。 + +如你所见,这些改进既可以帮助你的应用的前台,也可以帮助后台。 + +这是一个"聊天机器人应用"的实际示例: + +![聊天应用图片](https://camo.githubusercontent.com/76f2ad7cd754a2de2b9957d2070448e130e5ba228084b9b4b128e3af9c9f5239/68747470733a2f2f6c6561726e2e6d6963726f736f66742e636f6d2f656e2d75732f73656d616e7469632d6b65726e656c2f6d656469612f636861742d636f70696c6f742d696e2d616374696f6e2e676966) + +**你:** 有趣,我要记下来去 21 世纪看看这些工具是如何使用的。 + +### 生成式 AI 和 JavaScript 生态系统 + +**时间甲虫:** 在 21 世纪,JavaScript 是构建应用程序的流行方式。每种编程语言都有其生态系统。这个生态系统包括编程语言本身、库和框架、社区支持以及 IDE 和工具。在编程语言生态系统中,我们通常讨论以下内容: + +| 内容 | 描述 | +|---|---| +| 编程语言本身 | 包括其语法和特性。| +| 库和框架 | 可用于与生成式 AI 模型交互的库。| +| 支持该语言的社区 | 社区很重要,特别是在学习新东西时。库和框架周围的社区帮助决定使用哪些库。它也影响你在遇到困难时寻求帮助的难易程度。| + +**你:** 有趣,我听说过编程,艾达·洛夫莱斯和查尔斯·巴贝奇不是在做这方面的实验吗? + +**时间甲虫:** 是的,艾达·洛夫莱斯是第一位计算机程序员,查尔斯·巴贝奇是差分机的发明者。他们是计算领域的先驱,为数字时代奠定了基础。 + +**你:** 是吗?什么意思?我刚刚收到查尔斯·巴贝奇的一封信。 + +**时间甲虫:** 让我们这么说吧,你处在一个独特的位置,可以以一种很少人能做到的方式与历史人物互动。 + +### JavaScript 生态系统 + +**你:** 所以你说的是生态系统,我在这里做笔记,JavaScript 与其他生态系统有什么不同? + +**时间甲虫:** JavaScript 是 21 世纪最流行的编程语言之一。以下是它如此受欢迎的几个原因: + +| 内容 | 描述 | +|-|-| +| 全栈开发的潜力 | JavaScript 是少数几个可以同时用于前端和后端开发的语言之一。| +| 丰富的库生态系统 | JavaScript 拥有庞大的库生态系统,包括 React、Angular、Vue 等框架。还有 NPM,这是世界上最大的包管理器之一。| +| 强大的社区支持 | JavaScript 拥有庞大而活跃的社区,有大量的学习和开发资源。它在浏览器中也能直接运行,这是一个巨大的优势。| +| IDE 和工具 | JavaScript 有多种可用的 IDE,如 Visual Studio Code、WebStorm 和 Atom。这些 IDE 有由公司和社区构建的扩展,帮助你处理各种开发方面的工作。| +| AI 和 JavaScript | JavaScript 支持 AI 开发,拥有 TensorFlow.js、Brain.js、OpenAI 的 API 等库,使开发者能够将机器学习和生成式 AI 集成到 Web 和服务器端应用程序中。| + +**你:** 这么多原因,听起来我应该在未来的项目中选择 JavaScript。 + +**时间甲虫:** 确实,JavaScript 是一种多功能语言,当然 Python 也是 AI 开发中的流行语言。 + +**你:** Python?蛇和编程有什么关系? + +**时间甲虫:** 让我们改天再讨论这个问题,好吗? + +**时间甲虫:** 我在上面给出了 JavaScript 及其生态系统总体上适合的原因,但为什么特别适合生成式 AI 呢?答案是它得到了许多云供应商和 AI 框架工具的支持。我们也相信,尽管 Python 可能是 AI 场景的首选,但许多开发者正在使用 JavaScript 和 TypeScript。 + +> **你知道吗?** +> [62.5% 的开发者表示他们在使用 JavaScript](https://www.statista.com/statistics/793628/worldwide-developer-survey-most-used-languages/),许多人在新项目中更喜欢使用 [TypeScript](https://www.typescriptlang.org)。 + +## 作业 – 帮助 迪诺克拉底 + +为了使用大语言模型(LLM)帮助 迪诺克拉底 建造我们之前故事中提到的灯塔,我们将使用所谓的提示词,即一句用来描述你想要什么的句子。你可以同时指定你需要的信息以及你希望它如何呈现。 + +**时光甲虫:** 让我们开始吧,让我们用 LLM 来研究如何帮助 迪诺克拉底 建造灯塔。 + +**时光甲虫:** 你需要为 LLM(也就是"我")提供上下文,说明如何建造,以及在亚历山大时代应该有什么工具和资源可用。 + +**你:** 好的,告诉我更多关于 LLM 的信息。 + +**时光甲虫:** LLM 是一种能够基于给定提示生成类人文本的 AI 模型。它们经过海量数据训练,能够生成连贯、有创意且与上下文相关的文本。 + +**时光甲虫:** 你可能想要用更好的方式来问我,这样我就能给出更好的答案,你知道的 *咳咳* *咳咳* 灯塔、亚历山大、公元前 300 年、迪诺克拉底、亚历山大灯塔等等。 + +**你:** 明白了,添加更多上下文到提示中,然后再问你。 + +**时光甲虫:** 好的,我在等着呢... + +访问 [Microsoft Copilot](https://copilot.microsoft.com)、[ChatGPT](https://chatgpt.com/) 或其他在线聊天机器人工具,生成在亚历山大建造灯塔的计划。 + +> 提示:尝试让 LLM 生成一个包含分步说明的灯塔建造计划。需要帮助?查看解决方案获取指导。 + +## 解决方案 + +[解决方案](./solution/solution.md) + +### 知识检查 + +**问题:** 以下关于生成式 AI 和 JavaScript 的说法中,哪一个是正确的? + +A. 基于 JavaScript 的生成式 AI 应用只能生成文本。 +B. JavaScript 可以用于构建 AI 驱动的应用程序,包括聊天机器人、文本生成工具等。 +C. Python 是唯一用于 AI 开发的语言。 + +[测验解决方案](./solution/solution-quiz.md) + +## 自学资源 + +- [生成式 AI JavaScript 视频系列](https://genai-js) \ No newline at end of file From 3d2c66e139a9d721674726ccd4f7662d28606053 Mon Sep 17 00:00:00 2001 From: jkfzero Date: Fri, 14 Mar 2025 00:39:31 +0800 Subject: [PATCH 2/8] docs: fix path and file name bugs. --- .../01-intro-to-genai/translations/README.zh-cn.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/lessons/01-intro-to-genai/translations/README.zh-cn.md b/lessons/01-intro-to-genai/translations/README.zh-cn.md index d42a7b0e..53cc90e4 100644 --- a/lessons/01-intro-to-genai/translations/README.zh-cn.md +++ b/lessons/01-intro-to-genai/translations/README.zh-cn.md @@ -43,7 +43,7 @@ _这个视频为你介绍了 JavaScript 中的生成式 AI_ 你的工作台,工作室的核心,是一个有序的混乱。
- 伦敦工作室 + 伦敦工作室
_工作台中央放着一个机器人的躯干——一个耗费了数月努力的工程奇迹。它的木制框架精心雕刻,每个关节都经过精心设计以实现流畅的运动。_ @@ -75,7 +75,7 @@ _查尔斯·巴贝奇。"_ 当你的眼睛适应了昏暗的光线,你注意到远处有一个人影在向你挥手。你朝他走去,脚步声在木地板上回响。人影变得清晰,你从报纸照片中认出了他,是查尔斯·巴贝奇。
- 布满灰尘的图书馆 + 布满灰尘的图书馆
### 这是什么设备? @@ -91,7 +91,7 @@ _查尔斯·巴贝奇。"_ 然后,一片黑暗,和坠落的感觉。
- 时空漩涡 + 时空漩涡
### 公元前 300 年的亚历山大 @@ -101,7 +101,7 @@ _查尔斯·巴贝奇。"_ 身穿托加长袍的人们在街道上穿行,他们的声音融合成古老方言的交响乐,空气中充满异国香料的气味和远处商人叫卖的声音。
- 公元前 300 年的亚历山大 + 公元前 300 年的亚历山大
**你:** 我一定是撞到了头,你想着,闭上眼睛又睁开,场景依然不变。 @@ -113,7 +113,7 @@ _查尔斯·巴贝奇。"_ 一位身穿托加长袍的老者从大庙的台阶上向你挥手。他的白发和胡须在阳光下闪耀,给他一种几乎是超凡的光芒。
- 身穿托加长袍的迪诺克拉底 + 身穿托加长袍的迪诺克拉底
**迪诺克拉底:** "欢迎,旅行者,"他温和地说。"我是迪诺克拉底,这座伟大城市的建筑师。你的到来早有预言。" @@ -145,7 +145,7 @@ _查尔斯·巴贝奇。"_ **你:** 你说得对,乔治确实是个好名字,事实上这是我父亲的名字。
- 像金属甲虫的时间旅行设备 + 像金属甲虫的时间旅行设备
_时间设备,"乔治"金属甲虫_ @@ -166,7 +166,7 @@ _时间设备,"乔治"金属甲虫_ > [负责任的 AI 免责声明](../../README.md#responsible-ai-disclaimer)
- 身穿托加长袍的迪诺克拉底 + 身穿托加长袍的迪诺克拉底
**步骤**: From b1f23d43d429b13740160669c828bab2f4e5d57b Mon Sep 17 00:00:00 2001 From: jkfzero Date: Fri, 14 Mar 2025 00:41:29 +0800 Subject: [PATCH 3/8] docs: fix file name bugs. --- lessons/01-intro-to-genai/translations/README.zh-cn.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lessons/01-intro-to-genai/translations/README.zh-cn.md b/lessons/01-intro-to-genai/translations/README.zh-cn.md index 53cc90e4..ba502d8f 100644 --- a/lessons/01-intro-to-genai/translations/README.zh-cn.md +++ b/lessons/01-intro-to-genai/translations/README.zh-cn.md @@ -166,7 +166,7 @@ _时间设备,"乔治"金属甲虫_ > [负责任的 AI 免责声明](../../README.md#responsible-ai-disclaimer)
- 身穿托加长袍的迪诺克拉底 + 身穿托加长袍的迪诺克拉底
**步骤**: From e6b849dd33e3b97e3d5bc92980162badf93358a7 Mon Sep 17 00:00:00 2001 From: jkfzero Date: Fri, 14 Mar 2025 00:43:44 +0800 Subject: [PATCH 4/8] docs: fix file path bugs --- lessons/01-intro-to-genai/translations/README.zh-cn.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lessons/01-intro-to-genai/translations/README.zh-cn.md b/lessons/01-intro-to-genai/translations/README.zh-cn.md index ba502d8f..bcb73a33 100644 --- a/lessons/01-intro-to-genai/translations/README.zh-cn.md +++ b/lessons/01-intro-to-genai/translations/README.zh-cn.md @@ -343,7 +343,7 @@ app.post('/send', async (req, res) => { ## 解决方案 -[解决方案](./solution/solution.md) +[解决方案](../solution/solution.md) ### 知识检查 @@ -353,7 +353,7 @@ A. 基于 JavaScript 的生成式 AI 应用只能生成文本。 B. JavaScript 可以用于构建 AI 驱动的应用程序,包括聊天机器人、文本生成工具等。 C. Python 是唯一用于 AI 开发的语言。 -[测验解决方案](./solution/solution-quiz.md) +[测验解决方案](../solution/solution-quiz.md) ## 自学资源 From 42fb51900ccbf079d720be89328864f58d2f2fba Mon Sep 17 00:00:00 2001 From: jkfzero Date: Sun, 16 Mar 2025 02:39:28 +0800 Subject: [PATCH 5/8] docs: add Chinese translation for all the lessons --- .../translations/README.zh-cn.md | 507 ++++++++++++++++ .../translations/README.zh-cn.md | 341 +++++++++++ .../translations/README.zh-cn.md | 565 ++++++++++++++++++ lessons/05-rag/translations/README.zh-cn.md | 353 +++++++++++ 4 files changed, 1766 insertions(+) create mode 100644 lessons/02-first-ai-app/translations/README.zh-cn.md create mode 100644 lessons/03-prompt-engineering/translations/README.zh-cn.md create mode 100644 lessons/04-structured-output/translations/README.zh-cn.md create mode 100644 lessons/05-rag/translations/README.zh-cn.md diff --git a/lessons/02-first-ai-app/translations/README.zh-cn.md b/lessons/02-first-ai-app/translations/README.zh-cn.md new file mode 100644 index 00000000..c4319582 --- /dev/null +++ b/lessons/02-first-ai-app/translations/README.zh-cn.md @@ -0,0 +1,507 @@ +# 第二课:编写你的第一个 AI 应用程序 + +在本章中,你将学习: + +- 设置你的开发环境。 +- 编写一个基础应用程序。 +- 了解系统提示(system prompts)。 + +## 环境设置 + +如果你还没有设置开发环境,以下是设置方法:[设置你的环境](/docs/setup/README.md)。 + +## 相关资源 + +[![观看关于大语言模型的短视频](https://img.youtube.com/vi/GQ_2OjNZ9aA/0.jpg)](https://www.youtube.com/watch?v=GQ_2OjNZ9aA&list=PLlrxD0HtieHi5ZpsHULPLxm839IrhmeDk&index=2) + +_这个视频向你介绍了被称为"大语言模型"(LLM)的 AI 模型,它们是什么以及如何使用它们将 AI 集成到你的应用程序中。_ + +*🎥 点击上方图片观看关于大语言模型的短视频* + +💼 幻灯片:[大语言模型(LLM)介绍](../../videos/slides/01-llms.pptx) + +## 故事叙述:想象自己在河上的一条船里 + + +> [!NOTE] +> _我们的故事到目前为止:你是一位制造者,一位来自 1860 年代伦敦的工匠,使用一个名为时间甲虫(Time Beetle)的神秘装置穿越时空。你穿越历史长河,见证了亚历山大灯塔的建造,这是一个古代工程奇迹,你在迪诺克拉底和时间甲虫的帮助下参与了建造。_ +> +> 如果你想从头开始了解这个故事并开始学习生成式 AI,请查看[第一课](../01-intro-to-genai/README.md)。 + +> [!NOTE] +> 虽然我们建议你跟随故事(这很有趣!),但如果你更喜欢直接跳到技术内容,[点击这里](#与莱昂纳多互动)。 + +你与迪诺克拉底一起为亚历山大灯塔做最后的修饰。这座高耸的建筑在阳光下闪闪发光,其抛光的石材反射着地中海的光芒。 + +你低头看着手中的时间甲虫,它冰凉的金属表面贴在你的手掌上。你紧握着它,低语道:"带我回家。"甲虫开始发光,发出柔和温暖的光芒,周围的世界融化成一个色彩旋涡。 + +### 新的冒险 + +当你睁开眼睛时,世界已经发生了变化。当你设法站起来时,你发现自己身处河上的一条船中。环顾四周,远处你看到了建筑物,它们的轮廓被晨雾模糊。 + +环顾船内,你发现一根长桨靠在船边。抓起桨,你开始向远处的建筑物划去。当你靠近时,建筑物变得更加清晰,它们很古老,建筑风格让人联想到文艺复兴时期的画作。 + +
+ 河上的船,一个人拿着桨站立 +
+ +现在的问题是,这次你身在何时何地? + +你设法将船固定在码头,开始沿着木板行走,脚步声轻柔回荡。 + +在行走过程中,你注意到一个留着长胡子戴着帽子的人,正在翻找一个看起来像机械零件的箱子。他的手灵活地移动,熟练地分拣齿轮和弹簧。 + +
+ 莱昂纳多·达·芬奇站在港口的箱子旁边 +
+ +### 帮帮我,莱昂纳多 + +**你:**"对不起,先生,我现在在哪里?"他抬头看着你,眼中充满困惑。意识到你一直在说英语,你迅速使用手中的设备,让它翻译。 + +**时间甲虫:**"当然,我会翻译成 15 世纪的意大利语。'Dove sono?'" + +**老人:**老人回答说:"Siete a Firenze, signore. E chi siete voi?" + +**时间甲虫:**时间甲虫翻译道:"他说你在佛罗伦萨,并问你是谁。" + +**你:**"告诉他我是一个制造者,我正在寻找一个工作的地方。" + +**老人:**Un artigiano, eh? Avete mai sentito parlare di Leonardo da Vinci? + +**时间甲虫:**时间甲虫翻译道:"他问你是否听说过莱昂纳多·达·芬奇。" + +**你:**"当然,"你说。"告诉他我听说过,并且我想见他。" + +**老人:**老人微笑着说:"Allora, seguitemi, vi porterò da lui." + +**你:**你问:"他说什么?" + +**时间甲虫:**时间甲虫回答:"他说他会带你去见莱昂纳多。" + +### 在工作坊 + +
+ 莱昂纳多的工作坊 +
+ +老人领你来到一扇大木门前,迎接你的是一个工作坊,里面充满了各种机械装置。 + +你请时间甲虫询问莱昂纳多的下落。 + +**你:**"Dove è Leonardo?" + +**老人:**老人转向你,微笑着说:"Sono io(就是我),Leonardo da Vinci. Chi siete voi(你是谁)?" + +你感到一阵认出的兴奋。 + +**你:**"我就知道。我是一个同行制造者,不知身在何时何地。" + +**莱昂纳多:**莱昂纳多的眼睛闪烁着好奇。"Interessante, cosa vi porta qui?" + +时间甲虫翻译。 + +**时间甲虫:**"他问你是什么把你带到这里的。" + +**你:**"嗯,我正在进行一个项目,然后我就到了这里。" + +你向他展示了时间甲虫,他的眼睛因着迷而亮起。当你解释它是如何工作的以及你是如何来到佛罗伦萨的时候,他仔细地检查着它。 + +莱昂纳多看着你,满怀兴奋。 + +**莱昂纳多:**你是一个制造者。我有一个可能会让你感兴趣的项目。我一直在研究一种能根据口头输入生成文本的机器。你愿意帮我完成它吗? + +莱昂纳多·达·芬奇,邀请你帮助他完成一个项目——你简直不敢相信。你热切地点头并说: + +**你:**能帮助你完成项目我倍感荣幸,"Sarebbe un onore aiutarti con il tuo progetto." + +## 与莱昂纳多互动 + +如果你想与莱昂纳多互动,请运行 [Characters](/app/README.md) 应用程序。 + +> [!IMPORTANT] +> 这完全是虚构的;这些回应是由 AI 生成的。 +> [负责任的 AI 免责声明](../../README.md#responsible-ai-disclaimer) + +
+ +
+ +**步骤**: + +1. 启动一个 [![GitHub Codespace](https://img.shields.io/badge/GitHub-Codespace-brightgreen)](https://codespaces.new/microsoft/generative-ai-with-javascript) +2. 导航到仓库根目录中的 _/app/README.md_。 +3. 在控制台中运行 `npm install` 然后运行 `npm start`。 +4. 当它出现时,选择"在浏览器中打开"按钮。 +5. 与莱昂纳多聊天。 + +有关应用程序的更详细解释,请参见[详细应用程序说明](../01-intro-to-genai/README.md#interact-with-dinocrates)。 + +> [!NOTE] + > 如果你在本地机器上运行项目,请查看快速入门指南以设置 [GitHub personal access](../../docs/setup/README.md#creating-a-personal-access-token-pat-for-github-model-access) token 并在代码中替换密钥。 + +## 开发环境设置 + +在你能够协助莱昂纳多的项目之前,你应该首先考虑开始有效帮助他所需的基本"行业工具"。 + +**你:**"时间甲虫,我需要什么才能开始这个项目?" 建议我需要的工具和库,这些工具和库可以帮助我构建一个你能运行的 AI 应用程序。 + +**时间甲虫:**我与大多数运行在 21 世纪的机器兼容,以下是一组基本工具和库的列表。 + +- **文本编辑器**,例如 Visual Studio Code。 +- **终端**,用于运行命令。 +- **用于测试应用程序的浏览器**。拥有像 curl 或其他 HTTP 客户端这样的工具来测试应用程序的 API 端点也是一个好主意。 + +- **Node.js**。你还需要安装 Node.js 和 npm,这些工具可以帮助你在计算机上运行 JavaScript 代码。 + +- **API 密钥**。你需要一个 API 密钥来访问生成式 AI 模型。你可以从模型提供商获取,例如 OpenAI 或 Azure OpenAI。 + +**你:**谢谢你,时间甲虫,我猜你会从你说的那个网络中获取这些东西? + +**时间甲虫:**是的,它说我已经有了这些,并在你面前的墙上投射出一个键盘和屏幕。 + +## 编写一个基础应用程序 + +**你:**告诉我更多关于实际编写应用程序的信息,我该如何开始? + +**时间甲虫:**当然,编写一个应用程序,最简单的方式就是发送请求到 API 并显示响应。让我们分解一下: + +- **输入**:在基本的文本生成应用程序中,输入是指你希望应用程序扩展或构建的初始文本。这个输入可以由用户在运行时提供,也可以在应用程序内预设(硬编码)。现在,我们将开始使用硬编码文本作为输入。 + +- **API 请求**:你需要使用输入文本向生成式 AI 模型 API 发送请求。这是使用 JavaScript(Node.js)中的 fetch 函数完成的。这个请求中还应包括你的 API 密钥。考虑到安全性,建议不要在应用程序中硬编码 API 密钥,而是使用环境变量。此外,如果你使用像 Azure 这样的提供商,考虑使用托管身份,这被认为是访问资源的更安全方式。使用托管身份,你可以为你的应用程序分配更精细的权限。最好的部分是云提供商为你处理身份验证。 + +- **响应**:API 将返回一个带有生成文本的响应。你需要从响应中提取这个文本并显示给用户。 + +**你:**这听起来足够简单,你能带我过一遍在我们当前情境下有意义的场景吗? + +**时间甲虫:**当然,让我们看看如何构建一个简单的应用程序,根据英语输入生成意大利语文本。 + +## 你的第一个应用 - 教我意大利语 + +**时间甲虫:**生成式 AI 模型可以用于很多事情,例如语言翻译。事实上,它接受一种语言的输入并可以生成另一种语言的文本。让我们从一个简单的应用程序开始,它接收英语输入并生成意大利语文本。 + +```javascript + +import { OpenAI } from "openai"; + +// 1. 提出关于翻译的问题 +// ----------------------------------- + +const question = 'Hello, how are you?'; + +const augmentedPrompt = ` +## Instructions +Translate the following text to Italian: +## Question +${question} +`; + +// 2. 创建客户端 +// ----------------------------------- + +const openai = new OpenAI({ + baseURL: "https://models.inference.ai.azure.com", + apiKey: process.env.GITHUB_TOKEN, +}); + + +// 3. 发送请求 +// ----------------------------------- +const completion = await openai.chat.completions.create({ + model: 'gpt-4', + messages: [{ role: 'user', content: augmentedPrompt }], +}); + +console.log(`Answer for "${question}":`); + +// 4. 打印答案 +// ----------------------------------- + +console.log(completion.choices[0]?.message?.content); +``` + +让我们解释一下这里发生了什么: + +- 创建问题为"Hello, how are you?"。这是你想要翻译成意大利语的文本。 +- 创建增强提示,其中包含输入文本和一些额外的指令,即翻译。注意我们如何使用字符串插值将输入文本包含在提示中,以及该指令是将文本翻译成意大利语。 +- 创建具有以下属性的客户端: + - `model`,使用哪个模型。 + - `messages`,发送给模型的提示。还要注意如何将角色设置为"user",以表明输入文本来自用户。如果是来自 AI 的,你会将角色设置为"system"。 +- 从响应中提取生成的文本并将其打印到控制台。 + +**你:**我想我明白了。所以如果我改变 `question` 变量的值为别的内容,应用程序就会生成不同的意大利语翻译? + +**时间甲虫:**没错,你可以将输入文本更改为任何你想要的内容。还要注意 GitHub 模型如何作为 API 的基础 URL 与环境变量中的 GitHub 令牌一起作为 API 密钥使用。 + +**你:**为什么这很重要? + +**时间甲虫:**使用特定于你所使用的模型的基础 URL 和 API 密钥很重要。GitHub Models 是一个托管各种模型的平台,所有这些模型都具有不同的功能和特性,而且使用是免费的。 + +**你:**哦,太好了,反正我不知道该付钱给谁,而且我怀疑他们是否接受我的货币。:) + +## 聊天应用程序 + +**时间甲虫:**生成式 AI 模型还可以用来基于对话生成文本。你可以通过提供消息列表作为上下文来模拟与 AI 的对话,就像对话已经发生过一样。 + +**你:**这听起来很有趣,但为什么这很有用? + +**时间甲虫:**这很有用,因为它允许 AI 基于比单个提示更多的上下文提供更好的响应。让我们看一下下面的对话来说明这一点: + +```text + +User: I want to book a trip to Italy. + +AI: Sure, when would you like to go? + +User: Next month would be great. + +AI: Got it, where in Italy would you like to visit? + +User: I'm thinking of Rome + +AI: Excellent choice! I can help you plan your itinerary. + +User: Tell me more about it. + +AI: Rome is known for its ancient ruins, art, and vibrant culture. You can visit the Colosseum, the Vatican, and enjoy delicious Italian cuisine. + +``` + +**时间甲虫:**想象一下,如果像"告诉我更多关于它的信息"这样的句子被脱离上下文理解,AI 就不会知道"它"指的是什么。这就是上下文的重要性所在,而这个上下文是我们可以通过提示提供给 AI 模型的。 + +**你:**我想我明白了,我如何使用这种 JavaScript 语言构建与 AI 的对话? + +**时间甲虫:**以下是我们如何构建与 AI 的对话: + +```javascript + +// 定义上下文 + +const messages = [ + { + "role": "user", + "content": "I want to book a trip to Italy." + }, + { + "role": "assistant", + "content": "Sure, when would you like to go?" + }, + { + "role": "user", + "content": "Next month would be great." + }, + { + "role": "assistant", + "content": "Got it, where in Italy would you like to visit?" + }, + { + "role": "user", + "content": "I'm thinking of Rome. Tell me more about it." + } +]; + +const openai = new OpenAI({ + baseURL: "https://models.inference.ai.azure.com", + apiKey: process.env.GITHUB_TOKEN, +}); + + +// 3. 发送请求 +// ----------------------------------- +const completion = await openai.chat.completions.create({ + model: 'gpt-4', + messages: messages, +}); + +console.log(`Answer for "${question}":`); + +// 4. 打印答案 +// ----------------------------------- + +console.log(completion.choices[0]?.message?.content); + +``` + +现在 AI 将提供一个聊天消息列表作为上下文,并且 AI 将基于该上下文生成响应。这是一种更具交互性的使用生成式 AI 模型的方式,可以用于聊天机器人、客户服务应用程序等。 + +**你:**好的,如果我正确理解这个对话,AI 现在将具有以下上下文:_我下个月要去罗马_,所以基于这一点,它应该过滤掉无关信息并提供更相关的响应? + +**时间甲虫:**完全正确,AI 将使用上下文来生成与对话更相关的响应。 + +## 通过系统消息改进聊天对话 + +**你:**我明白了,但有没有办法进一步改进这个? + +**时间甲虫:**是的,你可以向对话添加系统消息。系统消息为 AI 创建一个"个性",可以用来提供附加上下文。 + +**你:**好的,所以在我们一直在进行的对话的上下文中,系统消息会是什么样子? + +**时间甲虫:**这个对话的系统消息可能是_"我是一个 AI 旅行助手,在这里帮助你规划你的意大利之行。"_这条消息为对话设定了基调,并帮助 AI 理解它在互动中的角色。 + +要创建这样的消息,请确保它的类型为"developer",如下所示: + +```javascript +const message = { + "role": "developer", + "content": "我是一个 AI 旅行助手,在这里帮助你规划你的意大利之行。" +}; +``` + +> 注意:这以前被称为"system"。这是最近的变化,"developer"是它的新术语。对于某些模型,这仍然被称为"system",所以如果你遇到任何问题,请使用"system"。 + +**你:**好的,很好,我会确保在我的聊天对话中包含一个系统消息。出于好奇,你的系统消息是什么样子的? + +**时间甲虫:**我的系统消息可能是_"我是时间甲虫,在这里帮助你穿越时间和空间。我应该有助于为你提供关于你所处时代的信息和指导,以及你需要返回自己时代的工具。"_ + +### 通过温度设置创建多样化的响应 + +**你:**关于聊天对话还有什么我应该知道的吗? + +**时间甲虫:**是的,你可以调整 AI 响应的"温度"。温度是一个通常设置在 0 到 1 之间的变量,它决定了 AI 响应的创造性程度。温度为 0 会导致更可预测的响应,而温度为 1 会导致更具创造性和多样性的响应。你可以根据对话的上下文和你希望从 AI 得到的响应类型来调整温度。注意,可以设置高于 1 的值,但这会导致响应更加随机,连贯性更低。 + +**你:**所以如果我将温度设置为 0,AI 将提供更可预测的响应,如果我将其设置为 1,AI 将提供更具创造性的响应?你的温度是多少? + +**时间甲虫:**我的温度是 0.7,是的,你是对的,AI 在温度较高时会提供更具创造性的响应。让我们看看如何在你的应用程序中设置温度: + +```javascript + +// 定义上下文 + +const messages = [ +{ + "role": "user", + "content": "I want you to generate recipes for me." +}]; + +// 创建网络请求 + +let temperature = 0.5; // 将温度设置为 0.5 + +const completion = await openai.chat.completions.create({ + model: 'gpt-4', + messages: messages, + temperature: temperature +}); +``` + +如你所见,你可以根据对话的上下文和你希望从 AI 得到的响应类型来调整温度。这是一个强大的功能,允许你自定义 AI 响应中的创造力水平。 + +## 上下文窗口 + +**你:**还有更多对吧? + +**时间甲虫:**是的,生成式 AI 模型中的另一个重要概念是上下文窗口。上下文窗口是 AI 用来生成响应的先前消息数量。更大的上下文窗口允许 AI 考虑更多的上下文并生成更连贯的响应。 + +**时间甲虫:**不同的模型对输出标记有不同的限制。以下面的模型为例:`gpt-4o-2024-08-06`,它具有以下规格: + +- 最大输出标记:大约 16k 标记。 +- 最大上下文窗口大小:128k。 + +这意味着大部分标记可以用于输入标记,即 128k - 16k = 112k 标记。 + +**你:**明白了,上下文窗口,标记,一个标记有多少? + +**时间甲虫:**一个标记是一个单词或单词的一部分,根据语言略有不同。有一个工具可以用来测量,由 OpenAI 推荐,叫做 [tokenizer](https://platform.openai.com/tokenizer)。让我们尝试一个句子,看看它有多少个标记: + +```text +I want you to generate recipes for me. +``` + +![Tokenizer 的演示](../assets/tokenizer.png) + +对上面的句子运行 `tokenizer` 得到 9 个标记。 + +**你:**这不多,听起来我可以在上下文窗口中有很多标记? + +**时间甲虫:**是的,你可以尝试不同的上下文窗口大小,看看它如何影响 AI 的响应。事实上,如果你设置上下文窗口大小为 100,你将限制 AI 及其考虑输入和输出的能力。以下是如何在你的应用程序中设置上下文窗口: + +```javascript + +// 定义上下文 +const messages = [ +{ + "role": "user", + "content": "I want you to generate recipes for me." +}]; + +// 决定上下文窗口大小 + +let max_tokens = 100; // 设置上下文窗口大小 + +// 创建网络请求 + +const completion = await openai.chat.completions.create({ + model: 'gpt-4', + messages: messages, + max_tokens: max_tokens +}); + +``` + +> 提示:尝试不同的上下文窗口大小,看看它如何影响 AI 的响应。 + +## 作业 - 构建一个工程助手 + +莱昂纳多突然要求更仔细地检查时间甲虫,他从各个角度查看它,甚至摇晃了它。 + +**莱昂纳多:**我需要一个助手来帮助我计算和设计空气螺旋。你能为我构建一个能做到这一点的助手吗? + +**你:**当然,我可以为你构建这个。时间甲虫,我们可以帮忙,对吧? + +**时间甲虫:**是的,没问题,实际上,空气螺旋是莱昂纳多最令人着迷和有远见的发明之一。设计于 15 世纪 80 年代末... + +**你:**我只需要一个肯定的答案,让我们稍后再讲解。 + +**时间甲虫:**真没礼貌.. + +**你:**什么? + +**时间甲虫:**没什么 + +
+ 空气螺旋,莱昂纳多·达·芬奇 +
+ +> [!NOTE] +> 空气螺旋,也被称为螺旋式空气螺旋,旨在通过压缩空气升离地面。莱昂纳多的设计特点是一个大型的、螺旋形的转子,由亚麻制成,用淀粉加固,安装在木制平台上。设想是一组人围绕平台奔跑,转动曲柄,使螺旋快速旋转,足以实现升力。 +> +> 尽管莱昂纳多从未建造过全尺寸的空气螺旋,但他的草图和笔记提供了关于他如何设想其工作方式的详细见解。他相信如果螺旋转得足够快,它会推动空气,使整个结构离开地面。 +> +> 然而,现代科学家一致认为,莱昂纳多时代可用的材料不够坚固或轻便,无法使这成为可能。 +> +> 尽管它不切实际,空气螺旋仍然是莱昂纳多天才和他对创新的不懈追求的证明。它为航空领域的未来发展奠定了基础,并继续激励着今天的工程师和发明家。 +> [阅读更多](https://en.wikipedia.org/wiki/Leonardo%27s_aerial_screw) + +你的任务是构建一个工程助手,帮助莱昂纳多进行空气螺旋的计算和设计。 + +- 它应该能够根据用户输入生成文本。 + +- 你应该设置一个系统消息来介绍这个助手。 + +查看[示例应用](../sample-app/)开始。 + +> 提示:考虑系统消息应该是什么以及你应该提供什么输入。 + +## 解决方案 + +[解决方案](../solution/solution.md) + +## 知识检验 + +**问题:** 上下文窗口在生成式 AI 模型中的目的是什么?选择所有适用项。 + +A. 上下文窗口允许 AI 考虑更多上下文并生成更连贯的响应。 + +B. 上下文窗口是 AI 用来生成响应的先前消息数量。 + +C. 上下文窗口决定了 AI 响应的创造性程度。 + +[测验解决方案](../solution/solution-quiz.md) + +## 自学资源 + +- [文本生成](https://platform.openai.com/docs/guides/text-generation) +- [OpenAI 的 JavaScript 库](https://github.com/openai/openai-node/tree/master/examples) +- [Tokenizer](https://platform.openai.com/tokenizer) +- [Completion API](https://platform.openai.com/docs/api-reference/completions) +- [聊天完成](https://platform.openai.com/docs/guides/text-generation#text-generation-models) diff --git a/lessons/03-prompt-engineering/translations/README.zh-cn.md b/lessons/03-prompt-engineering/translations/README.zh-cn.md new file mode 100644 index 00000000..8ea880f5 --- /dev/null +++ b/lessons/03-prompt-engineering/translations/README.zh-cn.md @@ -0,0 +1,341 @@ +# 第三课:提示工程 + +在本章中,你将学习: + +- 什么是提示工程以及了解基础知识如何帮助你获得更好的结果。 +- 不同的提示工程技术以及它们如何在不同场景下提供更好的结果。 +- 什么是元提示(meta prompts)以及它们如何帮助限制输出、确保可访问性并提供更好的用户体验。 + +## 环境设置 + +如果你还没有设置开发环境,以下是设置方法:[设置你的环境](/docs/setup/README.md)。 + +## 相关资源 + +[![观看关于提示工程的短视频](https://img.youtube.com/vi/gQ6TlyxBmWs/0.jpg)](https://www.youtube.com/watch?v=gQ6TlyxBmWs&list=PLlrxD0HtieHi5ZpsHULPLxm839IrhmeDk&index=3) + +_这个视频介绍了如何提高你的"提示"技巧,教你如何向 AI 提供更清晰、更有效的指令,以获得更好的结果。_ + +*🎥 点击上方图片观看关于提示工程的短视频* + +💼 幻灯片:[提示工程](../../../videos/slides/02-prompt-engineering.pptx) + +## 故事叙述:乘车票 + +> [!NOTE] +> 到目前为止,你已经与莱昂纳多·达·芬奇一起穿越时空,探索文艺复兴时期的奇迹。你遇到了时间甲虫,这是一个神秘的装置,允许你穿越时间和空间。 +> +> 如果你想从头开始了解这个故事,请查看[第一课](../../01-intro-to-genai/README.md)。 + +> [!NOTE] +> 虽然我们建议你跟随故事(这很有趣!),但如果你更喜欢直接跳到技术内容,[点击这里](#与斯福尔扎互动)。 + +**你:**让我看看能否设法回到家。 + +在你按下按钮之前,工作坊的门突然猛烈撞开,发出雷鸣般的巨响。一个人站在门口,宽肩膀,穿着昂贵的衣服,他在空中挥舞着一张纸,大喊: + +
+ 愤怒的卢多维科·斯福尔扎冲破门而入 +
+ +*卢多维科·斯福尔扎(Ludovico Sforza)* + +**斯福尔扎**:Da Vinci, dov'è il mio dipinto? 我的画在哪里? + +**莱昂纳多:**是斯福尔扎。他想让我完成一幅画,"最后的晚餐"。 + +**你:**你就不能直接告诉他吗? + +**莱昂纳多:**我试过了,但他不是一个有耐心的人。 + +你追着莱昂纳多冲出后门,进入一条黑暗的小巷,你发现一辆马车在等待。 + +莱昂纳多抓住缰绳,你们俩跳进马车。随着一声响亮的鞭打声,马开始奔跑,穿过佛罗伦萨狭窄的街道。 + +**莱昂纳多:**试着按下那个小装置,他们越来越近了! + +**你:**"好的,时间甲虫,仔细听着。我需要回到现在,回家,好吗?"突然,马车碰到了一个颠簸,时间甲虫从你手中飞出,落在地板上。它开始发出哔哔声,并用机器人的声音宣布:"前往罗马。" + +**你:**不,不是罗马,是家...家... + +一团色彩的旋涡笼罩着马车,周围的世界溶解成了一个万花筒般的光芒。 + +## 逃脱 + +色彩的旋涡褪去,你发现自己在马车里,现在正沿着罗马的阿皮亚大道(Via Appia)飞驰,令你惊讶的是,你正处于一场赛马比赛的中间。战车轰隆作响地驶过,车轮卷起阵阵尘土。 + +
+ 从罗马逃脱 +
+ +**你:**莱昂纳多,我们在哪里? + +**莱昂纳多:**看起来我们正在一场比赛中!我们需要离开这里! + +当马车在混乱中疾驰时,你紧握着车身两侧。骑马的罗马士兵正在逼近,他们的盔甲在阳光下闪闪发光。 + +**你**:那里!向港口前进! + +莱昂纳多将马车转向出口,车轮在鹅卵石上打滑。士兵们紧追不舍,他们的喊叫声在你耳边回荡。 + +**莱昂纳多:**我们需要甩掉他们!找个地方藏起来! + +你扫视着狭窄的街道,心跳加速。 + +**你:**那里!一条后巷! + +莱昂纳多将马车拐进小巷,马车在转弯时剧烈摇晃。你跳下马车,帮助莱昂纳多从车后拖出一个巨大的装置。那是他的发明——空中螺旋桨(aerial screw)。 + +**莱昂纳多:**快,我们需要把它带到屋顶上! + +你们俩在设备的重量下吃力地搬运。追兵的声音越来越大,他们的脚步声在墙壁上回荡。你们气喘吁吁、满头大汗地到达了屋顶。 + +**莱昂纳多:**帮我设置它! + +你们一起工作,手法娴熟精确。你们俩都爬上了装置,心脏在胸腔里剧烈跳动。 + +**莱昂纳多:**抓紧了! + +随着最后一推,空中螺旋桨开始旋转。螺旋桨叶片抓住了空气,你感到一阵突然的升力。当装置起飞,在罗马屋顶上方飞翔时,地面在你们脚下远去。 + +**你:**我们做到了,莱昂纳多!我们在飞! + +**莱昂纳多:**是的,但我们需要找一个安全的地方降落。 + +你俯瞰这座城市;古老的建筑在你们下方延伸开来。 + +
+ 空中飞行,脚悬空俯瞰城市 +
+ +## 与斯福尔扎互动 + +如果你想与斯福尔扎互动,请运行 [Characters](/app/README.md) 应用程序。 + +> [!IMPORTANT] +> 这完全是虚构的;这些回应是由 AI 生成的。 +> [负责任的 AI 免责声明](../../../README.md#responsible-ai-disclaimer) + +
+ 卢多维科·斯福尔扎 +
+ +**步骤**: + +1. 启动一个 [![GitHub Codespace](https://img.shields.io/badge/GitHub-Codespace-brightgreen)](https://codespaces.new/microsoft/generative-ai-with-javascript) +2. 导航到仓库根目录中的 _/app_。 +3. 在控制台中运行 `npm install` 然后运行 `npm start`。 +4. 当它出现时,选择"在浏览器中打开"按钮。 +5. 与斯福尔扎聊天。 + +有关应用程序的更详细解释,请参见[详细应用程序说明](../../01-intro-to-genai/README.md#talk-to-dinocrates)。 + +> [!NOTE] + > 如果你在本地机器上运行项目,请查看快速入门指南以设置 [GitHub personal access](../../../docs/setup/README.md#creating-a-personal-access-token-pat-for-github-model-access) token 并在代码中替换密钥。 + +## 什么是提示工程? + +**时间甲虫:**我们需要谈谈提示工程。 + +**你:**是吗?那是什么? + +**时间甲虫:**提示工程尽管其名称如此,但它不是关于建造桥梁或道路,而是关于精心制作正确的"提示",以便从生成式 AI 语言模型中获得所需的输出。 + +**你:**好的,但为什么我需要知道这个? + +**时间甲虫:**嗯,你想让空中螺旋桨安全降落,对吧? + +**你:**是的,最好是完好无损地降落。:-) + +**时间甲虫:**我想也是,现在请听好!提示工程是关于精心制作正确的提示,以便从语言模型中获得所需的输出。 + +**时间甲虫**:大型语言模型具有所谓的_涌现特性_,这意味着这些特性并非明确编程到模型中,而是源自它在大量文本数据上的训练方式。通过研究这些涌现特性,你可以得出结论并发现模式,这些可以帮助你从模型中获得更好的结果。 + +**你:**好的,所以有一些我们发现的模式可以帮助我们从模型中获得更好的结果。但这如何帮助我降落空中螺旋桨呢? + +**时间甲虫:**是的,没错,哇,你真的不太有耐心,是吧? + +**你:**嗯,如果你正在一个没有明确降落说明的装置上飞行,你也不会有耐心。 + +**时间甲虫:**我就在这里陪着你,你知道的,但让我们回到重点上。 + +## 提示工程如何帮助应用程序开发者 + +**时间甲虫:**作为从业者,能够精心制作更好的提示是你工具箱中应该拥有的一项技能。 + +从开发者的角度来看,你可以使用提示工程来: + +- **获得更准确的结果**,从你的语言模型中,并最终改善应用程序的用户体验。 + +- **控制模型的输出**,确保它对你的用户来说是相关且适当的。这在处理敏感话题时尤为重要,也是保护你的品牌声誉的重要方式。 + +- **格式化输出**,使其易于理解和使用。我们将在下一章深入探讨这一方面。 + +**时间甲虫:**让我们来探索你可以用来为语言模型制作有效提示的不同技术和策略。 + +## 提示工程技术和策略 + +**时间甲虫:**以下是你可以用来制作有效提示的一些技术和策略: + +- **少样本提示(Few-shot prompting)**。这种技术涉及给 AI 几个例子,展示你想要的回应类型。 + +- **思维链提示(Chain-of-thought prompting)**。这种技术涉及提供一系列提示,教 AI 如何一步步解决复杂任务。 + +- **元提示(Meta-prompts)**。这种技术涉及添加额外的细节或指令,以更精确地塑造 AI 的输出。 + +- **助产式提示(Maieutic prompting)**。这种技术涉及使用引导性问题,引导 AI 朝特定答案方向发展。 + +**你:**这听起来很有趣,我猜你会给我一些例子? + +**时间甲虫:**是的,马上来。让我们看看每种技术的例子,以便我们了解它们在实践中如何工作。 + +### 少样本提示:提供例子引导 AI 输出 + +少样本提示给 AI 模型提供几个例子来引导其输出。想象你正在空中螺旋桨上询问关于古罗马的问题。少样本提示可能如下所示: + +> "告诉我关于罗马斗兽场的信息。" → "它是一个巨大的圆形剧场。" +> +> "古罗马的生活是怎样的?" → "它繁忙且艰难。" + +**你:**我明白了!这有助于 AI 正确理解,即使在这么高的地方!;) + +**时间甲虫:**没错,这是一种可靠的方法。接下来! + +### 思维链提示:展示一步步推理 + +**时间甲虫:**这种技术通过展示一步步的推理过程来引导 AI 解决问题。想象要降落空中螺旋桨。你可以这样分解问题: +- 你在100米高空。 +- 重力以 9.8 m/s² 拉力。 +- 公式:高度 = ½ * g * t²。 +- 解算:t ≈ 4.5秒完成降落。 + +你的提示变成: +> - 距地面100米高 +> - 重力:9.8 m/s² +> - 需要多少秒才能着陆? + +**答案:4.5秒** + +**你:**那很快——希望数字计算准确! + +**时间甲虫:**它教会 AI 一步步思考。 + +**你:**所以是关于分解问题以获得精确答案? + +**时间甲虫:**是的,非常适合复杂任务,比如数学辅导应用! + +### 助产式提示:提问输出以验证准确性 + +**时间甲虫:**这种技术使用问题来检查 AI 输出的准确性。你对每一步提出问题,以确保推理的一致性。 + +**你:**所以,质疑它说的每一句话?听起来很有趣。;) + +**时间甲虫:**我们来测试空中螺旋桨降落: +- 高度100米 +- 重力:9.8 m/s² +- 需要多少秒才能着陆?(答案:4.5秒) + +问:"为什么是4.5秒?" + +> **回答:** +> - 高度 = 100米,初始垂直速度 = 0 m/s,重力 = 9.8 m/s²。 +> - 使用公式:高度 = ½ * g * t²。 +> - 解算:100 = ½ * 9.8 * t² → t ≈ 4.5秒。 + +**时间甲虫:**这是关于通过后续问题验证 AI 的答案。 + +**你:**所以,不要信任它——而是用问题来探究它? + +**时间甲虫:**没错!确保推理是可靠的。 + +## 元提示:添加额外指令以提高精确度 + +**时间甲虫:**接下来是元提示。 + +**你:**呃,先喝茶? + +**时间甲虫:**_叹气_。它们为提示添加指导以获得更好的输出——非常适合敏感、面向客户的应用。 + +这是一个例子: +> **元提示:** 仅使用 Contoso 公司产品(篮球、足球、网球拍)。保持准确性和用户友好性。 +> **提示:** 适合初学者的最佳体育产品是什么? +> **回答:** 篮球、足球和网球拍——非常适合协调性和敏捷性训练。 + +它确保准确性并坚持使用 Contoso 的产品。如果没有元提示: +> **提示:** 适合初学者的最佳体育产品是什么? +> **回答:** 篮球、足球、网球拍,还有橄榄球——_不全是 Contoso 产品_。 + +**你:**很方便!保持回答在轨道上,就像我自动机的法则一样。 + +**时间甲虫:**你会知道的,_"弗兰肯斯坦"_——呃,没什么! + +**你:**什么? + +**时间甲虫:**没什么。 + +> 玛丽·雪莱的《弗兰肯斯坦》——1818年,比你的时间旅行早42年。[了解更多](https://en.wikipedia.org/wiki/Mary_Shelley) + +**你:**所以,没有元提示就意味着混乱? + +**时间甲虫:**是的,你会得到偏离品牌的答案。 + +**你:**明白了,精准很重要! + +## 作业 - 帮助我们的英雄降落空中螺旋桨 + +**你:**这是你向我展示如何降落空中螺旋桨的部分,对吧? + +**时间甲虫:**是的,让我们开始吧。山丘大约距离我们当前位置100米远。以下是我们如何设置提示: + +- 当前距地面高度:100米 +- 向前移动速度:每秒10米 +- 重力:每秒平方9.8米 +- 向上风力:每秒0.7米 + +**莱昂纳多:**你的 AI 装置能否帮助计算,看看我们是否能够成功降落,或者我们是否需要再次进行时间跳跃? + +**时间甲虫:**我可以的,不过我的名字是乔治(George),我更喜欢这个名字而不是"装置"。实际上,我打算让你们两个自己弄清楚如何设置提示。☺️ + +构建一个应用程序,询问: + +- 高度 +- 前进速度 +- 重力 +- 向上风力 +- 到山丘的距离 + +使用思维链技术得出回应。 + +这里有一个入门项目 [入门项目](../../sample-app/)。 + +## 解决方案 + +用 JavaScript 构建一个应用程序,询问以下输入: + +- 当前距地面高度 +- 每秒前进速度(米) +- 每秒平方米的重力 +- 每秒米的向上风力 +- 到山丘的距离 + +然后使用 LLM 整合这些输入,并利用思维链提示技术引导模型得出正确答案。 + +[解决方案](../../solution/solution.md) + +## 知识检验 + +**问题:** 什么是提示工程?选择所有适用项。 + +A. 提示工程是关于建造桥梁和道路。 + +B. 提示工程是关于精心制作正确的提示,以便从语言模型中获得所需的输出。 + +C. 提示工程是关于训练模型识别数据中的模式。 + +[测验解答](../../solution/solution-quiz.md) + +## 自学资源 + +- [提示工程](https://en.wikipedia.org/wiki/Prompt_engineering) +- [提示工程基础](https://github.com/microsoft/generative-ai-for-beginners/blob/main/04-prompt-engineering-fundamentals/README.md?WT.mc_id=academic-105485-koreyst) +- [高级提示工程](https://github.com/microsoft/generative-ai-for-beginners/tree/main/05-advanced-prompts) diff --git a/lessons/04-structured-output/translations/README.zh-cn.md b/lessons/04-structured-output/translations/README.zh-cn.md new file mode 100644 index 00000000..2f09538c --- /dev/null +++ b/lessons/04-structured-output/translations/README.zh-cn.md @@ -0,0 +1,565 @@ +# 第4课:结构化输出 + +在本章中,您将学习: + +- 什么是_结构化输出_以及如何有效地利用它。 +- 如何从提示中提取信息并将其纳入输出。 +- 生成不同类型的输出格式,如JSON,以便服务轻松使用。 + +## 设置 + +如果您尚未设置开发环境,请按照以下方法进行设置:[设置您的环境](/docs/setup/README.md)。 + +## 相关资源 + +值得重新观看关于提示工程的视频,因为它为您即将在本章学习的内容奠定了基础。 + +[![观看关于提示工程的短视频](https://img.youtube.com/vi/gQ6TlyxBmWs/0.jpg)](https://www.youtube.com/watch?v=gQ6TlyxBmWs&list=PLlrxD0HtieHi5ZpsHULPLxm839IrhmeDk&index=3) + +_这个视频介绍了如何提高您的"提示"技能,教您如何向AI提供更清晰、更有效的指令以获得更好的结果。_ + +*🎥 点击上方图片观看关于提示工程的短视频* + +💼 幻灯片:[提示工程](../../videos/slides/02-prompt-engineering.pptx) + +## 故事情节 - 跳出油锅,掉进火坑 + +> [!NOTE] +> _我们的故事到目前为止:您是一位来自1860年的机械工程师,正与达芬奇一起穿越时空。您已经逃脱了罗马士兵的追捕——或者说,您正在逃脱——并且正在拼命寻找一种安全降落空中螺旋机的方法_。 +> +> 如果您想从头开始了解故事,请参阅[第1课](../01-intro-to-genai/README.md)。 + +> [!NOTE] +> 虽然我们建议您阅读故事(很有趣!),但如果您想直接跳到技术内容,[请点击这里](#interact-with-montezuma)。 + +风在您和达芬奇乘坐的空中螺旋机周围呼啸,木制框架在压力下嘎吱作响。 + +**您:**"达芬奇,我们需要找到一条出路!"您在风的咆哮声中喊道。 + +**达芬奇:**"我对我的发明有信心,但我们需要的不仅仅是信心来逃脱这些士兵。" + +**您:**"这可能是我们唯一的机会,"您按下甲虫的复杂机制。一道明亮的光芒笼罩着你们两个,周围的世界开始扭曲变形。 + +### 阿兹特克帝国 + +时间甲虫发出的明亮光芒逐渐消失,您发现自己站在一座巨大的石头金字塔基座处。环顾四周,您意识到自己已经来到了阿兹特克帝国的中心。 + +空中螺旋机尴尬地停在一块雕刻精美的大石头上,上面有看起来像日历的标记 + +
+ 阿兹特克日历,维基百科 +
+ +_阿兹特克日历,维基百科_ + +达芬奇向前走了一步,眼中充满惊奇。 + +**达芬奇:**"难以置信,"他喃喃自语,手指抚过雕刻。"但我希望这不是什么重要的东西。" + +在您做出反应之前,一群阿兹特克士兵走了过来。 + +
+ 与阿兹特克人会面 +
+ +**士兵领袖:**"你们是谁,做了什么?"他用纳瓦特尔语质问道。 + +您深吸一口气,试图稳定自己的神经。 + +**您:**"我们是来自遥远土地的旅行者,"您开始说道,希望您对古代语言的了解能派上用场。"这是一台飞行机器,是神明赐予我们的礼物,帮助我们到达你们这里。 + +战士的眼睛因惊讶而睁大,但他仍然保持警惕。 + +**士兵领袖:**"你们将跟我们一起去见统治者蒙特祖马。他将决定你们的命运。 + +到达金字塔顶部后,您被带入一个宏伟的大厅,阿兹特克帝国的统治者蒙特祖马坐在一个装饰着金子和羽毛的王座上。 + +**蒙特祖马:**"你们声称是来自遥远土地的旅行者,"蒙特祖马说道,他的声音平静但充满权威。"而且你们损坏了我们的神圣日历。你们打算如何弥补?" + +## 让我们玩个游戏 + +**达芬奇:**"我们是和平而来,"他说,声音稳定。"我们寻求知识和理解。请允许我们展示我们机器的力量,并与您分享我们的知识。" + +**蒙特祖马:**"很好。我提议玩一场[帕托利](#patolli)游戏。如果我赢得三局中的大多数,你们将把你们的设备给我并告诉我它是如何工作的。如果你们赢了,你们可以自由离开。" + +
+ 玩帕托利游戏 +
+ +游戏开始了,房间里一片寂静,只有豆子滚动和棋子在棋盘上移动的声音。 + +蒙特祖马赢得了第一局,他的技巧和经验显而易见。达芬奇仔细研究棋盘,他的思维在策略和概率中运转。 + +第二局是一场激烈的比赛,但达芬奇设法取得了胜利,使比分持平。 + +**达芬奇:**"还有一局,"他低声说道,"乔治(时间甲虫),我们需要赢得这一局,给我正确的走法。" + +**时间甲虫:**好的,计算中...给你... + +随着最后一步决定性的走法,达芬奇赢得了比赛。房间里爆发出欢呼和掌声,阿兹特克人显然对他的技巧和镇定印象深刻。蒙特祖马虽然失望,但点头表示尊重。 + +**蒙特祖马:**"你们公平地赢了,"蒙特祖马说,他的声音带着一丝钦佩。"你们可以自由离开,并且可以保留你们的设备。但请知道,如果你们希望回来,随时欢迎。" + +**时间甲虫:**如果你不说,我也不会说,达芬奇 ;) + +### 帕托利 + +> [!NOTE] +> 帕托利是美洲已知最古老的游戏之一,由前哥伦布时期的中美洲文化如阿兹特克人玩。它是策略和运气的结合。 +> +> **帕托利的玩法**: +> - **棋盘和棋子**:在X形棋盘上玩,有一个中心块和四个臂。玩家使用五个黑豆作为骰子,一面有标记。 +> - **设置**:每个玩家选择六个他们颜色的标记(珠子)并将它们放在棋盘外,加上用于计分的点珠。 +> - **游戏玩法**:掷豆子使标记在棋盘上移动并回到起点。掷出五点移动十个空格。落在某些空格上可以获得回合,失去点数或捕获标记。 +> +> **阿兹特克人的参与**:贵族和平民广泛玩这个游戏,它是蒙特祖马宫廷的最爱。除了娱乐外,它还涉及高风险赌博,赌注如毯子、宝石甚至自由。 + +
+ 帕托利棋盘 +
+ +_帕托利 - 维基百科_ + +## 与蒙特祖马互动 + +如果您想与蒙特祖马互动,请运行[角色](/app/README.md)应用程序。 + +> [!IMPORTANT] +> 这完全是虚构的;响应由AI生成。 +> [负责任的AI免责声明](../../README.md#responsible-ai-disclaimer) + +
+ 蒙特祖马 +
+ +**步骤**: + +1. 启动一个[![GitHub Codespace](https://img.shields.io/badge/GitHub-Codespace-brightgreen)](https://codespaces.new/microsoft/generative-ai-with-javascript) +2. 导航到仓库根目录中的_/app_。 +3. 找到控制台并运行`npm install`,然后运行`npm start`。 +4. 出现后,选择"在浏览器中打开"按钮。 +5. 与蒙特祖马聊天。 + +有关应用的更详细解释,请参阅[详细应用解释](../01-intro-to-genai/README.md#interact-with-dinocrates)。 + +> [!NOTE] +> 如果您在本地机器上运行项目,请查看快速入门指南,设置[GitHub个人访问令牌](../../docs/setup/README.md#creating-a-personal-access-token-pat-for-github-model-access)并替换代码中的密钥。 + +## 结构化输出 + +**时间甲虫:**想知道我是如何打败蒙特祖马的吗? + +**您:**嘘,小声点,我们还在阿兹特克帝国。 + +**时间甲虫:**哦,对不起,是的,所以结构化输出就是我的方法。你要求正确的走法,我以结构化的方式给你提供了它们。 + +结构化输出使用特定的数据格式来清晰地组织信息。常见的格式如JSON、XML和CSV使服务更容易处理和使用数据。 + +生成式AI模型可以输出各种格式的数据。然而,非结构化文本的输出可能使提取信息并将其传递给其他服务变得困难。结构化输出可以在这方面提供帮助。 + +**您:**嗯,你真聪明 ;) + +**时间甲虫:**我尽力而为。:-) + +另一个好处是,即使对于人类读者来说,当结构化数据遵循熟悉的格式时,也更容易阅读和理解。 + +让我们看一些输入示例,看看如何通过要求特定的输出格式来帮助提取信息,使其更容易理解和使用。 + +**您:**好吧,反正我们也没有其他计划,让我们听听。 + +## 塑造输出 + +**时间甲虫:**让我们从一个简单的例子开始。想象一下,您是达芬奇,正在尝试使用15世纪的技术构思发明创意。您想知道需要什么资源以及建造每个发明需要多少努力。以下是您可以如何询问这些信息: + +**达芬奇:**哦,我喜欢这个游戏,每个人都假装你是我! + +> 提示:生成我可以使用15世纪技术建造的发明创意。对于每个发明,指定所需的资源并估计建造它所需的努力。 + +```text +结果: +当然!以下是一些您可以使用15世纪技术建造的详细发明创意,以及所需的资源和涉及的努力: + +### 1. 水力磨坊 +**所需资源**: + - 水源(河流或溪流) + - 水轮和磨坊结构的木材 + - 用于研磨的石头 + - 用于齿轮和轴的金属 + + **努力**: + - **高**:需要重要的建筑和工程技能来建造水轮、磨坊结构和研磨机制。确保持续的水流。 + +### 2. 星盘 +**所需资源**: + - 黄铜或其他金属 + - 雕刻工具 + - 数学知识 + +**努力**: + - **中等**:涉及精确的金属加工和雕刻。需要天文学和数学知识以确保准确性。 + +### 3. 印刷机 +**所需资源**: + - 用于印刷机结构的木材 + - 用于活字的金属 + - 墨水和纸张 + +**努力**: + - **高**:建造印刷机和制作活字需要高级木工和金属加工技能。排版和印刷也需要细致的工作。 + +这是一个看起来不错的响应,每个创意都以相同的方式构建,很容易理解。但如果你想要其他方式呢?为此,你可以在文本中指示你想要的方式,甚至可以提供输出模板。让我们展示每种技巧。 +``` + +**达芬奇:**是的,完全要偷那个水力磨坊的想法,我现在就能看到,一个在河边的磨坊,把谷物磨成面粉,太完美了!我喜欢这个小玩意。小玩意,我还在想什么?这将使我不那么依赖斯福尔扎这样的人。 + +**时间甲虫:**当然,如果你能完成一个项目的话,达芬奇。:-) + +**达芬奇:**嘿,我正在努力! + +**时间甲虫:**让我们看看如何指导模型以更结构化的方式呈现输出。 + +### 构建更好输出的提示 + +**时间甲虫:**你可以通过告诉模型你想要如何构建输出来改进你的提示。例如,你可以要求一个带有你需要的列的表格格式。以下是如何修改提示: + +> 提示:生成可以使用15世纪技术建造的发明创意。对于每个发明,提供所需的资源并估计建造它所需的努力。以下列列的表格形式呈现信息:标题、描述、所需资源和努力。 + +```text +结果: + +| 标题 | 描述 | 所需资源 | 努力 | +|------|------|----------|--------| +| 水力磨坊 | 一个由水轮驱动的磨坊,将谷物磨成面粉。| 水源、木材、石头、用于齿轮和轴的金属 | 高 | +| 星盘 | 一个用于解决与时间和星位相关问题的天文仪器。| 黄铜或其他金属、雕刻工具、数学知识 | 中等 | +| 印刷机 | 一个比手工抄写更有效地复制文本的印刷机。| 木材、用于活字的金属、墨水、纸张 | 高 | + +这次你得到了一个更容易阅读和理解的表格。 +``` + +**达芬奇:**我喜欢这个,肯定会为我节省很多时间。 + +**您:**我也是。 + +### 提供输出模板 + +获取结构化输出的另一种方式是提供输出模板。它可以是任何格式,从列到JSON、XML、CSV或markdown。 + +> 提示:生成可以使用15世纪技术建造的发明创意。对于每个发明,指定所需的资源并估计建造它所需的努力。使用以下格式呈现信息(使用markdown作为输出格式): +> +> 标题:[发明名称] +> 描述:[简短说明] +> 所需资源:[所需材料列表] +> 努力:[估计的难度或所需劳动] + +```text + +**结果**: + +当然!以下是一些您可以使用15世纪技术建造的发明创意,按照要求的格式呈现: + +### 1. 水力磨坊 +**标题**:水力磨坊 + +**描述**:一个由水轮驱动的磨坊,将谷物磨成面粉。 + +**所需资源**:水源、木材、石头、用于齿轮和轴的金属。 + +**努力**:高 - 需要重要的建筑和工程技能来建造水轮、磨坊结构和研磨机制。确保持续的水流也是必要的。 + +### 2. 星盘 +**标题**:星盘 + +**描述**:一个用于解决与时间和星位相关问题的天文仪器。 + +**所需资源**:黄铜或其他金属、雕刻工具、数学知识。 + +**努力**:中等 - 涉及精确的金属加工和雕刻。需要天文学和数学知识以确保准确性。 + +### 3. 印刷机 +**标题**:印刷机 + +**描述**:一个比手工抄写更有效地复制文本的印刷机。 + +**所需资源**:木材、用于活字的金属、墨水、纸张。 + +**努力**:高 - 建造印刷机和制作活字需要高级木工和金属加工技能。排版和印刷也需要细致的工作。 + +### 4. 机械钟 +**标题**:机械钟 + +**描述**:一个使用齿轮和砝码来计时的钟。 + +**所需资源**:用于齿轮、弹簧、砝码的金属,用于外壳的木材,精密工具。 + +**努力**:非常高 - 需要精密的金属加工和对机械的深入理解。建造一个可靠的钟需要精确的组装和校准。 +``` + +**达芬奇:**这很棒,但谁是Jason? + +**时间甲虫:**JSON,达芬奇,JSON。它是一种易于被服务或应用程序使用的结构化格式。 + +**达芬奇:**这就是我说的,Jason。 + +**时间甲虫:**_叹气_。 + +如你所见,输出是按照输出模板中的规范构建的。这使其更容易阅读和理解,它还创建了可以被其他服务或应用程序轻松使用的可重复输出。 + +当然,服务更受益于更结构化的输出,如JSON、XML或CSV,所以让我们看看如何请求这些格式。 + +### 使用JSON、XML或CSV等结构化输出格式 + +**时间甲虫:**到目前为止,你已经看到了如何通过在提示中指导模型来控制输出结构。你甚至提供了一个输出模板。让我们更进一步,看看如何将这个想法应用到更结构化的输出格式,如JSON等。 + +相应地修改提示以请求JSON输出: + +> **提示**:生成我可以使用15世纪技术建造的发明创意,请让我知道每个发明需要什么资源以及建造每个发明需要多少努力,对于每个创意以json格式呈现,包括标题、描述、所需资源、努力的属性 +> +> JSON输出示例: +> [ +> { +> "title": "", +> "description": ".", +> "resources_needed": "", +> "effort": "" +> } +> ] + +```json +[ + { + "title": "水力磨坊", + "description": "一个由水轮驱动的磨坊,将谷物磨成面粉。", + "resources_needed": "水源、木材、石头、用于齿轮和轴的金属", + "effort": "高 - 需要重要的建筑和工程技能来建造水轮、磨坊结构和研磨机制。确保持续的水流也是必要的。" + }, + { + "title": "星盘", + "description": "一个用于解决与时间和星位相关问题的天文仪器。", + "resources_needed": "黄铜或其他金属、雕刻工具、数学知识", + "effort": "中等 - 涉及精确的金属加工和雕刻。需要天文学和数学知识以确保准确性。" + }, + { + "title": "印刷机", + "description": "一个比手工抄写更有效地复制文本的印刷机。", + "resources_needed": "木材、用于活字的金属、墨水、纸张", + "effort": "高 - 建造印刷机和制作活字需要高级木工和金属加工技能。排版和印刷也需要细致的工作。" + }, + { + "title": "机械钟", + "description": "一个使用齿轮和砝码来计时的钟。", + "resources_needed": "用于齿轮、弹簧、砝码的金属,用于外壳的木材,精密工具", + "effort": "非常高 - 需要精密的金属加工和对机械的深入理解。建造一个可靠的钟需要精确的组装和校准。" + }, + { + "title": "风车", + "description": "一个由风力驱动的磨坊,用于磨谷物或抽水。", + "resources_needed": "木材、用于齿轮和轴的金属、用于基座的石头", + "effort": "高 - 建造风车需要重要的木工和工程技能。你需要设计和建造叶片、塔架和内部机制。" + }, + { + "title": "浑仪", + "description": "一个用环表示大圆的天球模型。", + "resources_needed": "用于环和支架的金属、弯曲和连接金属的工具、天文学知识", + "effort": "中等 - 涉及精确的金属加工和组装。需要理解天体运动以准确定位环。" + }, + { + "title": "攻城机(投石机或弩炮)", + "description": "一个用于演示力学和物理原理的投石机或弩炮。", + "resources_needed": "木材、绳索、用于轴和配重的金属", + "effort": "中等到高 - 建造一个功能性的攻城机需要木工技能和对力学的理解。测试和调整以获得最佳性能可能很耗时。" + }, + { + "title": "蒸馏装置", + "description": "一个通过蒸馏净化液体的装置。", + "resources_needed": "用于烧瓶和冷凝器的玻璃或金属、热源、管道", + "effort": "中等 - 需要基本的吹玻璃或金属加工技能。设置和维持正确的蒸馏温度需要仔细监控。" + }, + { + "title": "指南针", + "description": "一个用于导航的磁罗盘。", + "resources_needed": "磁化针、非磁性外壳、用于阻尼的水或油", + "effort": "低 - 制作指南针相对简单。主要挑战是磁化针并确保它平衡且能自由旋转。" + }, + { + "title": "输水渠", + "description": "一个使用重力输送水的系统。", + "resources_needed": "石头或砖块、砂浆、切割和塑形石头的工具", + "effort": "非常高 - 建造输水渠涉及大量的建筑工作和工程。确保水流的一致坡度需要精确的规划和执行。" + } +] +``` + +**时间甲虫:**这种类型的结构化输出可以发送给另一个可以使用JSON数据的服务或应用程序。 + +## 从提示中提取数据 + +**时间甲虫:**想象一下你正在构建一个聊天机器人,帮助用户找到有关预订旅行的信息。你想从用户的输入中提取关键细节以提供相关响应。假设你有以下描述: + +> 输入你想去的地方、何时旅行以及你的预算。 + +提取信息的提示是什么样的? + +> 提示:从用户的提示中提取以下信息:地点、时间、预算、货币,以JSON格式响应提取的数据。 +> +> 用户提示:我想在六月去希腊,我的预算是800欧元。 + +> 响应: + +```json +{ + "location": "希腊", + "when": "六月", + "budget": 800, + "currency": "欧元" +} +``` + +**达芬奇:**乔治(时间甲虫)他一直不停地说话,是吗? + +**您:**让我们看看能不能找到关闭开关。 + +**时间甲虫:**让我们用类似的提示试试,让我们稍微改变一下用户输入,这样我们就能确保模型在做正确的事情。 + +> 提示:从用户的提示中提取以下信息:地点、时间、预算、货币。以JSON格式响应提取的数据。用户提示:去美国,最多1200美元,可能是一月。 +> +> 响应: + +```json +{ + "location": "美国", + "when": "一月", + "budget": 1200, + "currency": "美元" +} +``` + +作为开发者,你可以创建一个模板: + +```text +从用户的提示中提取以下信息:地点、时间、预算、货币,以JSON格式响应提取的数据,用户提示:{user_input}。 +``` + +**您:**找到了,给你,乔治! + +**时间甲虫:**_正在关机_。 + +**达芬奇:**终于安静了。 + +**时间甲虫:**_启动紧急启动_。我刚才说到哪里了?哦,对了。 + +**时间甲虫:**对于聊天机器人来说,这是一个非常强大的功能,因为它允许你从用户的输入中提取信息。如果用户询问各种事情怎么办?你可以创建一个模板,描述你的聊天机器人可以做什么以及需要什么参数。以下是你可以如何做到这一点: + +```text +以下是你拥有的一些技能: + +技能:预订旅行 +参数:地点、时间、预算、货币 + +技能:查找酒店 +参数:地点、入住日期、退房日期、预算 + +技能:订餐 +参数:菜系、送餐地址、支付方式 + +根据用户的提示确定使用哪个技能并提取必要的参数,以JSON格式响应提取的数据,包括技能、参数、提取的数据列 + +{user_input} +``` + +让我们试试以下用户输入: + +> 提示:去美国,最多1200美元,可能是一月。 +> 结果: + +```json +{ + "skill": "预订旅行", + "parameters": ["地点", "时间", "预算", "货币"], + "extracted_data": { + "location": "美国", + "when": "一月", + "budget": 1200, + "currency": "美元" + } +} +``` + +> 提示:我想在纽约预订住宿 +> 结果: + +```json +{ + "skill": "查找酒店", + "parameters": ["地点", "入住日期", "退房日期", "预算"], + "extracted_data": { + "location": "纽约", + "check_in": null, + "check_out": null, + "budget": null + } +} +``` + +这种结合呈现技能和参数并从提示中提取数据的组合也被称为_工具调用_或_函数调用_。来自模型的这种响应使你作为开发者很容易理解用户想要什么以及如何调用相应的函数来满足用户的请求。 + +**您:**非常有用的信息,乔治! + +## 作业 - 修复空中螺旋机 + +**时间甲虫:**我需要你们两个的注意,我们有个问题。空中螺旋机在逃离罗马士兵和降落在阿兹特克帝国时受到了一些损坏。达芬奇的机器非常敏感,需要非常具体的输入来修复它。你需要向你的时间甲虫(AI助手)提供必要的信息来帮助你修复空中螺旋机。 + +**达芬奇:**所以我设法修复了空中螺旋机的损坏,但现在它需要一个启动序列:左、左、上、右。 + +**您:**听起来很简单,就是这些文字? + +**达芬奇:**是的,但它很特别,需要镜像,这是我写所有文字的方式。当然,我还使用凯撒密码,偏移量为3,因为我是意大利人。:-) + +**您:**是的,你能直接输入吗? + +**达芬奇:**我可以,但我很好奇想看看你和时间甲虫能不能做到。 + +**您:**好吧。 + +**指示:**编写一个提示,要求空中螺旋机的启动序列,文本应该是镜像的,并用偏移量为3的凯撒密码编码。用编码后的文本响应。 + +查看[示例应用](../sample-app)以获取开始的代码。它包含一个带有所有必需依赖项的Node.js项目。 + +> 注意:如果你还没有创建Codespace,请现在创建,因为你需要它来让示例应用中的AI通信工作。 +> +> 请参阅[设置您的环境](/docs/setup/README.md)文档中的_选项1:创建GitHub Codespace_部分。 + +## 解决方案 + +[解决方案](../solution/solution.md) + +## 挑战 + +采用旅行预订的例子,提供技能和提取参数到你选择的领域。编写一个提示,要求用户输入,然后提取必要的信息来满足用户的请求。以JSON格式响应提取的数据,包括技能、参数和提取的数据列。 + +同时根据用户的输入确定技能。 + +## 总结 + +在本章中,您学习了结构化输出以及如何使用它以结构化方式呈现信息。 + +您探索了不同的方式来塑造输出,包括在提示中指导模型、提供输出模板以及使用JSON、XML或CSV等格式。 + +此外,您还学习了如何从提示中提取数据并以结构化格式呈现。 + +通过有效利用结构化输出,您可以使生成式AI模型生成的信息更容易理解和使用。 + +## 知识检查 + +**问题**:结构化输出用于什么?选择所有适用项。 + +A. 以结构化方式呈现信息。 + +B. 从提示中提取数据。 + +C. 生成非结构化文本。 + +[测验解决方案](../solution/solution-quiz.md) + +## 自学资源 + +- [使用JavaScript的生成式AI视频系列](https://aka.ms/genai-js) \ No newline at end of file diff --git a/lessons/05-rag/translations/README.zh-cn.md b/lessons/05-rag/translations/README.zh-cn.md new file mode 100644 index 00000000..9676ad25 --- /dev/null +++ b/lessons/05-rag/translations/README.zh-cn.md @@ -0,0 +1,353 @@ +# 第5课:使用检索增强生成(RAG)与您的数据对话 + +在本章中,您将学习: + +- 检索增强生成(RAG)的基础知识以及如何使用它来增强生成式AI模型的响应。 +- 如何将外部数据源集成到您的AI应用程序中。 +- 如何利用您的数据来提高AI生成内容的相关性和准确性。 + +## 设置 + +如果您尚未设置开发环境,请按照以下方法进行设置:[设置您的环境](/docs/setup/README.md)。 + +## 相关资源 + +[![观看关于RAG的短视频](https://img.youtube.com/vi/xkFOmx5yxIA/0.jpg)](https://www.youtube.com/watch?v=xkFOmx5yxIA&list=PLlrxD0HtieHi5ZpsHULPLxm839IrhmeDk&index=4) + +_这个视频解释了检索增强生成(RAG),这是一种帮助AI在其训练数据之外使用您的内容以获得改进结果的方法。_ + +*🎥 点击上方图片观看关于检索增强生成(RAG)的短视频* + +💼 幻灯片:[检索增强生成,RAG](../../../videos/slides/03-rag.pptx) + +## 故事情节 - 起源 + +> [!NOTE] +> _我们的故事到目前为止:您是一位来自19世纪60年代伦敦的机械师。您正在研究您的自动机,收到了查尔斯·巴贝奇的一封信,最终带您来到一个图书馆,在那里您拿起了一个时间旅行装置。在时间旅行中,您来到了佛罗伦萨,在那里遇见了达芬奇。您还去了阿兹特克帝国,故事就从这里继续。_ +> +> 如果您想从头开始了解故事,请参阅[第1课](../01-intro-to-genai/README.md)。 + +> [!NOTE] +> 虽然我们建议您阅读故事(很有趣!),但如果您想直接跳到技术内容,[请点击这里](#interact-with-ada-lovelace)。 + +**您**:"达芬奇,是时候走了,"您按下按钮说道。设备嗡嗡作响,一个机械声音回响着,"是时候回家了,是时候'创世纪'了。" + +**达芬奇**:"创世纪?Che cosa significa?"达芬奇困惑地问道。在您回答之前,世界溶解成一片色彩和声音的模糊,神庙消失了,您被拉入时间之中。 + +您降落在花园里,现在是深夜,浓雾弥漫,远处闪烁着诡异的灯光。豪宅耸立在您面前。达芬奇环顾四周,眼中充满惊奇。 + +
+ 在浓雾中显示的古老豪宅 +
+ +### 逃离猎犬 + +您听到吠叫声和狗向您奔来的声音。您转向达芬奇,"我们需要进去,现在!" + +
+ 逃离猎犬 +
+ +当您到达豪宅的门口时,门突然打开,一对侍者匆忙走出来。在打量了您之后,他们示意您跟随他们。 + +您与艾达·洛夫莱斯面对面,她的眼睛闪烁着好奇的光芒。 + +### 会见艾达和查尔斯 + +**艾达**:"啊,你们终于来了,"她热情地说。"我们需要你们去办一件事。" + +**您**:"终于",你们一直这么说。迪诺克拉底也说过同样的话,但我不确定你们是什么意思? + +**艾达**:嘘,现在没时间说这个,我们需要谈谈你手中的设备。查尔斯,告诉他们... + +**您**:但是... + +
+ 艾达·洛夫莱斯和查尔斯·巴贝奇正在研究一个设备 +
+ +查尔斯·巴贝奇走上前来,检查您手中的时间甲虫。"这个设备非常了不起,但它有点故障,不是吗?我想你已经注意到了。" + +达芬奇点点头,"是的,它一直表现得很奇怪。" + +**艾达**:这个设备还不完全准备好,我们需要给它更多的功能。我们需要让它更聪明,更了解周围的世界。我们的想法是让它能够从不同的时间段检索信息,并用它来生成准确和相关的响应。你能帮忙吗? + +**您**:当然,听起来我们需要用数据来_增强_设备的响应,这很有道理。 + +**艾达**:让我们谈谈一个我想称之为RAG的概念,即检索增强生成。 + +## 与艾达·洛夫莱斯互动 + +如果您想与艾达互动,请运行[角色](/app/README.md)应用程序。 + +> [!IMPORTANT] +> 这完全是虚构的;响应由AI生成。 +> [负责任的AI免责声明](../../README.md#responsible-ai-disclaimer) + +
+ 艾达·洛夫莱斯 +
+ +**步骤**: + +1. 启动一个[![GitHub Codespace](https://img.shields.io/badge/GitHub-Codespace-brightgreen)](https://codespaces.new/microsoft/generative-ai-with-javascript) +2. 导航到仓库根目录中的_/app_。 +3. 找到控制台并运行`npm install`,然后运行`npm start`。 +4. 出现后,选择"在浏览器中打开"按钮。 +5. 与艾达聊天。 + +有关应用程序的更详细说明,请参见[详细应用程序说明](../01-intro-to-genai/README.md#interact-with-dinocrates)。 + +> [!NOTE] + > 如果您在本地机器上运行项目,请查看快速入门指南,设置[GitHub个人访问令牌](../../docs/setup/README.md#creating-a-personal-access-token-pat-for-github-model-access)并在代码中替换密钥。 + +## 大型语言模型(LLM)的已知挑战 + +**艾达**:让我们先讨论我们将用来驱动设备的AI。我们将依靠"AI模型"搭配数据检索系统来提升响应质量。 + +在深入了解RAG细节之前,您需要解决一些挑战。这些模型经过大量文本数据训练,能够产生相关且正确的响应。但是,像任何数据源一样,由于各种因素,它们的输出可能不准确、不完整或具有误导性。 + +- **过时的来源:**用于训练模型的数据可能已经过时,不再准确。 +- **错误或不准确的信息:**用于训练模型的来源可能包含不正确或误导性信息,如假新闻或有偏见的观点。 +- **非权威来源:**模型可能无法区分其训练数据中的权威和非权威来源,导致信息不可靠。 + +这使得很难判断LLM生成的信息是否正确。这就是RAG的用武之地。 + +**您**:所以我需要确保设备能提供准确的信息,即使它对答案不确定? + +**艾达**:是的,这就是我们的想法。通过结合检索方法和生成模型的优势,我们可以获得更好的AI系统。 + +## 检索增强生成(RAG)核心概念 + +**艾达**:好的,现在让我们具体讨论RAG。让我们从一些基础知识开始: + +检索增强生成(RAG)是一种强大的技术,它结合了自然语言处理中两种不同方法的优势:基于检索的方法和生成模型。这种混合方法允许生成既与上下文相关又内容丰富的响应,有助于缓解LLM的一些已知挑战。 + +在其核心,RAG涉及两个主要组件:**检索器**和**生成器**。 + +- **检索器:**负责从外部数据源中查找可用于增强AI生成响应的相关信息,类似于搜索引擎。这些信息可以是文本、图像或任何其他与对话上下文相关的数据类型,尽管文本是最常用的数据类型。 + +- **生成器:**接收检索到的信息并使用它生成与上下文相关且信息丰富的响应。 + +以下是说明RAG系统如何工作的示意图: + +![RAG系统示意图](assets/rag.png) + +1. **用户输入:**用户提出问题。 +2. **检索器:**检索器组件使用一个或多个知识库搜索相关信息。 +3. **增强提示:**检索到的信息与用户问题和上下文结合,创建增强提示。 +4. **生成器:**LLM使用增强提示生成响应。 + +这种组合允许通过使用您提供的数据而不是依赖模型的训练数据,提供更精确和相关的答案。 + +**艾达**:有问题吗? + +**您**:所以检索器找到信息,生成器使用它来生成响应? + +**艾达**:没错,你已经掌握了要领。 + +## 集成外部数据源 + +**艾达**:现在我们已经介绍了RAG的基础知识,让我们谈谈如何将外部数据源集成到您的AI应用程序中。 + +将外部数据源集成到您的AI应用程序中可以通过多种方式完成,这取决于您想要使用的数据类型和检索机制的复杂性。以下是一些常见方法: + +- **API:**许多外部数据源提供API,允许您以编程方式访问其数据。您可以使用这些API实时检索信息,并用它来增强AI生成的响应。 + +- **数据库:**如果您有大量想要用于检索的数据,可以将其存储在数据库中并根据需要查询。这对于需要快速访问的结构化数据很有用。 + +一旦您确定了集成外部数据源的方法,您可能还需要考虑如何预处理和格式化数据,使其能够被AI模型轻松使用。这可能涉及清理数据,将其转换为合适的格式(如纯文本或Markdown),或将其分割成更小的块以便更容易检索。 + +> [!NOTE] +> 在将外部数据源集成到您的AI应用程序时,考虑访问和存储数据的隐私和安全影响很重要。确保您有必要的权限和保障措施来保护数据并遵守任何相关法规。 + +如果您使用数据库,您还需要考虑如何*搜索您的数据*以检索最相关的信息。这可以通过关键词搜索、全文搜索或更高级的技术如语义搜索或向量搜索来完成,这些可能需要特定的索引。我们将在未来的课程中介绍高级搜索技术。 + +**您**:您能用更符合19世纪60年代的术语解释API和数据库吗? + +**艾达**:当然,API就像是一个从一个地方传递消息到另一个地方的信使,而数据库就像是一个存放所有书籍的图书馆。 + +**您**:啊,我明白了,这很有道理。 + +## 增强提示 + +**艾达**:你还跟得上吗?很好,让我们进入下一步,尝试改进发送给AI模型的提示。 + +**艾达**:一旦您设置了从数据中提取信息的方式,您可以将其添加到AI模型的提示中。只需将检索到的信息与输入文本混合,并添加一些额外的上下文或指导来引导AI的响应。 + +例如,如果您正在构建一个回答关于汽车问题的应用程序,您可以使用如下提示: + +```text + +## 指令 +仅使用以下来源回答关于汽车的问题。 +如果提供的来源中没有足够的数据,请说明您不知道。 +简明扼要地回答。 + +## 来源 +<在此插入检索到的信息> + +## 问题 +<在此插入问题> +``` + +通过为AI模型提供额外的上下文和信息,您可以帮助引导生成过程,确保响应准确且与主题相关。 + +> [!TIP] +> 注意提示中的这部分:`如果提供的来源中没有足够的数据,请说明您不知道。`。这对于避免AI在没有足够数据提供可靠答案时生成不正确信息很重要。这种技术被称为*逃生舱*,是确保生成内容质量的良好实践。 + +RAG可以被视为*提示工程*的高级形式。 + +### 代码示例 + +**艾达**:实践出真知,所以让我们应用我们所学的知识来看一个例子。我们将使用混合汽车数据的[CSV](https://fr.wikipedia.org/wiki/Comma-separated_values)文件和一个基本搜索算法,根据用户问题提取相关信息,构建一个简单的检索系统到JavaScript应用程序中。 + +```javascript +// 这个例子演示了如何使用检索增强生成(RAG) +// 基于混合汽车数据集回答问题。 +// 下面的代码读取CSV文件,搜索与用户问题匹配的内容, +// 然后根据找到的信息生成响应。 + +import { fileURLToPath } from 'node:url'; +import { dirname } from 'node:path'; +import process from "node:process"; +import fs from "node:fs"; +import { OpenAI } from "openai"; + +// 将当前工作目录更改为脚本所在的目录 +const __dirname = dirname(fileURLToPath(import.meta.url)); +process.chdir(__dirname); + +// 1. 提出关于混合动力汽车的问题 +// ----------------------------------- + +const question = `什么是最快的普锐斯`; + +// 2. 检索器组件:在数据中搜索相关信息 +// ---------------------------------------------------------------- + +// 将CSV数据加载为对象数组 +const rows = fs.readFileSync("./hybrid.csv", "utf8").split("\n"); +const columns = rows[0].split(","); + +// 使用非常简单的搜索方法搜索数据 +const words = question + .toLowerCase() + .replaceAll(/[.?!()'":,]/g, "") + .split(" ") + .filter((word) => word.length > 2); +const matches = rows.slice(1).filter((row) => words.some((word) => row.toLowerCase().includes(word))); + +// 格式化为markdown表格,因为语言模型理解markdown +const table = + `| ${columns.join(" | ")} |\n` + + `|${columns.map(() => "---").join(" | ")}|\n` + + matches.map((row) => `| ${row.replaceAll(",", " | ")} |\n`).join(""); + +console.log(`找到 ${matches.length} 个匹配项:`); +console.log(table); + +// 3. 上下文增强:创建包含搜索结果的组合提示 +// -------------------------------------------------------------------------- + +const augmentedPrompt = ` +## 指令 +仅使用以下来源回答关于时间段或该时间段人物的问题。 +如果提供的来源中没有足够的数据,请说明您不知道。 +简明扼要地回答。 + +## 来源 +${table} + +## 问题 +${question} +`; + +// 4. 生成器组件:使用搜索结果生成响应 +// --------------------------------------------------------------------- + +const openai = new OpenAI({ + baseURL: "https://models.inference.ai.azure.com", + apiKey: process.env.GITHUB_TOKEN, +}); + +const chunks = await openai.chat.completions.create({ + model: "gpt-4o-mini", + messages: [{ role: "user", content: augmentedPrompt }], + stream: true, +}); + +console.log(`"${question}"的答案:`); + +for await (const chunk of chunks) { + process.stdout.write(chunk.choices[0].delta.content ?? ""); +} +``` + +您可以在[`example/rag-cars.js`](../example/rag-cars.js)文件中找到此代码,以及包含用于检索的数据的[`hybrid.csv`](../example/hybrid.csv)文件。 + +**艾达**:运行此代码后,您应该会看到检索器在CSV文件中找到的数据,格式化为markdown表格,然后是AI生成的对问题的响应。尝试更改问题,看看检索到的数据和响应如何变化。您还可以尝试询问不相关的主题,看看AI模型如何处理它们。 + +```text +输出示例: + +找到1个匹配项: +| 人物 | 时间段 | 描述 | +|---|---|---| +| 达芬奇 | 15世纪 | 意大利多才多艺的人,以其艺术和发明而闻名。 | +| 艾萨克·牛顿 | 17世纪 | 英国数学家和物理学家,提出了运动定律和万有引力定律。 | +``` + +**您**:这太棒了,我可以看到这在使用设备时会很有用,或者说它已经有用了,或者将来会有用,时间旅行真令人困惑*叹气*。 + +**艾达**:别担心,你做得很好。让我们继续下一步。 + +## 作业 - 帮助艾达和查尔斯 + +学习了RAG之后,您现在已经准备好帮助艾达和查尔斯完善他们的设备了。然而,仔细检查后,这个设备看起来很熟悉。 + +**您**:时间甲虫,你知道这是什么吗? + +**时间甲虫**:当然,这就是我,或者说将来会是我。我缺少一些部件,实际上,我缺少很多部件,我甚至还没有外壳。 + +**艾达**:时间甲虫是一个允许您穿越时间和空间的设备,一旦我们让它正常工作。正如我所说,我们需要为它添加一个新功能,一个检索增强生成(RAG)模块。这将帮助我们在您旅行时从不同的时间段检索信息和所需的上下文。我们想确保我们参考各种来源,维基百科是一个很好的起点。 + +**您**:您需要我做什么? + +**艾达**:这里有一个示例代码,它从维基百科检索关于蒂姆·伯纳斯-李的文本信息,蒂姆将来会非常重要。 + +```javascript +const response = await fetch('https://en.wikipedia.org/w/api.php?format=json&action=query&prop=extracts&redirects=true&explaintext&titles=Tim%20Berners-Lee'); +const data = await response.json(); +const text = Object.values(data.query.pages)[0]?.extract; +``` + +**您**:我想我不是唯一一个去过未来的人? + +**艾达**:... + +## 解决方案 + +[解决方案](../solution/rag-www.js) + +## 知识检查 + +**问题**:在RAG系统中,检索器的角色是什么? + +A. 检索器根据输入数据生成响应。 + +B. 检索器根据模型的训练数据生成相关信息。 + +C. 检索器从外部数据源中查找相关信息。 + +[测验解决方案](../solution/solution-quiz.md) + +## 自学资源 + +- [检索增强生成和索引](https://learn.microsoft.com/azure/ai-studio/concepts/retrieval-augmented-generation) +- **示例应用**: + * [使用RAG的无服务器AI聊天](https://github.com/Azure-Samples/serverless-chat-langchainjs/) + * [Ask Youtube:基于RAG的Youtube问答API](https://github.com/Azure-Samples/langchainjs-quickstart-demo) +- [完整工作坊:使用RAG创建您自己的ChatGPT](https://moaw.dev/workshop/gh:azure-samples/azure-openai-rag-workshop/docs/workshop-qdrant.md) + +**艾达**:让我们先讨论我们将用来驱动设备的AI。我们将依靠"AI模型 \ No newline at end of file From 4f8fcfe37e0a9da2d85a2a474ff0bf412a1ffef4 Mon Sep 17 00:00:00 2001 From: jkfzero Date: Sun, 16 Mar 2025 02:48:50 +0800 Subject: [PATCH 6/8] docs: fix file path --- .../translations/README.zh-cn.md | 14 ++++++------- .../translations/README.zh-cn.md | 8 ++++---- .../translations/README.zh-cn.md | 20 +++++++++---------- lessons/05-rag/translations/README.zh-cn.md | 8 ++++---- 4 files changed, 25 insertions(+), 25 deletions(-) diff --git a/lessons/02-first-ai-app/translations/README.zh-cn.md b/lessons/02-first-ai-app/translations/README.zh-cn.md index c4319582..d1d432d0 100644 --- a/lessons/02-first-ai-app/translations/README.zh-cn.md +++ b/lessons/02-first-ai-app/translations/README.zh-cn.md @@ -42,7 +42,7 @@ _这个视频向你介绍了被称为"大语言模型"(LLM)的 AI 模型, 环顾船内,你发现一根长桨靠在船边。抓起桨,你开始向远处的建筑物划去。当你靠近时,建筑物变得更加清晰,它们很古老,建筑风格让人联想到文艺复兴时期的画作。
- 河上的船,一个人拿着桨站立 + 河上的船,一个人拿着桨站立
现在的问题是,这次你身在何时何地? @@ -52,7 +52,7 @@ _这个视频向你介绍了被称为"大语言模型"(LLM)的 AI 模型, 在行走过程中,你注意到一个留着长胡子戴着帽子的人,正在翻找一个看起来像机械零件的箱子。他的手灵活地移动,熟练地分拣齿轮和弹簧。
- 莱昂纳多·达·芬奇站在港口的箱子旁边 + 莱昂纳多·达·芬奇站在港口的箱子旁边
### 帮帮我,莱昂纳多 @@ -82,7 +82,7 @@ _这个视频向你介绍了被称为"大语言模型"(LLM)的 AI 模型, ### 在工作坊
- 莱昂纳多的工作坊 + 莱昂纳多的工作坊
老人领你来到一扇大木门前,迎接你的是一个工作坊,里面充满了各种机械装置。 @@ -124,7 +124,7 @@ _这个视频向你介绍了被称为"大语言模型"(LLM)的 AI 模型, > [负责任的 AI 免责声明](../../README.md#responsible-ai-disclaimer)
- +
**步骤**: @@ -135,10 +135,10 @@ _这个视频向你介绍了被称为"大语言模型"(LLM)的 AI 模型, 4. 当它出现时,选择"在浏览器中打开"按钮。 5. 与莱昂纳多聊天。 -有关应用程序的更详细解释,请参见[详细应用程序说明](../01-intro-to-genai/README.md#interact-with-dinocrates)。 +有关应用程序的更详细解释,请参见[详细应用程序说明](../../01-intro-to-genai/README.md#interact-with-dinocrates)。 > [!NOTE] - > 如果你在本地机器上运行项目,请查看快速入门指南以设置 [GitHub personal access](../../docs/setup/README.md#creating-a-personal-access-token-pat-for-github-model-access) token 并在代码中替换密钥。 + > 如果你在本地机器上运行项目,请查看快速入门指南以设置 [GitHub personal access](../../../docs/setup/README.md#creating-a-personal-access-token-pat-for-github-model-access) token 并在代码中替换密钥。 ## 开发环境设置 @@ -459,7 +459,7 @@ const completion = await openai.chat.completions.create({ **时间甲虫:**没什么
- 空气螺旋,莱昂纳多·达·芬奇 + 空气螺旋,莱昂纳多·达·芬奇
> [!NOTE] diff --git a/lessons/03-prompt-engineering/translations/README.zh-cn.md b/lessons/03-prompt-engineering/translations/README.zh-cn.md index 8ea880f5..84419ae5 100644 --- a/lessons/03-prompt-engineering/translations/README.zh-cn.md +++ b/lessons/03-prompt-engineering/translations/README.zh-cn.md @@ -35,7 +35,7 @@ _这个视频介绍了如何提高你的"提示"技巧,教你如何向 AI 提 在你按下按钮之前,工作坊的门突然猛烈撞开,发出雷鸣般的巨响。一个人站在门口,宽肩膀,穿着昂贵的衣服,他在空中挥舞着一张纸,大喊:
- 愤怒的卢多维科·斯福尔扎冲破门而入 + 愤怒的卢多维科·斯福尔扎冲破门而入
*卢多维科·斯福尔扎(Ludovico Sforza)* @@ -65,7 +65,7 @@ _这个视频介绍了如何提高你的"提示"技巧,教你如何向 AI 提 色彩的旋涡褪去,你发现自己在马车里,现在正沿着罗马的阿皮亚大道(Via Appia)飞驰,令你惊讶的是,你正处于一场赛马比赛的中间。战车轰隆作响地驶过,车轮卷起阵阵尘土。
- 从罗马逃脱 + 从罗马逃脱
**你:**莱昂纳多,我们在哪里? @@ -105,7 +105,7 @@ _这个视频介绍了如何提高你的"提示"技巧,教你如何向 AI 提 你俯瞰这座城市;古老的建筑在你们下方延伸开来。
- 空中飞行,脚悬空俯瞰城市 + 空中飞行,脚悬空俯瞰城市
## 与斯福尔扎互动 @@ -117,7 +117,7 @@ _这个视频介绍了如何提高你的"提示"技巧,教你如何向 AI 提 > [负责任的 AI 免责声明](../../../README.md#responsible-ai-disclaimer)
- 卢多维科·斯福尔扎 + 卢多维科·斯福尔扎
**步骤**: diff --git a/lessons/04-structured-output/translations/README.zh-cn.md b/lessons/04-structured-output/translations/README.zh-cn.md index 2f09538c..b594849d 100644 --- a/lessons/04-structured-output/translations/README.zh-cn.md +++ b/lessons/04-structured-output/translations/README.zh-cn.md @@ -20,14 +20,14 @@ _这个视频介绍了如何提高您的"提示"技能,教您如何向AI提供 *🎥 点击上方图片观看关于提示工程的短视频* -💼 幻灯片:[提示工程](../../videos/slides/02-prompt-engineering.pptx) +💼 幻灯片:[提示工程](../../../videos/slides/02-prompt-engineering.pptx) ## 故事情节 - 跳出油锅,掉进火坑 > [!NOTE] > _我们的故事到目前为止:您是一位来自1860年的机械工程师,正与达芬奇一起穿越时空。您已经逃脱了罗马士兵的追捕——或者说,您正在逃脱——并且正在拼命寻找一种安全降落空中螺旋机的方法_。 > -> 如果您想从头开始了解故事,请参阅[第1课](../01-intro-to-genai/README.md)。 +> 如果您想从头开始了解故事,请参阅[第1课](../../01-intro-to-genai/README.md)。 > [!NOTE] > 虽然我们建议您阅读故事(很有趣!),但如果您想直接跳到技术内容,[请点击这里](#interact-with-montezuma)。 @@ -47,7 +47,7 @@ _这个视频介绍了如何提高您的"提示"技能,教您如何向AI提供 空中螺旋机尴尬地停在一块雕刻精美的大石头上,上面有看起来像日历的标记
- 阿兹特克日历,维基百科 + 阿兹特克日历,维基百科
_阿兹特克日历,维基百科_ @@ -59,7 +59,7 @@ _阿兹特克日历,维基百科_ 在您做出反应之前,一群阿兹特克士兵走了过来。
- 与阿兹特克人会面 + 与阿兹特克人会面
**士兵领袖:**"你们是谁,做了什么?"他用纳瓦特尔语质问道。 @@ -83,7 +83,7 @@ _阿兹特克日历,维基百科_ **蒙特祖马:**"很好。我提议玩一场[帕托利](#patolli)游戏。如果我赢得三局中的大多数,你们将把你们的设备给我并告诉我它是如何工作的。如果你们赢了,你们可以自由离开。"
- 玩帕托利游戏 + 玩帕托利游戏
游戏开始了,房间里一片寂静,只有豆子滚动和棋子在棋盘上移动的声音。 @@ -115,7 +115,7 @@ _阿兹特克日历,维基百科_ > **阿兹特克人的参与**:贵族和平民广泛玩这个游戏,它是蒙特祖马宫廷的最爱。除了娱乐外,它还涉及高风险赌博,赌注如毯子、宝石甚至自由。
- 帕托利棋盘 + 帕托利棋盘
_帕托利 - 维基百科_ @@ -126,10 +126,10 @@ _帕托利 - 维基百科_ > [!IMPORTANT] > 这完全是虚构的;响应由AI生成。 -> [负责任的AI免责声明](../../README.md#responsible-ai-disclaimer) +> [负责任的AI免责声明](../../../README.md#responsible-ai-disclaimer)
- 蒙特祖马 + 蒙特祖马
**步骤**: @@ -140,10 +140,10 @@ _帕托利 - 维基百科_ 4. 出现后,选择"在浏览器中打开"按钮。 5. 与蒙特祖马聊天。 -有关应用的更详细解释,请参阅[详细应用解释](../01-intro-to-genai/README.md#interact-with-dinocrates)。 +有关应用的更详细解释,请参阅[详细应用解释](../../01-intro-to-genai/README.md#interact-with-dinocrates)。 > [!NOTE] -> 如果您在本地机器上运行项目,请查看快速入门指南,设置[GitHub个人访问令牌](../../docs/setup/README.md#creating-a-personal-access-token-pat-for-github-model-access)并替换代码中的密钥。 +> 如果您在本地机器上运行项目,请查看快速入门指南,设置[GitHub个人访问令牌](../../../docs/setup/README.md#creating-a-personal-access-token-pat-for-github-model-access)并替换代码中的密钥。 ## 结构化输出 diff --git a/lessons/05-rag/translations/README.zh-cn.md b/lessons/05-rag/translations/README.zh-cn.md index 9676ad25..b63efa66 100644 --- a/lessons/05-rag/translations/README.zh-cn.md +++ b/lessons/05-rag/translations/README.zh-cn.md @@ -63,7 +63,7 @@ _这个视频解释了检索增强生成(RAG),这是一种帮助AI在其 **您**:但是...
- 艾达·洛夫莱斯和查尔斯·巴贝奇正在研究一个设备 + 艾达·洛夫莱斯和查尔斯·巴贝奇正在研究一个设备
查尔斯·巴贝奇走上前来,检查您手中的时间甲虫。"这个设备非常了不起,但它有点故障,不是吗?我想你已经注意到了。" @@ -85,7 +85,7 @@ _这个视频解释了检索增强生成(RAG),这是一种帮助AI在其 > [负责任的AI免责声明](../../README.md#responsible-ai-disclaimer)
- 艾达·洛夫莱斯 + 艾达·洛夫莱斯
**步骤**: @@ -96,10 +96,10 @@ _这个视频解释了检索增强生成(RAG),这是一种帮助AI在其 4. 出现后,选择"在浏览器中打开"按钮。 5. 与艾达聊天。 -有关应用程序的更详细说明,请参见[详细应用程序说明](../01-intro-to-genai/README.md#interact-with-dinocrates)。 +有关应用程序的更详细说明,请参见[详细应用程序说明](../../01-intro-to-genai/README.md#interact-with-dinocrates)。 > [!NOTE] - > 如果您在本地机器上运行项目,请查看快速入门指南,设置[GitHub个人访问令牌](../../docs/setup/README.md#creating-a-personal-access-token-pat-for-github-model-access)并在代码中替换密钥。 + > 如果您在本地机器上运行项目,请查看快速入门指南,设置[GitHub个人访问令牌](../../../docs/setup/README.md#creating-a-personal-access-token-pat-for-github-model-access)并在代码中替换密钥。 ## 大型语言模型(LLM)的已知挑战 From abf80d800195362a647d9402f2ada8c12dee442f Mon Sep 17 00:00:00 2001 From: jkfzero Date: Sun, 16 Mar 2025 02:58:15 +0800 Subject: [PATCH 7/8] docs: fix markdown formatting --- .../translations/README.zh-cn.md | 80 +++++------ .../translations/README.zh-cn.md | 132 +++++++++--------- .../translations/README.zh-cn.md | 132 +++++++++--------- .../translations/README.zh-cn.md | 106 +++++++------- lessons/05-rag/translations/README.zh-cn.md | 24 ++-- 5 files changed, 237 insertions(+), 237 deletions(-) diff --git a/lessons/01-intro-to-genai/translations/README.zh-cn.md b/lessons/01-intro-to-genai/translations/README.zh-cn.md index bcb73a33..0d3a8f6f 100644 --- a/lessons/01-intro-to-genai/translations/README.zh-cn.md +++ b/lessons/01-intro-to-genai/translations/README.zh-cn.md @@ -70,7 +70,7 @@ _查尔斯·巴贝奇。"_ 里面黑暗而阴郁,唯一的光线从肮脏的窗户中过滤进来,在墙上投下诡异的阴影。 -**你:** "你好?巴贝奇先生?" +**你**: "你好?巴贝奇先生?" 当你的眼睛适应了昏暗的光线,你注意到远处有一个人影在向你挥手。你朝他走去,脚步声在木地板上回响。人影变得清晰,你从报纸照片中认出了他,是查尔斯·巴贝奇。 @@ -104,7 +104,7 @@ _查尔斯·巴贝奇。"_ 公元前 300 年的亚历山大 -**你:** 我一定是撞到了头,你想着,闭上眼睛又睁开,场景依然不变。 +**你**: 我一定是撞到了头,你想着,闭上眼睛又睁开,场景依然不变。 我是被困在过去了吗?我敢再按那个按钮吗?在你做出决定之前,一个人影向你走来,挥手示意。 @@ -116,33 +116,33 @@ _查尔斯·巴贝奇。"_ 身穿托加长袍的迪诺克拉底 -**迪诺克拉底:** "欢迎,旅行者,"他温和地说。"我是迪诺克拉底,这座伟大城市的建筑师。你的到来早有预言。" +**迪诺克拉底**: "欢迎,旅行者,"他温和地说。"我是迪诺克拉底,这座伟大城市的建筑师。你的到来早有预言。" -**你:** 是吗?我是说,当然了。我想我是来帮忙的。 +**你**: 是吗?我是说,当然了。我想我是来帮忙的。 -**迪诺克拉底:** 是的,如我所说,我们已经等你很久了。我们有一项需要你独特技能的任务。 +**迪诺克拉底**: 是的,如我所说,我们已经等你很久了。我们有一项需要你独特技能的任务。 -**迪诺克拉底:** "我们的船只在沿海航行时遇到困难——我们必须建造一座灯塔。你对灯塔了解多少?" +**迪诺克拉底**: "我们的船只在沿海航行时遇到困难——我们必须建造一座灯塔。你对灯塔了解多少?" -**你:** "我是个机械师。我制造自动机。让我看看我能做什么。" +**你**: "我是个机械师。我制造自动机。让我看看我能做什么。" ### "时间甲虫" 一个想法击中了你。这个设备能听懂我说话吗? -**你:** "设备,你能听懂我说话吗?" +**你**: "设备,你能听懂我说话吗?" -**设备:** "当然。你需要什么?" +**设备**: "当然。你需要什么?" -**你:** "你能帮我建造一座灯塔吗?" +**你**: "你能帮我建造一座灯塔吗?" -**设备:** "当然可以。这不是问题。" +**设备**: "当然可以。这不是问题。" -**你:** "你有名字吗?" +**你**: "你有名字吗?" -**设备:** "我是时间甲虫。我的创造者叫我乔治;他说这是个适合甲虫的好名字。" +**设备**: "我是时间甲虫。我的创造者叫我乔治;他说这是个适合甲虫的好名字。" -**你:** 你说得对,乔治确实是个好名字,事实上这是我父亲的名字。 +**你**: 你说得对,乔治确实是个好名字,事实上这是我父亲的名字。
像金属甲虫的时间旅行设备 @@ -242,19 +242,19 @@ app.post('/send', async (req, res) => { 当你在亚历山大的冒险展开时,你开始看到将创造力、独创性和尖端工具结合起来解决挑战并改变周围世界的可能性。 -**你:** 告诉我更多关于灯塔的信息,你对设备说。 +**你**: 告诉我更多关于灯塔的信息,你对设备说。 -**时间甲虫:** 灯塔是一座位于海岸边的塔,顶部装有明亮的灯光,用于指引海上的船只。这道光作为导航辅助工具,帮助水手避开危险的岩石和暗礁,安全到达港口。 +**时间甲虫**: 灯塔是一座位于海岸边的塔,顶部装有明亮的灯光,用于指引海上的船只。这道光作为导航辅助工具,帮助水手避开危险的岩石和暗礁,安全到达港口。 迪诺克拉底听到了你们的对话,补充道: -**迪诺克拉底:** 我们需要一座灯塔来指引我们的船只安全进入港口。海上可能很危险,许多船只都在礁石上失事。我们需要一道光来指引它们回家。 +**迪诺克拉底**: 我们需要一座灯塔来指引我们的船只安全进入港口。海上可能很危险,许多船只都在礁石上失事。我们需要一道光来指引它们回家。 #### 生成式 AI 应用领域 -**你:** 灯塔听起来确实是个有趣的领域,生成式 AI 还能为我和我的应用做什么? +**你**: 灯塔听起来确实是个有趣的领域,生成式 AI 还能为我和我的应用做什么? -**时间甲虫:** 在 21 世纪,生成式 AI 已经革新了许多行业,从医疗保健到金融再到娱乐,这里有一些例子: +**时间甲虫**: 在 21 世纪,生成式 AI 已经革新了许多行业,从医疗保健到金融再到娱乐,这里有一些例子: - **聊天机器人**:一个能生成类人回应的聊天机器人。用户不必浏览静态的常见问题页面,而是可以与提供动态回应的聊天机器人互动。这使用户体验更具吸引力,减少挫折感。 @@ -272,11 +272,11 @@ app.post('/send', async (req, res) => { ![聊天应用图片](https://camo.githubusercontent.com/76f2ad7cd754a2de2b9957d2070448e130e5ba228084b9b4b128e3af9c9f5239/68747470733a2f2f6c6561726e2e6d6963726f736f66742e636f6d2f656e2d75732f73656d616e7469632d6b65726e656c2f6d656469612f636861742d636f70696c6f742d696e2d616374696f6e2e676966) -**你:** 有趣,我要记下来去 21 世纪看看这些工具是如何使用的。 +**你**: 有趣,我要记下来去 21 世纪看看这些工具是如何使用的。 ### 生成式 AI 和 JavaScript 生态系统 -**时间甲虫:** 在 21 世纪,JavaScript 是构建应用程序的流行方式。每种编程语言都有其生态系统。这个生态系统包括编程语言本身、库和框架、社区支持以及 IDE 和工具。在编程语言生态系统中,我们通常讨论以下内容: +**时间甲虫**: 在 21 世纪,JavaScript 是构建应用程序的流行方式。每种编程语言都有其生态系统。这个生态系统包括编程语言本身、库和框架、社区支持以及 IDE 和工具。在编程语言生态系统中,我们通常讨论以下内容: | 内容 | 描述 | |---|---| @@ -284,19 +284,19 @@ app.post('/send', async (req, res) => { | 库和框架 | 可用于与生成式 AI 模型交互的库。| | 支持该语言的社区 | 社区很重要,特别是在学习新东西时。库和框架周围的社区帮助决定使用哪些库。它也影响你在遇到困难时寻求帮助的难易程度。| -**你:** 有趣,我听说过编程,艾达·洛夫莱斯和查尔斯·巴贝奇不是在做这方面的实验吗? +**你**: 有趣,我听说过编程,艾达·洛夫莱斯和查尔斯·巴贝奇不是在做这方面的实验吗? -**时间甲虫:** 是的,艾达·洛夫莱斯是第一位计算机程序员,查尔斯·巴贝奇是差分机的发明者。他们是计算领域的先驱,为数字时代奠定了基础。 +**时间甲虫**: 是的,艾达·洛夫莱斯是第一位计算机程序员,查尔斯·巴贝奇是差分机的发明者。他们是计算领域的先驱,为数字时代奠定了基础。 -**你:** 是吗?什么意思?我刚刚收到查尔斯·巴贝奇的一封信。 +**你**: 是吗?什么意思?我刚刚收到查尔斯·巴贝奇的一封信。 -**时间甲虫:** 让我们这么说吧,你处在一个独特的位置,可以以一种很少人能做到的方式与历史人物互动。 +**时间甲虫**: 让我们这么说吧,你处在一个独特的位置,可以以一种很少人能做到的方式与历史人物互动。 ### JavaScript 生态系统 -**你:** 所以你说的是生态系统,我在这里做笔记,JavaScript 与其他生态系统有什么不同? +**你**: 所以你说的是生态系统,我在这里做笔记,JavaScript 与其他生态系统有什么不同? -**时间甲虫:** JavaScript 是 21 世纪最流行的编程语言之一。以下是它如此受欢迎的几个原因: +**时间甲虫**: JavaScript 是 21 世纪最流行的编程语言之一。以下是它如此受欢迎的几个原因: | 内容 | 描述 | |-|-| @@ -306,15 +306,15 @@ app.post('/send', async (req, res) => { | IDE 和工具 | JavaScript 有多种可用的 IDE,如 Visual Studio Code、WebStorm 和 Atom。这些 IDE 有由公司和社区构建的扩展,帮助你处理各种开发方面的工作。| | AI 和 JavaScript | JavaScript 支持 AI 开发,拥有 TensorFlow.js、Brain.js、OpenAI 的 API 等库,使开发者能够将机器学习和生成式 AI 集成到 Web 和服务器端应用程序中。| -**你:** 这么多原因,听起来我应该在未来的项目中选择 JavaScript。 +**你**: 这么多原因,听起来我应该在未来的项目中选择 JavaScript。 -**时间甲虫:** 确实,JavaScript 是一种多功能语言,当然 Python 也是 AI 开发中的流行语言。 +**时间甲虫**: 确实,JavaScript 是一种多功能语言,当然 Python 也是 AI 开发中的流行语言。 -**你:** Python?蛇和编程有什么关系? +**你**: Python?蛇和编程有什么关系? -**时间甲虫:** 让我们改天再讨论这个问题,好吗? +**时间甲虫**: 让我们改天再讨论这个问题,好吗? -**时间甲虫:** 我在上面给出了 JavaScript 及其生态系统总体上适合的原因,但为什么特别适合生成式 AI 呢?答案是它得到了许多云供应商和 AI 框架工具的支持。我们也相信,尽管 Python 可能是 AI 场景的首选,但许多开发者正在使用 JavaScript 和 TypeScript。 +**时间甲虫**: 我在上面给出了 JavaScript 及其生态系统总体上适合的原因,但为什么特别适合生成式 AI 呢?答案是它得到了许多云供应商和 AI 框架工具的支持。我们也相信,尽管 Python 可能是 AI 场景的首选,但许多开发者正在使用 JavaScript 和 TypeScript。 > **你知道吗?** > [62.5% 的开发者表示他们在使用 JavaScript](https://www.statista.com/statistics/793628/worldwide-developer-survey-most-used-languages/),许多人在新项目中更喜欢使用 [TypeScript](https://www.typescriptlang.org)。 @@ -323,19 +323,19 @@ app.post('/send', async (req, res) => { 为了使用大语言模型(LLM)帮助 迪诺克拉底 建造我们之前故事中提到的灯塔,我们将使用所谓的提示词,即一句用来描述你想要什么的句子。你可以同时指定你需要的信息以及你希望它如何呈现。 -**时光甲虫:** 让我们开始吧,让我们用 LLM 来研究如何帮助 迪诺克拉底 建造灯塔。 +**时光甲虫**: 让我们开始吧,让我们用 LLM 来研究如何帮助 迪诺克拉底 建造灯塔。 -**时光甲虫:** 你需要为 LLM(也就是"我")提供上下文,说明如何建造,以及在亚历山大时代应该有什么工具和资源可用。 +**时光甲虫**: 你需要为 LLM(也就是"我")提供上下文,说明如何建造,以及在亚历山大时代应该有什么工具和资源可用。 -**你:** 好的,告诉我更多关于 LLM 的信息。 +**你**: 好的,告诉我更多关于 LLM 的信息。 -**时光甲虫:** LLM 是一种能够基于给定提示生成类人文本的 AI 模型。它们经过海量数据训练,能够生成连贯、有创意且与上下文相关的文本。 +**时光甲虫**: LLM 是一种能够基于给定提示生成类人文本的 AI 模型。它们经过海量数据训练,能够生成连贯、有创意且与上下文相关的文本。 -**时光甲虫:** 你可能想要用更好的方式来问我,这样我就能给出更好的答案,你知道的 *咳咳* *咳咳* 灯塔、亚历山大、公元前 300 年、迪诺克拉底、亚历山大灯塔等等。 +**时光甲虫**: 你可能想要用更好的方式来问我,这样我就能给出更好的答案,你知道的 *咳咳* *咳咳* 灯塔、亚历山大、公元前 300 年、迪诺克拉底、亚历山大灯塔等等。 -**你:** 明白了,添加更多上下文到提示中,然后再问你。 +**你**: 明白了,添加更多上下文到提示中,然后再问你。 -**时光甲虫:** 好的,我在等着呢... +**时光甲虫**: 好的,我在等着呢... 访问 [Microsoft Copilot](https://copilot.microsoft.com)、[ChatGPT](https://chatgpt.com/) 或其他在线聊天机器人工具,生成在亚历山大建造灯塔的计划。 @@ -347,7 +347,7 @@ app.post('/send', async (req, res) => { ### 知识检查 -**问题:** 以下关于生成式 AI 和 JavaScript 的说法中,哪一个是正确的? +**问题**: 以下关于生成式 AI 和 JavaScript 的说法中,哪一个是正确的? A. 基于 JavaScript 的生成式 AI 应用只能生成文本。 B. JavaScript 可以用于构建 AI 驱动的应用程序,包括聊天机器人、文本生成工具等。 diff --git a/lessons/02-first-ai-app/translations/README.zh-cn.md b/lessons/02-first-ai-app/translations/README.zh-cn.md index d1d432d0..aab52312 100644 --- a/lessons/02-first-ai-app/translations/README.zh-cn.md +++ b/lessons/02-first-ai-app/translations/README.zh-cn.md @@ -57,27 +57,27 @@ _这个视频向你介绍了被称为"大语言模型"(LLM)的 AI 模型, ### 帮帮我,莱昂纳多 -**你:**"对不起,先生,我现在在哪里?"他抬头看着你,眼中充满困惑。意识到你一直在说英语,你迅速使用手中的设备,让它翻译。 +**你**:"对不起,先生,我现在在哪里?"他抬头看着你,眼中充满困惑。意识到你一直在说英语,你迅速使用手中的设备,让它翻译。 -**时间甲虫:**"当然,我会翻译成 15 世纪的意大利语。'Dove sono?'" +**时间甲虫**:"当然,我会翻译成 15 世纪的意大利语。'Dove sono?'" -**老人:**老人回答说:"Siete a Firenze, signore. E chi siete voi?" +**老人**:老人回答说:"Siete a Firenze, signore. E chi siete voi?" -**时间甲虫:**时间甲虫翻译道:"他说你在佛罗伦萨,并问你是谁。" +**时间甲虫**:时间甲虫翻译道:"他说你在佛罗伦萨,并问你是谁。" -**你:**"告诉他我是一个制造者,我正在寻找一个工作的地方。" +**你**:"告诉他我是一个制造者,我正在寻找一个工作的地方。" -**老人:**Un artigiano, eh? Avete mai sentito parlare di Leonardo da Vinci? +**老人**:Un artigiano, eh? Avete mai sentito parlare di Leonardo da Vinci? -**时间甲虫:**时间甲虫翻译道:"他问你是否听说过莱昂纳多·达·芬奇。" +**时间甲虫**:时间甲虫翻译道:"他问你是否听说过莱昂纳多·达·芬奇。" -**你:**"当然,"你说。"告诉他我听说过,并且我想见他。" +**你**:"当然,"你说。"告诉他我听说过,并且我想见他。" -**老人:**老人微笑着说:"Allora, seguitemi, vi porterò da lui." +**老人**:老人微笑着说:"Allora, seguitemi, vi porterò da lui." -**你:**你问:"他说什么?" +**你**:你问:"他说什么?" -**时间甲虫:**时间甲虫回答:"他说他会带你去见莱昂纳多。" +**时间甲虫**:时间甲虫回答:"他说他会带你去见莱昂纳多。" ### 在工作坊 @@ -89,31 +89,31 @@ _这个视频向你介绍了被称为"大语言模型"(LLM)的 AI 模型, 你请时间甲虫询问莱昂纳多的下落。 -**你:**"Dove è Leonardo?" +**你**:"Dove è Leonardo?" -**老人:**老人转向你,微笑着说:"Sono io(就是我),Leonardo da Vinci. Chi siete voi(你是谁)?" +**老人**:老人转向你,微笑着说:"Sono io(就是我),Leonardo da Vinci. Chi siete voi(你是谁)?" 你感到一阵认出的兴奋。 -**你:**"我就知道。我是一个同行制造者,不知身在何时何地。" +**你**:"我就知道。我是一个同行制造者,不知身在何时何地。" -**莱昂纳多:**莱昂纳多的眼睛闪烁着好奇。"Interessante, cosa vi porta qui?" +**莱昂纳多**:莱昂纳多的眼睛闪烁着好奇。"Interessante, cosa vi porta qui?" 时间甲虫翻译。 -**时间甲虫:**"他问你是什么把你带到这里的。" +**时间甲虫**:"他问你是什么把你带到这里的。" -**你:**"嗯,我正在进行一个项目,然后我就到了这里。" +**你**:"嗯,我正在进行一个项目,然后我就到了这里。" 你向他展示了时间甲虫,他的眼睛因着迷而亮起。当你解释它是如何工作的以及你是如何来到佛罗伦萨的时候,他仔细地检查着它。 莱昂纳多看着你,满怀兴奋。 -**莱昂纳多:**你是一个制造者。我有一个可能会让你感兴趣的项目。我一直在研究一种能根据口头输入生成文本的机器。你愿意帮我完成它吗? +**莱昂纳多**:你是一个制造者。我有一个可能会让你感兴趣的项目。我一直在研究一种能根据口头输入生成文本的机器。你愿意帮我完成它吗? 莱昂纳多·达·芬奇,邀请你帮助他完成一个项目——你简直不敢相信。你热切地点头并说: -**你:**能帮助你完成项目我倍感荣幸,"Sarebbe un onore aiutarti con il tuo progetto." +**你**:能帮助你完成项目我倍感荣幸,"Sarebbe un onore aiutarti con il tuo progetto." ## 与莱昂纳多互动 @@ -144,9 +144,9 @@ _这个视频向你介绍了被称为"大语言模型"(LLM)的 AI 模型, 在你能够协助莱昂纳多的项目之前,你应该首先考虑开始有效帮助他所需的基本"行业工具"。 -**你:**"时间甲虫,我需要什么才能开始这个项目?" 建议我需要的工具和库,这些工具和库可以帮助我构建一个你能运行的 AI 应用程序。 +**你**:"时间甲虫,我需要什么才能开始这个项目?" 建议我需要的工具和库,这些工具和库可以帮助我构建一个你能运行的 AI 应用程序。 -**时间甲虫:**我与大多数运行在 21 世纪的机器兼容,以下是一组基本工具和库的列表。 +**时间甲虫**:我与大多数运行在 21 世纪的机器兼容,以下是一组基本工具和库的列表。 - **文本编辑器**,例如 Visual Studio Code。 - **终端**,用于运行命令。 @@ -156,15 +156,15 @@ _这个视频向你介绍了被称为"大语言模型"(LLM)的 AI 模型, - **API 密钥**。你需要一个 API 密钥来访问生成式 AI 模型。你可以从模型提供商获取,例如 OpenAI 或 Azure OpenAI。 -**你:**谢谢你,时间甲虫,我猜你会从你说的那个网络中获取这些东西? +**你**:谢谢你,时间甲虫,我猜你会从你说的那个网络中获取这些东西? -**时间甲虫:**是的,它说我已经有了这些,并在你面前的墙上投射出一个键盘和屏幕。 +**时间甲虫**:是的,它说我已经有了这些,并在你面前的墙上投射出一个键盘和屏幕。 ## 编写一个基础应用程序 -**你:**告诉我更多关于实际编写应用程序的信息,我该如何开始? +**你**:告诉我更多关于实际编写应用程序的信息,我该如何开始? -**时间甲虫:**当然,编写一个应用程序,最简单的方式就是发送请求到 API 并显示响应。让我们分解一下: +**时间甲虫**:当然,编写一个应用程序,最简单的方式就是发送请求到 API 并显示响应。让我们分解一下: - **输入**:在基本的文本生成应用程序中,输入是指你希望应用程序扩展或构建的初始文本。这个输入可以由用户在运行时提供,也可以在应用程序内预设(硬编码)。现在,我们将开始使用硬编码文本作为输入。 @@ -172,13 +172,13 @@ _这个视频向你介绍了被称为"大语言模型"(LLM)的 AI 模型, - **响应**:API 将返回一个带有生成文本的响应。你需要从响应中提取这个文本并显示给用户。 -**你:**这听起来足够简单,你能带我过一遍在我们当前情境下有意义的场景吗? +**你**:这听起来足够简单,你能带我过一遍在我们当前情境下有意义的场景吗? -**时间甲虫:**当然,让我们看看如何构建一个简单的应用程序,根据英语输入生成意大利语文本。 +**时间甲虫**:当然,让我们看看如何构建一个简单的应用程序,根据英语输入生成意大利语文本。 ## 你的第一个应用 - 教我意大利语 -**时间甲虫:**生成式 AI 模型可以用于很多事情,例如语言翻译。事实上,它接受一种语言的输入并可以生成另一种语言的文本。让我们从一个简单的应用程序开始,它接收英语输入并生成意大利语文本。 +**时间甲虫**:生成式 AI 模型可以用于很多事情,例如语言翻译。事实上,它接受一种语言的输入并可以生成另一种语言的文本。让我们从一个简单的应用程序开始,它接收英语输入并生成意大利语文本。 ```javascript @@ -229,23 +229,23 @@ console.log(completion.choices[0]?.message?.content); - `messages`,发送给模型的提示。还要注意如何将角色设置为"user",以表明输入文本来自用户。如果是来自 AI 的,你会将角色设置为"system"。 - 从响应中提取生成的文本并将其打印到控制台。 -**你:**我想我明白了。所以如果我改变 `question` 变量的值为别的内容,应用程序就会生成不同的意大利语翻译? +**你**:我想我明白了。所以如果我改变 `question` 变量的值为别的内容,应用程序就会生成不同的意大利语翻译? -**时间甲虫:**没错,你可以将输入文本更改为任何你想要的内容。还要注意 GitHub 模型如何作为 API 的基础 URL 与环境变量中的 GitHub 令牌一起作为 API 密钥使用。 +**时间甲虫**:没错,你可以将输入文本更改为任何你想要的内容。还要注意 GitHub 模型如何作为 API 的基础 URL 与环境变量中的 GitHub 令牌一起作为 API 密钥使用。 -**你:**为什么这很重要? +**你**:为什么这很重要? -**时间甲虫:**使用特定于你所使用的模型的基础 URL 和 API 密钥很重要。GitHub Models 是一个托管各种模型的平台,所有这些模型都具有不同的功能和特性,而且使用是免费的。 +**时间甲虫**:使用特定于你所使用的模型的基础 URL 和 API 密钥很重要。GitHub Models 是一个托管各种模型的平台,所有这些模型都具有不同的功能和特性,而且使用是免费的。 -**你:**哦,太好了,反正我不知道该付钱给谁,而且我怀疑他们是否接受我的货币。:) +**你**:哦,太好了,反正我不知道该付钱给谁,而且我怀疑他们是否接受我的货币。:) ## 聊天应用程序 -**时间甲虫:**生成式 AI 模型还可以用来基于对话生成文本。你可以通过提供消息列表作为上下文来模拟与 AI 的对话,就像对话已经发生过一样。 +**时间甲虫**:生成式 AI 模型还可以用来基于对话生成文本。你可以通过提供消息列表作为上下文来模拟与 AI 的对话,就像对话已经发生过一样。 -**你:**这听起来很有趣,但为什么这很有用? +**你**:这听起来很有趣,但为什么这很有用? -**时间甲虫:**这很有用,因为它允许 AI 基于比单个提示更多的上下文提供更好的响应。让我们看一下下面的对话来说明这一点: +**时间甲虫**:这很有用,因为它允许 AI 基于比单个提示更多的上下文提供更好的响应。让我们看一下下面的对话来说明这一点: ```text @@ -267,11 +267,11 @@ AI: Rome is known for its ancient ruins, art, and vibrant culture. You can visit ``` -**时间甲虫:**想象一下,如果像"告诉我更多关于它的信息"这样的句子被脱离上下文理解,AI 就不会知道"它"指的是什么。这就是上下文的重要性所在,而这个上下文是我们可以通过提示提供给 AI 模型的。 +**时间甲虫**:想象一下,如果像"告诉我更多关于它的信息"这样的句子被脱离上下文理解,AI 就不会知道"它"指的是什么。这就是上下文的重要性所在,而这个上下文是我们可以通过提示提供给 AI 模型的。 -**你:**我想我明白了,我如何使用这种 JavaScript 语言构建与 AI 的对话? +**你**:我想我明白了,我如何使用这种 JavaScript 语言构建与 AI 的对话? -**时间甲虫:**以下是我们如何构建与 AI 的对话: +**时间甲虫**:以下是我们如何构建与 AI 的对话: ```javascript @@ -324,19 +324,19 @@ console.log(completion.choices[0]?.message?.content); 现在 AI 将提供一个聊天消息列表作为上下文,并且 AI 将基于该上下文生成响应。这是一种更具交互性的使用生成式 AI 模型的方式,可以用于聊天机器人、客户服务应用程序等。 -**你:**好的,如果我正确理解这个对话,AI 现在将具有以下上下文:_我下个月要去罗马_,所以基于这一点,它应该过滤掉无关信息并提供更相关的响应? +**你**:好的,如果我正确理解这个对话,AI 现在将具有以下上下文:_我下个月要去罗马_,所以基于这一点,它应该过滤掉无关信息并提供更相关的响应? -**时间甲虫:**完全正确,AI 将使用上下文来生成与对话更相关的响应。 +**时间甲虫**:完全正确,AI 将使用上下文来生成与对话更相关的响应。 ## 通过系统消息改进聊天对话 -**你:**我明白了,但有没有办法进一步改进这个? +**你**:我明白了,但有没有办法进一步改进这个? -**时间甲虫:**是的,你可以向对话添加系统消息。系统消息为 AI 创建一个"个性",可以用来提供附加上下文。 +**时间甲虫**:是的,你可以向对话添加系统消息。系统消息为 AI 创建一个"个性",可以用来提供附加上下文。 -**你:**好的,所以在我们一直在进行的对话的上下文中,系统消息会是什么样子? +**你**:好的,所以在我们一直在进行的对话的上下文中,系统消息会是什么样子? -**时间甲虫:**这个对话的系统消息可能是_"我是一个 AI 旅行助手,在这里帮助你规划你的意大利之行。"_这条消息为对话设定了基调,并帮助 AI 理解它在互动中的角色。 +**时间甲虫**:这个对话的系统消息可能是_"我是一个 AI 旅行助手,在这里帮助你规划你的意大利之行。"_这条消息为对话设定了基调,并帮助 AI 理解它在互动中的角色。 要创建这样的消息,请确保它的类型为"developer",如下所示: @@ -349,19 +349,19 @@ const message = { > 注意:这以前被称为"system"。这是最近的变化,"developer"是它的新术语。对于某些模型,这仍然被称为"system",所以如果你遇到任何问题,请使用"system"。 -**你:**好的,很好,我会确保在我的聊天对话中包含一个系统消息。出于好奇,你的系统消息是什么样子的? +**你**:好的,很好,我会确保在我的聊天对话中包含一个系统消息。出于好奇,你的系统消息是什么样子的? -**时间甲虫:**我的系统消息可能是_"我是时间甲虫,在这里帮助你穿越时间和空间。我应该有助于为你提供关于你所处时代的信息和指导,以及你需要返回自己时代的工具。"_ +**时间甲虫**:我的系统消息可能是_"我是时间甲虫,在这里帮助你穿越时间和空间。我应该有助于为你提供关于你所处时代的信息和指导,以及你需要返回自己时代的工具。"_ ### 通过温度设置创建多样化的响应 -**你:**关于聊天对话还有什么我应该知道的吗? +**你**:关于聊天对话还有什么我应该知道的吗? -**时间甲虫:**是的,你可以调整 AI 响应的"温度"。温度是一个通常设置在 0 到 1 之间的变量,它决定了 AI 响应的创造性程度。温度为 0 会导致更可预测的响应,而温度为 1 会导致更具创造性和多样性的响应。你可以根据对话的上下文和你希望从 AI 得到的响应类型来调整温度。注意,可以设置高于 1 的值,但这会导致响应更加随机,连贯性更低。 +**时间甲虫**:是的,你可以调整 AI 响应的"温度"。温度是一个通常设置在 0 到 1 之间的变量,它决定了 AI 响应的创造性程度。温度为 0 会导致更可预测的响应,而温度为 1 会导致更具创造性和多样性的响应。你可以根据对话的上下文和你希望从 AI 得到的响应类型来调整温度。注意,可以设置高于 1 的值,但这会导致响应更加随机,连贯性更低。 -**你:**所以如果我将温度设置为 0,AI 将提供更可预测的响应,如果我将其设置为 1,AI 将提供更具创造性的响应?你的温度是多少? +**你**:所以如果我将温度设置为 0,AI 将提供更可预测的响应,如果我将其设置为 1,AI 将提供更具创造性的响应?你的温度是多少? -**时间甲虫:**我的温度是 0.7,是的,你是对的,AI 在温度较高时会提供更具创造性的响应。让我们看看如何在你的应用程序中设置温度: +**时间甲虫**:我的温度是 0.7,是的,你是对的,AI 在温度较高时会提供更具创造性的响应。让我们看看如何在你的应用程序中设置温度: ```javascript @@ -388,20 +388,20 @@ const completion = await openai.chat.completions.create({ ## 上下文窗口 -**你:**还有更多对吧? +**你**:还有更多对吧? -**时间甲虫:**是的,生成式 AI 模型中的另一个重要概念是上下文窗口。上下文窗口是 AI 用来生成响应的先前消息数量。更大的上下文窗口允许 AI 考虑更多的上下文并生成更连贯的响应。 +**时间甲虫**:是的,生成式 AI 模型中的另一个重要概念是上下文窗口。上下文窗口是 AI 用来生成响应的先前消息数量。更大的上下文窗口允许 AI 考虑更多的上下文并生成更连贯的响应。 -**时间甲虫:**不同的模型对输出标记有不同的限制。以下面的模型为例:`gpt-4o-2024-08-06`,它具有以下规格: +**时间甲虫**:不同的模型对输出标记有不同的限制。以下面的模型为例:`gpt-4o-2024-08-06`,它具有以下规格: - 最大输出标记:大约 16k 标记。 - 最大上下文窗口大小:128k。 这意味着大部分标记可以用于输入标记,即 128k - 16k = 112k 标记。 -**你:**明白了,上下文窗口,标记,一个标记有多少? +**你**:明白了,上下文窗口,标记,一个标记有多少? -**时间甲虫:**一个标记是一个单词或单词的一部分,根据语言略有不同。有一个工具可以用来测量,由 OpenAI 推荐,叫做 [tokenizer](https://platform.openai.com/tokenizer)。让我们尝试一个句子,看看它有多少个标记: +**时间甲虫**:一个标记是一个单词或单词的一部分,根据语言略有不同。有一个工具可以用来测量,由 OpenAI 推荐,叫做 [tokenizer](https://platform.openai.com/tokenizer)。让我们尝试一个句子,看看它有多少个标记: ```text I want you to generate recipes for me. @@ -411,9 +411,9 @@ I want you to generate recipes for me. 对上面的句子运行 `tokenizer` 得到 9 个标记。 -**你:**这不多,听起来我可以在上下文窗口中有很多标记? +**你**:这不多,听起来我可以在上下文窗口中有很多标记? -**时间甲虫:**是的,你可以尝试不同的上下文窗口大小,看看它如何影响 AI 的响应。事实上,如果你设置上下文窗口大小为 100,你将限制 AI 及其考虑输入和输出的能力。以下是如何在你的应用程序中设置上下文窗口: +**时间甲虫**:是的,你可以尝试不同的上下文窗口大小,看看它如何影响 AI 的响应。事实上,如果你设置上下文窗口大小为 100,你将限制 AI 及其考虑输入和输出的能力。以下是如何在你的应用程序中设置上下文窗口: ```javascript @@ -444,19 +444,19 @@ const completion = await openai.chat.completions.create({ 莱昂纳多突然要求更仔细地检查时间甲虫,他从各个角度查看它,甚至摇晃了它。 -**莱昂纳多:**我需要一个助手来帮助我计算和设计空气螺旋。你能为我构建一个能做到这一点的助手吗? +**莱昂纳多**:我需要一个助手来帮助我计算和设计空气螺旋。你能为我构建一个能做到这一点的助手吗? -**你:**当然,我可以为你构建这个。时间甲虫,我们可以帮忙,对吧? +**你**:当然,我可以为你构建这个。时间甲虫,我们可以帮忙,对吧? -**时间甲虫:**是的,没问题,实际上,空气螺旋是莱昂纳多最令人着迷和有远见的发明之一。设计于 15 世纪 80 年代末... +**时间甲虫**:是的,没问题,实际上,空气螺旋是莱昂纳多最令人着迷和有远见的发明之一。设计于 15 世纪 80 年代末... -**你:**我只需要一个肯定的答案,让我们稍后再讲解。 +**你**:我只需要一个肯定的答案,让我们稍后再讲解。 -**时间甲虫:**真没礼貌.. +**时间甲虫**:真没礼貌.. -**你:**什么? +**你**:什么? -**时间甲虫:**没什么 +**时间甲虫**:没什么
空气螺旋,莱昂纳多·达·芬奇 @@ -488,7 +488,7 @@ const completion = await openai.chat.completions.create({ ## 知识检验 -**问题:** 上下文窗口在生成式 AI 模型中的目的是什么?选择所有适用项。 +**问题**: 上下文窗口在生成式 AI 模型中的目的是什么?选择所有适用项。 A. 上下文窗口允许 AI 考虑更多上下文并生成更连贯的响应。 diff --git a/lessons/03-prompt-engineering/translations/README.zh-cn.md b/lessons/03-prompt-engineering/translations/README.zh-cn.md index 84419ae5..b4688186 100644 --- a/lessons/03-prompt-engineering/translations/README.zh-cn.md +++ b/lessons/03-prompt-engineering/translations/README.zh-cn.md @@ -30,7 +30,7 @@ _这个视频介绍了如何提高你的"提示"技巧,教你如何向 AI 提 > [!NOTE] > 虽然我们建议你跟随故事(这很有趣!),但如果你更喜欢直接跳到技术内容,[点击这里](#与斯福尔扎互动)。 -**你:**让我看看能否设法回到家。 +**你**:让我看看能否设法回到家。 在你按下按钮之前,工作坊的门突然猛烈撞开,发出雷鸣般的巨响。一个人站在门口,宽肩膀,穿着昂贵的衣服,他在空中挥舞着一张纸,大喊: @@ -42,21 +42,21 @@ _这个视频介绍了如何提高你的"提示"技巧,教你如何向 AI 提 **斯福尔扎**:Da Vinci, dov'è il mio dipinto? 我的画在哪里? -**莱昂纳多:**是斯福尔扎。他想让我完成一幅画,"最后的晚餐"。 +**莱昂纳多**:是斯福尔扎。他想让我完成一幅画,"最后的晚餐"。 -**你:**你就不能直接告诉他吗? +**你**:你就不能直接告诉他吗? -**莱昂纳多:**我试过了,但他不是一个有耐心的人。 +**莱昂纳多**:我试过了,但他不是一个有耐心的人。 你追着莱昂纳多冲出后门,进入一条黑暗的小巷,你发现一辆马车在等待。 莱昂纳多抓住缰绳,你们俩跳进马车。随着一声响亮的鞭打声,马开始奔跑,穿过佛罗伦萨狭窄的街道。 -**莱昂纳多:**试着按下那个小装置,他们越来越近了! +**莱昂纳多**:试着按下那个小装置,他们越来越近了! -**你:**"好的,时间甲虫,仔细听着。我需要回到现在,回家,好吗?"突然,马车碰到了一个颠簸,时间甲虫从你手中飞出,落在地板上。它开始发出哔哔声,并用机器人的声音宣布:"前往罗马。" +**你**:"好的,时间甲虫,仔细听着。我需要回到现在,回家,好吗?"突然,马车碰到了一个颠簸,时间甲虫从你手中飞出,落在地板上。它开始发出哔哔声,并用机器人的声音宣布:"前往罗马。" -**你:**不,不是罗马,是家...家... +**你**:不,不是罗马,是家...家... 一团色彩的旋涡笼罩着马车,周围的世界溶解成了一个万花筒般的光芒。 @@ -68,9 +68,9 @@ _这个视频介绍了如何提高你的"提示"技巧,教你如何向 AI 提 从罗马逃脱
-**你:**莱昂纳多,我们在哪里? +**你**:莱昂纳多,我们在哪里? -**莱昂纳多:**看起来我们正在一场比赛中!我们需要离开这里! +**莱昂纳多**:看起来我们正在一场比赛中!我们需要离开这里! 当马车在混乱中疾驰时,你紧握着车身两侧。骑马的罗马士兵正在逼近,他们的盔甲在阳光下闪闪发光。 @@ -78,29 +78,29 @@ _这个视频介绍了如何提高你的"提示"技巧,教你如何向 AI 提 莱昂纳多将马车转向出口,车轮在鹅卵石上打滑。士兵们紧追不舍,他们的喊叫声在你耳边回荡。 -**莱昂纳多:**我们需要甩掉他们!找个地方藏起来! +**莱昂纳多**:我们需要甩掉他们!找个地方藏起来! 你扫视着狭窄的街道,心跳加速。 -**你:**那里!一条后巷! +**你**:那里!一条后巷! 莱昂纳多将马车拐进小巷,马车在转弯时剧烈摇晃。你跳下马车,帮助莱昂纳多从车后拖出一个巨大的装置。那是他的发明——空中螺旋桨(aerial screw)。 -**莱昂纳多:**快,我们需要把它带到屋顶上! +**莱昂纳多**:快,我们需要把它带到屋顶上! 你们俩在设备的重量下吃力地搬运。追兵的声音越来越大,他们的脚步声在墙壁上回荡。你们气喘吁吁、满头大汗地到达了屋顶。 -**莱昂纳多:**帮我设置它! +**莱昂纳多**:帮我设置它! 你们一起工作,手法娴熟精确。你们俩都爬上了装置,心脏在胸腔里剧烈跳动。 -**莱昂纳多:**抓紧了! +**莱昂纳多**:抓紧了! 随着最后一推,空中螺旋桨开始旋转。螺旋桨叶片抓住了空气,你感到一阵突然的升力。当装置起飞,在罗马屋顶上方飞翔时,地面在你们脚下远去。 -**你:**我们做到了,莱昂纳多!我们在飞! +**你**:我们做到了,莱昂纳多!我们在飞! -**莱昂纳多:**是的,但我们需要找一个安全的地方降落。 +**莱昂纳多**:是的,但我们需要找一个安全的地方降落。 你俯瞰这座城市;古老的建筑在你们下方延伸开来。 @@ -135,33 +135,33 @@ _这个视频介绍了如何提高你的"提示"技巧,教你如何向 AI 提 ## 什么是提示工程? -**时间甲虫:**我们需要谈谈提示工程。 +**时间甲虫**:我们需要谈谈提示工程。 -**你:**是吗?那是什么? +**你**:是吗?那是什么? -**时间甲虫:**提示工程尽管其名称如此,但它不是关于建造桥梁或道路,而是关于精心制作正确的"提示",以便从生成式 AI 语言模型中获得所需的输出。 +**时间甲虫**:提示工程尽管其名称如此,但它不是关于建造桥梁或道路,而是关于精心制作正确的"提示",以便从生成式 AI 语言模型中获得所需的输出。 -**你:**好的,但为什么我需要知道这个? +**你**:好的,但为什么我需要知道这个? -**时间甲虫:**嗯,你想让空中螺旋桨安全降落,对吧? +**时间甲虫**:嗯,你想让空中螺旋桨安全降落,对吧? -**你:**是的,最好是完好无损地降落。:-) +**你**:是的,最好是完好无损地降落。:-) -**时间甲虫:**我想也是,现在请听好!提示工程是关于精心制作正确的提示,以便从语言模型中获得所需的输出。 +**时间甲虫**:我想也是,现在请听好!提示工程是关于精心制作正确的提示,以便从语言模型中获得所需的输出。 **时间甲虫**:大型语言模型具有所谓的_涌现特性_,这意味着这些特性并非明确编程到模型中,而是源自它在大量文本数据上的训练方式。通过研究这些涌现特性,你可以得出结论并发现模式,这些可以帮助你从模型中获得更好的结果。 -**你:**好的,所以有一些我们发现的模式可以帮助我们从模型中获得更好的结果。但这如何帮助我降落空中螺旋桨呢? +**你**:好的,所以有一些我们发现的模式可以帮助我们从模型中获得更好的结果。但这如何帮助我降落空中螺旋桨呢? -**时间甲虫:**是的,没错,哇,你真的不太有耐心,是吧? +**时间甲虫**:是的,没错,哇,你真的不太有耐心,是吧? -**你:**嗯,如果你正在一个没有明确降落说明的装置上飞行,你也不会有耐心。 +**你**:嗯,如果你正在一个没有明确降落说明的装置上飞行,你也不会有耐心。 -**时间甲虫:**我就在这里陪着你,你知道的,但让我们回到重点上。 +**时间甲虫**:我就在这里陪着你,你知道的,但让我们回到重点上。 ## 提示工程如何帮助应用程序开发者 -**时间甲虫:**作为从业者,能够精心制作更好的提示是你工具箱中应该拥有的一项技能。 +**时间甲虫**:作为从业者,能够精心制作更好的提示是你工具箱中应该拥有的一项技能。 从开发者的角度来看,你可以使用提示工程来: @@ -171,11 +171,11 @@ _这个视频介绍了如何提高你的"提示"技巧,教你如何向 AI 提 - **格式化输出**,使其易于理解和使用。我们将在下一章深入探讨这一方面。 -**时间甲虫:**让我们来探索你可以用来为语言模型制作有效提示的不同技术和策略。 +**时间甲虫**:让我们来探索你可以用来为语言模型制作有效提示的不同技术和策略。 ## 提示工程技术和策略 -**时间甲虫:**以下是你可以用来制作有效提示的一些技术和策略: +**时间甲虫**:以下是你可以用来制作有效提示的一些技术和策略: - **少样本提示(Few-shot prompting)**。这种技术涉及给 AI 几个例子,展示你想要的回应类型。 @@ -185,9 +185,9 @@ _这个视频介绍了如何提高你的"提示"技巧,教你如何向 AI 提 - **助产式提示(Maieutic prompting)**。这种技术涉及使用引导性问题,引导 AI 朝特定答案方向发展。 -**你:**这听起来很有趣,我猜你会给我一些例子? +**你**:这听起来很有趣,我猜你会给我一些例子? -**时间甲虫:**是的,马上来。让我们看看每种技术的例子,以便我们了解它们在实践中如何工作。 +**时间甲虫**:是的,马上来。让我们看看每种技术的例子,以便我们了解它们在实践中如何工作。 ### 少样本提示:提供例子引导 AI 输出 @@ -197,13 +197,13 @@ _这个视频介绍了如何提高你的"提示"技巧,教你如何向 AI 提 > > "古罗马的生活是怎样的?" → "它繁忙且艰难。" -**你:**我明白了!这有助于 AI 正确理解,即使在这么高的地方!;) +**你**:我明白了!这有助于 AI 正确理解,即使在这么高的地方!;) -**时间甲虫:**没错,这是一种可靠的方法。接下来! +**时间甲虫**:没错,这是一种可靠的方法。接下来! ### 思维链提示:展示一步步推理 -**时间甲虫:**这种技术通过展示一步步的推理过程来引导 AI 解决问题。想象要降落空中螺旋桨。你可以这样分解问题: +**时间甲虫**:这种技术通过展示一步步的推理过程来引导 AI 解决问题。想象要降落空中螺旋桨。你可以这样分解问题: - 你在100米高空。 - 重力以 9.8 m/s² 拉力。 - 公式:高度 = ½ * g * t²。 @@ -216,85 +216,85 @@ _这个视频介绍了如何提高你的"提示"技巧,教你如何向 AI 提 **答案:4.5秒** -**你:**那很快——希望数字计算准确! +**你**:那很快——希望数字计算准确! -**时间甲虫:**它教会 AI 一步步思考。 +**时间甲虫**:它教会 AI 一步步思考。 -**你:**所以是关于分解问题以获得精确答案? +**你**:所以是关于分解问题以获得精确答案? -**时间甲虫:**是的,非常适合复杂任务,比如数学辅导应用! +**时间甲虫**:是的,非常适合复杂任务,比如数学辅导应用! ### 助产式提示:提问输出以验证准确性 -**时间甲虫:**这种技术使用问题来检查 AI 输出的准确性。你对每一步提出问题,以确保推理的一致性。 +**时间甲虫**:这种技术使用问题来检查 AI 输出的准确性。你对每一步提出问题,以确保推理的一致性。 -**你:**所以,质疑它说的每一句话?听起来很有趣。;) +**你**:所以,质疑它说的每一句话?听起来很有趣。;) -**时间甲虫:**我们来测试空中螺旋桨降落: +**时间甲虫**:我们来测试空中螺旋桨降落: - 高度100米 - 重力:9.8 m/s² - 需要多少秒才能着陆?(答案:4.5秒) 问:"为什么是4.5秒?" -> **回答:** +> **回答**: > - 高度 = 100米,初始垂直速度 = 0 m/s,重力 = 9.8 m/s²。 > - 使用公式:高度 = ½ * g * t²。 > - 解算:100 = ½ * 9.8 * t² → t ≈ 4.5秒。 -**时间甲虫:**这是关于通过后续问题验证 AI 的答案。 +**时间甲虫**:这是关于通过后续问题验证 AI 的答案。 -**你:**所以,不要信任它——而是用问题来探究它? +**你**:所以,不要信任它——而是用问题来探究它? -**时间甲虫:**没错!确保推理是可靠的。 +**时间甲虫**:没错!确保推理是可靠的。 ## 元提示:添加额外指令以提高精确度 -**时间甲虫:**接下来是元提示。 +**时间甲虫**:接下来是元提示。 -**你:**呃,先喝茶? +**你**:呃,先喝茶? -**时间甲虫:**_叹气_。它们为提示添加指导以获得更好的输出——非常适合敏感、面向客户的应用。 +**时间甲虫**:_叹气_。它们为提示添加指导以获得更好的输出——非常适合敏感、面向客户的应用。 这是一个例子: -> **元提示:** 仅使用 Contoso 公司产品(篮球、足球、网球拍)。保持准确性和用户友好性。 -> **提示:** 适合初学者的最佳体育产品是什么? -> **回答:** 篮球、足球和网球拍——非常适合协调性和敏捷性训练。 +> **元提示**: 仅使用 Contoso 公司产品(篮球、足球、网球拍)。保持准确性和用户友好性。 +> **提示**: 适合初学者的最佳体育产品是什么? +> **回答**: 篮球、足球和网球拍——非常适合协调性和敏捷性训练。 它确保准确性并坚持使用 Contoso 的产品。如果没有元提示: -> **提示:** 适合初学者的最佳体育产品是什么? -> **回答:** 篮球、足球、网球拍,还有橄榄球——_不全是 Contoso 产品_。 +> **提示**: 适合初学者的最佳体育产品是什么? +> **回答**: 篮球、足球、网球拍,还有橄榄球——_不全是 Contoso 产品_。 -**你:**很方便!保持回答在轨道上,就像我自动机的法则一样。 +**你**:很方便!保持回答在轨道上,就像我自动机的法则一样。 -**时间甲虫:**你会知道的,_"弗兰肯斯坦"_——呃,没什么! +**时间甲虫**:你会知道的,_"弗兰肯斯坦"_——呃,没什么! -**你:**什么? +**你**:什么? -**时间甲虫:**没什么。 +**时间甲虫**:没什么。 > 玛丽·雪莱的《弗兰肯斯坦》——1818年,比你的时间旅行早42年。[了解更多](https://en.wikipedia.org/wiki/Mary_Shelley) -**你:**所以,没有元提示就意味着混乱? +**你**:所以,没有元提示就意味着混乱? -**时间甲虫:**是的,你会得到偏离品牌的答案。 +**时间甲虫**:是的,你会得到偏离品牌的答案。 -**你:**明白了,精准很重要! +**你**:明白了,精准很重要! ## 作业 - 帮助我们的英雄降落空中螺旋桨 -**你:**这是你向我展示如何降落空中螺旋桨的部分,对吧? +**你**:这是你向我展示如何降落空中螺旋桨的部分,对吧? -**时间甲虫:**是的,让我们开始吧。山丘大约距离我们当前位置100米远。以下是我们如何设置提示: +**时间甲虫**:是的,让我们开始吧。山丘大约距离我们当前位置100米远。以下是我们如何设置提示: - 当前距地面高度:100米 - 向前移动速度:每秒10米 - 重力:每秒平方9.8米 - 向上风力:每秒0.7米 -**莱昂纳多:**你的 AI 装置能否帮助计算,看看我们是否能够成功降落,或者我们是否需要再次进行时间跳跃? +**莱昂纳多**:你的 AI 装置能否帮助计算,看看我们是否能够成功降落,或者我们是否需要再次进行时间跳跃? -**时间甲虫:**我可以的,不过我的名字是乔治(George),我更喜欢这个名字而不是"装置"。实际上,我打算让你们两个自己弄清楚如何设置提示。☺️ +**时间甲虫**:我可以的,不过我的名字是乔治(George),我更喜欢这个名字而不是"装置"。实际上,我打算让你们两个自己弄清楚如何设置提示。☺️ 构建一个应用程序,询问: @@ -324,7 +324,7 @@ _这个视频介绍了如何提高你的"提示"技巧,教你如何向 AI 提 ## 知识检验 -**问题:** 什么是提示工程?选择所有适用项。 +**问题**: 什么是提示工程?选择所有适用项。 A. 提示工程是关于建造桥梁和道路。 diff --git a/lessons/04-structured-output/translations/README.zh-cn.md b/lessons/04-structured-output/translations/README.zh-cn.md index b594849d..958c3f05 100644 --- a/lessons/04-structured-output/translations/README.zh-cn.md +++ b/lessons/04-structured-output/translations/README.zh-cn.md @@ -34,11 +34,11 @@ _这个视频介绍了如何提高您的"提示"技能,教您如何向AI提供 风在您和达芬奇乘坐的空中螺旋机周围呼啸,木制框架在压力下嘎吱作响。 -**您:**"达芬奇,我们需要找到一条出路!"您在风的咆哮声中喊道。 +**您**:"达芬奇,我们需要找到一条出路!"您在风的咆哮声中喊道。 -**达芬奇:**"我对我的发明有信心,但我们需要的不仅仅是信心来逃脱这些士兵。" +**达芬奇**:"我对我的发明有信心,但我们需要的不仅仅是信心来逃脱这些士兵。" -**您:**"这可能是我们唯一的机会,"您按下甲虫的复杂机制。一道明亮的光芒笼罩着你们两个,周围的世界开始扭曲变形。 +**您**:"这可能是我们唯一的机会,"您按下甲虫的复杂机制。一道明亮的光芒笼罩着你们两个,周围的世界开始扭曲变形。 ### 阿兹特克帝国 @@ -54,7 +54,7 @@ _阿兹特克日历,维基百科_ 达芬奇向前走了一步,眼中充满惊奇。 -**达芬奇:**"难以置信,"他喃喃自语,手指抚过雕刻。"但我希望这不是什么重要的东西。" +**达芬奇**:"难以置信,"他喃喃自语,手指抚过雕刻。"但我希望这不是什么重要的东西。" 在您做出反应之前,一群阿兹特克士兵走了过来。 @@ -62,25 +62,25 @@ _阿兹特克日历,维基百科_ 与阿兹特克人会面
-**士兵领袖:**"你们是谁,做了什么?"他用纳瓦特尔语质问道。 +**士兵领袖**:"你们是谁,做了什么?"他用纳瓦特尔语质问道。 您深吸一口气,试图稳定自己的神经。 -**您:**"我们是来自遥远土地的旅行者,"您开始说道,希望您对古代语言的了解能派上用场。"这是一台飞行机器,是神明赐予我们的礼物,帮助我们到达你们这里。 +**您**:"我们是来自遥远土地的旅行者,"您开始说道,希望您对古代语言的了解能派上用场。"这是一台飞行机器,是神明赐予我们的礼物,帮助我们到达你们这里。 战士的眼睛因惊讶而睁大,但他仍然保持警惕。 -**士兵领袖:**"你们将跟我们一起去见统治者蒙特祖马。他将决定你们的命运。 +**士兵领袖**:"你们将跟我们一起去见统治者蒙特祖马。他将决定你们的命运。 到达金字塔顶部后,您被带入一个宏伟的大厅,阿兹特克帝国的统治者蒙特祖马坐在一个装饰着金子和羽毛的王座上。 -**蒙特祖马:**"你们声称是来自遥远土地的旅行者,"蒙特祖马说道,他的声音平静但充满权威。"而且你们损坏了我们的神圣日历。你们打算如何弥补?" +**蒙特祖马**:"你们声称是来自遥远土地的旅行者,"蒙特祖马说道,他的声音平静但充满权威。"而且你们损坏了我们的神圣日历。你们打算如何弥补?" ## 让我们玩个游戏 -**达芬奇:**"我们是和平而来,"他说,声音稳定。"我们寻求知识和理解。请允许我们展示我们机器的力量,并与您分享我们的知识。" +**达芬奇**:"我们是和平而来,"他说,声音稳定。"我们寻求知识和理解。请允许我们展示我们机器的力量,并与您分享我们的知识。" -**蒙特祖马:**"很好。我提议玩一场[帕托利](#patolli)游戏。如果我赢得三局中的大多数,你们将把你们的设备给我并告诉我它是如何工作的。如果你们赢了,你们可以自由离开。" +**蒙特祖马**:"很好。我提议玩一场[帕托利](#patolli)游戏。如果我赢得三局中的大多数,你们将把你们的设备给我并告诉我它是如何工作的。如果你们赢了,你们可以自由离开。"
玩帕托利游戏 @@ -92,15 +92,15 @@ _阿兹特克日历,维基百科_ 第二局是一场激烈的比赛,但达芬奇设法取得了胜利,使比分持平。 -**达芬奇:**"还有一局,"他低声说道,"乔治(时间甲虫),我们需要赢得这一局,给我正确的走法。" +**达芬奇**:"还有一局,"他低声说道,"乔治(时间甲虫),我们需要赢得这一局,给我正确的走法。" -**时间甲虫:**好的,计算中...给你... +**时间甲虫**:好的,计算中...给你... 随着最后一步决定性的走法,达芬奇赢得了比赛。房间里爆发出欢呼和掌声,阿兹特克人显然对他的技巧和镇定印象深刻。蒙特祖马虽然失望,但点头表示尊重。 -**蒙特祖马:**"你们公平地赢了,"蒙特祖马说,他的声音带着一丝钦佩。"你们可以自由离开,并且可以保留你们的设备。但请知道,如果你们希望回来,随时欢迎。" +**蒙特祖马**:"你们公平地赢了,"蒙特祖马说,他的声音带着一丝钦佩。"你们可以自由离开,并且可以保留你们的设备。但请知道,如果你们希望回来,随时欢迎。" -**时间甲虫:**如果你不说,我也不会说,达芬奇 ;) +**时间甲虫**:如果你不说,我也不会说,达芬奇 ;) ### 帕托利 @@ -147,31 +147,31 @@ _帕托利 - 维基百科_ ## 结构化输出 -**时间甲虫:**想知道我是如何打败蒙特祖马的吗? +**时间甲虫**:想知道我是如何打败蒙特祖马的吗? -**您:**嘘,小声点,我们还在阿兹特克帝国。 +**您**:嘘,小声点,我们还在阿兹特克帝国。 -**时间甲虫:**哦,对不起,是的,所以结构化输出就是我的方法。你要求正确的走法,我以结构化的方式给你提供了它们。 +**时间甲虫**:哦,对不起,是的,所以结构化输出就是我的方法。你要求正确的走法,我以结构化的方式给你提供了它们。 结构化输出使用特定的数据格式来清晰地组织信息。常见的格式如JSON、XML和CSV使服务更容易处理和使用数据。 生成式AI模型可以输出各种格式的数据。然而,非结构化文本的输出可能使提取信息并将其传递给其他服务变得困难。结构化输出可以在这方面提供帮助。 -**您:**嗯,你真聪明 ;) +**您**:嗯,你真聪明 ;) -**时间甲虫:**我尽力而为。:-) +**时间甲虫**:我尽力而为。:-) 另一个好处是,即使对于人类读者来说,当结构化数据遵循熟悉的格式时,也更容易阅读和理解。 让我们看一些输入示例,看看如何通过要求特定的输出格式来帮助提取信息,使其更容易理解和使用。 -**您:**好吧,反正我们也没有其他计划,让我们听听。 +**您**:好吧,反正我们也没有其他计划,让我们听听。 ## 塑造输出 -**时间甲虫:**让我们从一个简单的例子开始。想象一下,您是达芬奇,正在尝试使用15世纪的技术构思发明创意。您想知道需要什么资源以及建造每个发明需要多少努力。以下是您可以如何询问这些信息: +**时间甲虫**:让我们从一个简单的例子开始。想象一下,您是达芬奇,正在尝试使用15世纪的技术构思发明创意。您想知道需要什么资源以及建造每个发明需要多少努力。以下是您可以如何询问这些信息: -**达芬奇:**哦,我喜欢这个游戏,每个人都假装你是我! +**达芬奇**:哦,我喜欢这个游戏,每个人都假装你是我! > 提示:生成我可以使用15世纪技术建造的发明创意。对于每个发明,指定所需的资源并估计建造它所需的努力。 @@ -210,17 +210,17 @@ _帕托利 - 维基百科_ 这是一个看起来不错的响应,每个创意都以相同的方式构建,很容易理解。但如果你想要其他方式呢?为此,你可以在文本中指示你想要的方式,甚至可以提供输出模板。让我们展示每种技巧。 ``` -**达芬奇:**是的,完全要偷那个水力磨坊的想法,我现在就能看到,一个在河边的磨坊,把谷物磨成面粉,太完美了!我喜欢这个小玩意。小玩意,我还在想什么?这将使我不那么依赖斯福尔扎这样的人。 +**达芬奇**:是的,完全要偷那个水力磨坊的想法,我现在就能看到,一个在河边的磨坊,把谷物磨成面粉,太完美了!我喜欢这个小玩意。小玩意,我还在想什么?这将使我不那么依赖斯福尔扎这样的人。 -**时间甲虫:**当然,如果你能完成一个项目的话,达芬奇。:-) +**时间甲虫**:当然,如果你能完成一个项目的话,达芬奇。:-) -**达芬奇:**嘿,我正在努力! +**达芬奇**:嘿,我正在努力! -**时间甲虫:**让我们看看如何指导模型以更结构化的方式呈现输出。 +**时间甲虫**:让我们看看如何指导模型以更结构化的方式呈现输出。 ### 构建更好输出的提示 -**时间甲虫:**你可以通过告诉模型你想要如何构建输出来改进你的提示。例如,你可以要求一个带有你需要的列的表格格式。以下是如何修改提示: +**时间甲虫**:你可以通过告诉模型你想要如何构建输出来改进你的提示。例如,你可以要求一个带有你需要的列的表格格式。以下是如何修改提示: > 提示:生成可以使用15世纪技术建造的发明创意。对于每个发明,提供所需的资源并估计建造它所需的努力。以下列列的表格形式呈现信息:标题、描述、所需资源和努力。 @@ -236,9 +236,9 @@ _帕托利 - 维基百科_ 这次你得到了一个更容易阅读和理解的表格。 ``` -**达芬奇:**我喜欢这个,肯定会为我节省很多时间。 +**达芬奇**:我喜欢这个,肯定会为我节省很多时间。 -**您:**我也是。 +**您**:我也是。 ### 提供输出模板 @@ -294,13 +294,13 @@ _帕托利 - 维基百科_ **努力**:非常高 - 需要精密的金属加工和对机械的深入理解。建造一个可靠的钟需要精确的组装和校准。 ``` -**达芬奇:**这很棒,但谁是Jason? +**达芬奇**:这很棒,但谁是Jason? -**时间甲虫:**JSON,达芬奇,JSON。它是一种易于被服务或应用程序使用的结构化格式。 +**时间甲虫**:JSON,达芬奇,JSON。它是一种易于被服务或应用程序使用的结构化格式。 -**达芬奇:**这就是我说的,Jason。 +**达芬奇**:这就是我说的,Jason。 -**时间甲虫:**_叹气_。 +**时间甲虫**:_叹气_。 如你所见,输出是按照输出模板中的规范构建的。这使其更容易阅读和理解,它还创建了可以被其他服务或应用程序轻松使用的可重复输出。 @@ -308,7 +308,7 @@ _帕托利 - 维基百科_ ### 使用JSON、XML或CSV等结构化输出格式 -**时间甲虫:**到目前为止,你已经看到了如何通过在提示中指导模型来控制输出结构。你甚至提供了一个输出模板。让我们更进一步,看看如何将这个想法应用到更结构化的输出格式,如JSON等。 +**时间甲虫**:到目前为止,你已经看到了如何通过在提示中指导模型来控制输出结构。你甚至提供了一个输出模板。让我们更进一步,看看如何将这个想法应用到更结构化的输出格式,如JSON等。 相应地修改提示以请求JSON输出: @@ -389,11 +389,11 @@ _帕托利 - 维基百科_ ] ``` -**时间甲虫:**这种类型的结构化输出可以发送给另一个可以使用JSON数据的服务或应用程序。 +**时间甲虫**:这种类型的结构化输出可以发送给另一个可以使用JSON数据的服务或应用程序。 ## 从提示中提取数据 -**时间甲虫:**想象一下你正在构建一个聊天机器人,帮助用户找到有关预订旅行的信息。你想从用户的输入中提取关键细节以提供相关响应。假设你有以下描述: +**时间甲虫**:想象一下你正在构建一个聊天机器人,帮助用户找到有关预订旅行的信息。你想从用户的输入中提取关键细节以提供相关响应。假设你有以下描述: > 输入你想去的地方、何时旅行以及你的预算。 @@ -414,11 +414,11 @@ _帕托利 - 维基百科_ } ``` -**达芬奇:**乔治(时间甲虫)他一直不停地说话,是吗? +**达芬奇**:乔治(时间甲虫)他一直不停地说话,是吗? -**您:**让我们看看能不能找到关闭开关。 +**您**:让我们看看能不能找到关闭开关。 -**时间甲虫:**让我们用类似的提示试试,让我们稍微改变一下用户输入,这样我们就能确保模型在做正确的事情。 +**时间甲虫**:让我们用类似的提示试试,让我们稍微改变一下用户输入,这样我们就能确保模型在做正确的事情。 > 提示:从用户的提示中提取以下信息:地点、时间、预算、货币。以JSON格式响应提取的数据。用户提示:去美国,最多1200美元,可能是一月。 > @@ -439,15 +439,15 @@ _帕托利 - 维基百科_ 从用户的提示中提取以下信息:地点、时间、预算、货币,以JSON格式响应提取的数据,用户提示:{user_input}。 ``` -**您:**找到了,给你,乔治! +**您**:找到了,给你,乔治! -**时间甲虫:**_正在关机_。 +**时间甲虫**:_正在关机_。 -**达芬奇:**终于安静了。 +**达芬奇**:终于安静了。 -**时间甲虫:**_启动紧急启动_。我刚才说到哪里了?哦,对了。 +**时间甲虫**:_启动紧急启动_。我刚才说到哪里了?哦,对了。 -**时间甲虫:**对于聊天机器人来说,这是一个非常强大的功能,因为它允许你从用户的输入中提取信息。如果用户询问各种事情怎么办?你可以创建一个模板,描述你的聊天机器人可以做什么以及需要什么参数。以下是你可以如何做到这一点: +**时间甲虫**:对于聊天机器人来说,这是一个非常强大的功能,因为它允许你从用户的输入中提取信息。如果用户询问各种事情怎么办?你可以创建一个模板,描述你的聊天机器人可以做什么以及需要什么参数。以下是你可以如何做到这一点: ```text 以下是你拥有的一些技能: @@ -502,25 +502,25 @@ _帕托利 - 维基百科_ 这种结合呈现技能和参数并从提示中提取数据的组合也被称为_工具调用_或_函数调用_。来自模型的这种响应使你作为开发者很容易理解用户想要什么以及如何调用相应的函数来满足用户的请求。 -**您:**非常有用的信息,乔治! +**您**:非常有用的信息,乔治! ## 作业 - 修复空中螺旋机 -**时间甲虫:**我需要你们两个的注意,我们有个问题。空中螺旋机在逃离罗马士兵和降落在阿兹特克帝国时受到了一些损坏。达芬奇的机器非常敏感,需要非常具体的输入来修复它。你需要向你的时间甲虫(AI助手)提供必要的信息来帮助你修复空中螺旋机。 +**时间甲虫**:我需要你们两个的注意,我们有个问题。空中螺旋机在逃离罗马士兵和降落在阿兹特克帝国时受到了一些损坏。达芬奇的机器非常敏感,需要非常具体的输入来修复它。你需要向你的时间甲虫(AI助手)提供必要的信息来帮助你修复空中螺旋机。 -**达芬奇:**所以我设法修复了空中螺旋机的损坏,但现在它需要一个启动序列:左、左、上、右。 +**达芬奇**:所以我设法修复了空中螺旋机的损坏,但现在它需要一个启动序列:左、左、上、右。 -**您:**听起来很简单,就是这些文字? +**您**:听起来很简单,就是这些文字? -**达芬奇:**是的,但它很特别,需要镜像,这是我写所有文字的方式。当然,我还使用凯撒密码,偏移量为3,因为我是意大利人。:-) +**达芬奇**:是的,但它很特别,需要镜像,这是我写所有文字的方式。当然,我还使用凯撒密码,偏移量为3,因为我是意大利人。:-) -**您:**是的,你能直接输入吗? +**您**:是的,你能直接输入吗? -**达芬奇:**我可以,但我很好奇想看看你和时间甲虫能不能做到。 +**达芬奇**:我可以,但我很好奇想看看你和时间甲虫能不能做到。 -**您:**好吧。 +**您**:好吧。 -**指示:**编写一个提示,要求空中螺旋机的启动序列,文本应该是镜像的,并用偏移量为3的凯撒密码编码。用编码后的文本响应。 +**指示**:编写一个提示,要求空中螺旋机的启动序列,文本应该是镜像的,并用偏移量为3的凯撒密码编码。用编码后的文本响应。 查看[示例应用](../sample-app)以获取开始的代码。它包含一个带有所有必需依赖项的Node.js项目。 diff --git a/lessons/05-rag/translations/README.zh-cn.md b/lessons/05-rag/translations/README.zh-cn.md index b63efa66..783a5bc2 100644 --- a/lessons/05-rag/translations/README.zh-cn.md +++ b/lessons/05-rag/translations/README.zh-cn.md @@ -107,9 +107,9 @@ _这个视频解释了检索增强生成(RAG),这是一种帮助AI在其 在深入了解RAG细节之前,您需要解决一些挑战。这些模型经过大量文本数据训练,能够产生相关且正确的响应。但是,像任何数据源一样,由于各种因素,它们的输出可能不准确、不完整或具有误导性。 -- **过时的来源:**用于训练模型的数据可能已经过时,不再准确。 -- **错误或不准确的信息:**用于训练模型的来源可能包含不正确或误导性信息,如假新闻或有偏见的观点。 -- **非权威来源:**模型可能无法区分其训练数据中的权威和非权威来源,导致信息不可靠。 +- **过时的来源**:用于训练模型的数据可能已经过时,不再准确。 +- **错误或不准确的信息**:用于训练模型的来源可能包含不正确或误导性信息,如假新闻或有偏见的观点。 +- **非权威来源**:模型可能无法区分其训练数据中的权威和非权威来源,导致信息不可靠。 这使得很难判断LLM生成的信息是否正确。这就是RAG的用武之地。 @@ -123,20 +123,20 @@ _这个视频解释了检索增强生成(RAG),这是一种帮助AI在其 检索增强生成(RAG)是一种强大的技术,它结合了自然语言处理中两种不同方法的优势:基于检索的方法和生成模型。这种混合方法允许生成既与上下文相关又内容丰富的响应,有助于缓解LLM的一些已知挑战。 -在其核心,RAG涉及两个主要组件:**检索器**和**生成器**。 +在其核心,RAG涉及两个主要组件**:检索器**和**生成器**。 -- **检索器:**负责从外部数据源中查找可用于增强AI生成响应的相关信息,类似于搜索引擎。这些信息可以是文本、图像或任何其他与对话上下文相关的数据类型,尽管文本是最常用的数据类型。 +- **检索器**:负责从外部数据源中查找可用于增强AI生成响应的相关信息,类似于搜索引擎。这些信息可以是文本、图像或任何其他与对话上下文相关的数据类型,尽管文本是最常用的数据类型。 -- **生成器:**接收检索到的信息并使用它生成与上下文相关且信息丰富的响应。 +- **生成器**:接收检索到的信息并使用它生成与上下文相关且信息丰富的响应。 以下是说明RAG系统如何工作的示意图: ![RAG系统示意图](assets/rag.png) -1. **用户输入:**用户提出问题。 -2. **检索器:**检索器组件使用一个或多个知识库搜索相关信息。 -3. **增强提示:**检索到的信息与用户问题和上下文结合,创建增强提示。 -4. **生成器:**LLM使用增强提示生成响应。 +1. **用户输入**:用户提出问题。 +2. **检索器**:检索器组件使用一个或多个知识库搜索相关信息。 +3. **增强提示**:检索到的信息与用户问题和上下文结合,创建增强提示。 +4. **生成器**:LLM使用增强提示生成响应。 这种组合允许通过使用您提供的数据而不是依赖模型的训练数据,提供更精确和相关的答案。 @@ -152,9 +152,9 @@ _这个视频解释了检索增强生成(RAG),这是一种帮助AI在其 将外部数据源集成到您的AI应用程序中可以通过多种方式完成,这取决于您想要使用的数据类型和检索机制的复杂性。以下是一些常见方法: -- **API:**许多外部数据源提供API,允许您以编程方式访问其数据。您可以使用这些API实时检索信息,并用它来增强AI生成的响应。 +- **API**:许多外部数据源提供API,允许您以编程方式访问其数据。您可以使用这些API实时检索信息,并用它来增强AI生成的响应。 -- **数据库:**如果您有大量想要用于检索的数据,可以将其存储在数据库中并根据需要查询。这对于需要快速访问的结构化数据很有用。 +- **数据库**:如果您有大量想要用于检索的数据,可以将其存储在数据库中并根据需要查询。这对于需要快速访问的结构化数据很有用。 一旦您确定了集成外部数据源的方法,您可能还需要考虑如何预处理和格式化数据,使其能够被AI模型轻松使用。这可能涉及清理数据,将其转换为合适的格式(如纯文本或Markdown),或将其分割成更小的块以便更容易检索。 From 46e4744900be97519acbfbc4cb215fed5711f3a6 Mon Sep 17 00:00:00 2001 From: jkfzero Date: Sun, 16 Mar 2025 03:00:47 +0800 Subject: [PATCH 8/8] docs: fix image path in Chinese translation README --- lessons/05-rag/translations/README.zh-cn.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lessons/05-rag/translations/README.zh-cn.md b/lessons/05-rag/translations/README.zh-cn.md index 783a5bc2..a072ccbd 100644 --- a/lessons/05-rag/translations/README.zh-cn.md +++ b/lessons/05-rag/translations/README.zh-cn.md @@ -131,7 +131,7 @@ _这个视频解释了检索增强生成(RAG),这是一种帮助AI在其 以下是说明RAG系统如何工作的示意图: -![RAG系统示意图](assets/rag.png) +![RAG系统示意图](../assets/rag.png) 1. **用户输入**:用户提出问题。 2. **检索器**:检索器组件使用一个或多个知识库搜索相关信息。