From ebcec3b79533e7faaf510e87d22c9540ff45b747 Mon Sep 17 00:00:00 2001 From: xuhu0115 <64852985+xuhu0115@users.noreply.github.com> Date: Tue, 25 Jul 2023 19:08:36 +0800 Subject: [PATCH] =?UTF-8?q?=E7=AC=AC=E4=BA=8C=E7=AB=A0=20=20=20=E6=96=87?= =?UTF-8?q?=E5=AD=97=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...问范å¼ä¸Ž Token Language Models, the Chat Format and Tokens.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/content/C2 Building Systems with the ChatGPT API/2.语言模型,æé—®èŒƒå¼ä¸Ž Token Language Models, the Chat Format and Tokens.ipynb b/docs/content/C2 Building Systems with the ChatGPT API/2.语言模型,æé—®èŒƒå¼ä¸Ž Token Language Models, the Chat Format and Tokens.ipynb index a31bb19..eec79c0 100644 --- a/docs/content/C2 Building Systems with the ChatGPT API/2.语言模型,æé—®èŒƒå¼ä¸Ž Token Language Models, the Chat Format and Tokens.ipynb +++ b/docs/content/C2 Building Systems with the ChatGPT API/2.语言模型,æé—®èŒƒå¼ä¸Ž Token Language Models, the Chat Format and Tokens.ipynb @@ -1 +1 @@ -{"cells":[{"cell_type":"markdown","id":"ae5bcee9-6588-4d29-bbb9-6fb351ef6630","metadata":{},"source":["# 第二章 语言模型,æé—®èŒƒå¼ä¸Ž Token\n","\n"," - [一ã€çŽ¯å¢ƒé…ç½®](#一ã€çŽ¯å¢ƒé…ç½®)\n"," - [1.1 加载 API key 和一些 Python 的库。](#1.1-加载-API-key-和一些-Python-的库。)\n"," - [1.2 Helper function 辅助函数](#1.2-Helper-function-辅助函数)\n"," - [二ã€å°è¯•呿¨¡åž‹æé—®å¹¶å¾—到结果](#二ã€å°è¯•呿¨¡åž‹æé—®å¹¶å¾—到结果)\n"," - [三ã€Tokens](#三ã€Tokens)\n"," - [å››ã€Helper function 辅助函数 (æé—®èŒƒå¼)](#å››ã€Helper-function-辅助函数-(æé—®èŒƒå¼))\n"]},{"cell_type":"markdown","id":"baaf0c21","metadata":{},"source":["在本章中,我们将和您分享大型语言模型(LLM)的工作原ç†ã€è®­ç»ƒæ–¹å¼ä»¥åŠåˆ†è¯å™¨ï¼ˆtokenizer)等细节对 LLM 输出的影å“ã€‚æˆ‘ä»¬è¿˜å°†ä»‹ç» LLM çš„æé—®èŒƒå¼ï¼ˆchat formatï¼‰ï¼Œè¿™æ˜¯ä¸€ç§æŒ‡å®šç³»ç»Ÿæ¶ˆæ¯ï¼ˆsystem message)和用户消æ¯ï¼ˆuser message)的方å¼ï¼Œè®©æ‚¨äº†è§£å¦‚何利用这ç§èƒ½åŠ›ã€‚"]},{"cell_type":"markdown","id":"fe10a390-2461-447d-bf8b-8498db404c44","metadata":{},"source":["## 一ã€è¯­è¨€æ¨¡åž‹"]},{"cell_type":"markdown","id":"50317bec","metadata":{},"source":["LLM å¯ä»¥é€šè¿‡ä½¿ç”¨ç›‘ç£å­¦ä¹ æ¥æž„å»ºï¼Œé€šè¿‡ä¸æ–­é¢„æµ‹ä¸‹ä¸€ä¸ªè¯æ¥å­¦ä¹ ã€‚\n","并且,给定一个大的训练集,有数百亿甚至更多的è¯ï¼Œä½ å¯ä»¥åˆ›å»ºä¸€ä¸ªå¤§è§„模的训练集,你å¯ä»¥ä»Žä¸€\n","å¥è¯æˆ–一段文本的一部分开始,åå¤è¦æ±‚è¯­è¨€æ¨¡åž‹å­¦ä¹ é¢„æµ‹ä¸‹ä¸€ä¸ªè¯æ˜¯ä»€ä¹ˆ"]},{"cell_type":"markdown","id":"325afca0","metadata":{},"source":["LLM 主è¦åˆ†ä¸ºä¸¤ç§ç±»åž‹ï¼šåŸºç¡€è¯­è¨€æ¨¡åž‹ï¼ˆBase LLM)和越æ¥è¶Šå—欢迎的指令微调语言模型(Instruction Tuned LLM)。基础语言模型通过åå¤é¢„æµ‹ä¸‹ä¸€ä¸ªè¯æ¥è®­ç»ƒï¼Œå› æ­¤å¦‚果我们给它一个 Promptï¼Œæ¯”å¦‚â€œä»Žå‰æœ‰ä¸€åªç‹¬è§’å…½â€ï¼Œå®ƒå¯èƒ½é€šè¿‡é€è¯é¢„测æ¥å®Œæˆä¸€ä¸ªå…³äºŽç‹¬è§’兽在魔法森林中与其他独角兽朋å‹ä»¬ç”Ÿæ´»çš„æ•…事。\n","\n","ç„¶è€Œï¼Œè¿™ç§æ–¹æ³•的缺点是,如果您给它一个 Prompt,比如“中国的首都是哪里?â€ï¼Œå¾ˆå¯èƒ½å®ƒæ•°æ®ä¸­æœ‰ä¸€æ®µäº’è”网上关于中国的测验问题列表。这时,它å¯èƒ½ä¼šç”¨â€œä¸­å›½æœ€å¤§çš„åŸŽå¸‚æ˜¯ä»€ä¹ˆï¼Ÿä¸­å›½çš„äººå£æ˜¯å¤šå°‘?â€ç­‰ç­‰æ¥å›žç­”è¿™ä¸ªé—®é¢˜ã€‚ä½†å®žé™…ä¸Šï¼Œæ‚¨åªæ˜¯æƒ³çŸ¥é“ä¸­å›½çš„é¦–éƒ½æ˜¯ä»€ä¹ˆï¼Œè€Œä¸æ˜¯åˆ—举所有这些问题。然而,指令微调语言模型会å°è¯•éµå¾ª Prompt,并给出“中国的首都是北京â€çš„回答。\n","\n","那么,如何将基础语言模型转å˜ä¸ºæŒ‡ä»¤å¾®è°ƒè¯­è¨€æ¨¡åž‹å‘¢ï¼Ÿè¿™å°±æ˜¯è®­ç»ƒä¸€ä¸ªæŒ‡ä»¤å¾®è°ƒè¯­è¨€æ¨¡åž‹ï¼ˆä¾‹å¦‚ChatGPT)的过程。首先,您需è¦åœ¨å¤§é‡æ•°æ®ä¸Šè®­ç»ƒåŸºç¡€è¯­è¨€æ¨¡åž‹ï¼Œå› æ­¤éœ€è¦æ•°åƒäº¿ä¸ªå•è¯ï¼Œç”šè‡³æ›´å¤šã€‚这个过程在大型超级计算系统上å¯èƒ½éœ€è¦æ•°æœˆæ—¶é—´ã€‚训练完基础语言模型åŽï¼Œæ‚¨ä¼šé€šè¿‡åœ¨ä¸€å°éƒ¨åˆ†ç¤ºä¾‹ä¸Šè¿›è¡Œè¿›ä¸€æ­¥çš„训练,使模型的输出符åˆè¾“入的指令。例如,您å¯ä»¥è¯·æ‰¿åŒ…商帮助您编写许多指令示例,并对这些指令的正确回答进行训练。这样就创建了一个用于微调的训练集,让模型学会在éµå¾ªæŒ‡ä»¤çš„æƒ…å†µä¸‹é¢„æµ‹ä¸‹ä¸€ä¸ªè¯æ˜¯ä»€ä¹ˆã€‚\n","\n","之åŽï¼Œä¸ºäº†æé«˜è¯­è¨€æ¨¡åž‹è¾“出的质é‡ï¼Œå¸¸è§çš„æ–¹æ³•是让人类对许多ä¸åŒè¾“å‡ºè¿›è¡Œè¯„çº§ï¼Œä¾‹å¦‚æ˜¯å¦æœ‰ç”¨ã€æ˜¯å¦çœŸå®žã€æ˜¯å¦æ— å®³ç­‰ã€‚ç„¶åŽï¼Œæ‚¨å¯ä»¥è¿›ä¸€æ­¥è°ƒæ•´è¯­è¨€æ¨¡åž‹ï¼Œå¢žåŠ ç”Ÿæˆé«˜è¯„级输出的概率。这通常使用强化学习中的人类å馈(RLHF)技术æ¥å®žçŽ°ã€‚ç›¸è¾ƒäºŽè®­ç»ƒåŸºç¡€è¯­è¨€æ¨¡åž‹å¯èƒ½éœ€è¦æ•°æœˆçš„æ—¶é—´ï¼Œä»ŽåŸºç¡€è¯­è¨€æ¨¡åž‹åˆ°æŒ‡ä»¤å¾®è°ƒè¯­è¨€æ¨¡åž‹çš„转å˜è¿‡ç¨‹å¯èƒ½åªéœ€è¦æ•°å¤©æ—¶é—´ï¼Œä½¿ç”¨è¾ƒå°è§„模的数æ®é›†å’Œè®¡ç®—资æºã€‚"]},{"cell_type":"code","execution_count":4,"id":"10f34f3b","metadata":{"height":64},"outputs":[{"name":"stdout","output_type":"stream","text":["中国的首都是北京。\n"]}],"source":["from tool import get_completion\n","\n","response = get_completion(\"中国的首都是哪里?\")\n","print(response)"]},{"cell_type":"markdown","id":"b83d4e38-3e3c-4c5a-a949-040a27f29d63","metadata":{},"source":["## 二ã€Tokens"]},{"cell_type":"markdown","id":"76233527","metadata":{},"source":["到目å‰ä¸ºæ­¢å¯¹ LLM çš„æè¿°ä¸­ï¼Œæˆ‘们将其æè¿°ä¸ºä¸€æ¬¡é¢„测一个å•è¯ï¼Œä½†å®žé™…上还有一个更é‡è¦çš„æŠ€æœ¯ç»†èŠ‚ã€‚å³ **`LLM å®žé™…ä¸Šå¹¶ä¸æ˜¯é‡å¤é¢„测下一个å•è¯ï¼Œè€Œæ˜¯é‡å¤é¢„测下一个 token`** 。当 LLM 接收到输入时,它将将其转æ¢ä¸ºä¸€ç³»åˆ— token,其中æ¯ä¸ª token 都代表常è§çš„字符åºåˆ—。例如,对于 \"Learning new things is fun!\" è¿™å¥è¯ï¼Œæ¯ä¸ªå•è¯éƒ½è¢«è½¬æ¢ä¸ºä¸€ä¸ª token ,而对于较少使用的å•è¯ï¼Œå¦‚ \"Prompting as powerful developer tool\",å•è¯ \"prompting\" 会被拆分为三个 token,å³\"prom\"ã€\"pt\"å’Œ\"ing\"。\n","\n","å½“æ‚¨è¦æ±‚ ChatGPT 颠倒 \"lollipop\" çš„å­—æ¯æ—¶ï¼Œç”±äºŽåˆ†è¯å™¨ï¼ˆtokenizer) å°† \"lollipop\" 分解为三个 tokenï¼Œå³ \"l\"ã€\"oll\"ã€\"ipop\",因此 ChatGPT 难以正确输出字æ¯çš„顺åºã€‚您å¯ä»¥é€šè¿‡åœ¨å­—æ¯ä¹‹é—´æ·»åŠ è¿žå­—ç¬¦æˆ–ç©ºæ ¼çš„æ–¹å¼ï¼Œä½¿åˆ†è¯å™¨å°†æ¯ä¸ªå­—æ¯åˆ†è§£ä¸ºå•独的 token,从而帮助 ChatGPT 更好地认识å•è¯ä¸­çš„æ¯ä¸ªå­—æ¯å¹¶æ­£ç¡®è¾“出它们。"]},{"cell_type":"code","execution_count":5,"id":"cc2d9e40","metadata":{"height":64},"outputs":[{"name":"stdout","output_type":"stream","text":["The reversed letters of \"lollipop\" are \"pillipol\".\n"]}],"source":["# 为了更好展示效果,这里就没有翻译æˆä¸­æ–‡çš„ Prompt\n","# 注æ„这里的字æ¯ç¿»è½¬å‡ºçŽ°äº†é”™è¯¯ï¼Œå´æ©è¾¾è€å¸ˆæ­£æ˜¯é€šè¿‡è¿™ä¸ªä¾‹å­æ¥è§£é‡Š token 的计算方å¼\n","response = get_completion(\"Take the letters in lollipop \\\n","and reverse them\")\n","print(response)"]},{"cell_type":"markdown","id":"9d2b14d0-749d-4a79-9812-7b00ace9ae6f","metadata":{},"source":["但是,\"lollipop\" å过æ¥åº”该是 \"popillol\""]},{"cell_type":"code","execution_count":6,"id":"37cab84f","metadata":{"height":88},"outputs":[{"name":"stdout","output_type":"stream","text":["p-o-p-i-l-l-o-l\n"]}],"source":["response = get_completion(\"\"\"Take the letters in \\\n","l-o-l-l-i-p-o-p and reverse them\"\"\")\n","\n","print(response)"]},{"cell_type":"markdown","id":"f5a6cb95","metadata":{},"source":["![Tokens.png](../../../figures/docs/C2/tokens.png)"]},{"cell_type":"markdown","id":"8b46bc72","metadata":{},"source":["对于英文输入,一个 token 一般对应 4 个字符或者四分之三个å•è¯ï¼›å¯¹äºŽä¸­æ–‡è¾“入,一个 token 一般对应一个或åŠä¸ªè¯ã€‚\n","\n","ä¸åŒæ¨¡åž‹æœ‰ä¸åŒçš„ token é™åˆ¶ï¼Œéœ€è¦æ³¨æ„的是,这里的 token é™åˆ¶æ˜¯è¾“入的 Prompt 和输出的 completion çš„ token 数之和,因此输入的 Prompt 越长,能输出的 completion 的上é™å°±è¶Šä½Žã€‚\n","\n","ChatGPT3.5-turbo çš„ token ä¸Šé™æ˜¯ 4096。"]},{"cell_type":"markdown","id":"c8b88940-d3ab-4c00-b5c0-31531deaacbd","metadata":{},"source":["## 三ã€Helper function 辅助函数 (æé—®èŒƒå¼)\n","䏋颿˜¯è¯¾ç¨‹ä¸­ç”¨åˆ°çš„辅助函数。\n","下图是 OpenAI æä¾›çš„ä¸€ç§æé—®èŒƒå¼ï¼ŒæŽ¥ä¸‹æ¥å´æ©è¾¾è€å¸ˆå°±æ˜¯åœ¨æ¼”示如何利用这ç§èŒƒå¼è¿›è¡Œæ›´å¥½çš„æé—®\n","\n","![Chat-format.png](../../../figures/docs/C2/chat-format.png)"]},{"cell_type":"markdown","id":"9e6b6b3d","metadata":{},"source":["System ä¿¡æ¯ç”¨äºŽæŒ‡å®šæ¨¡åž‹çš„规则,例如设定ã€å›žç­”准则等,而 assistant ä¿¡æ¯å°±æ˜¯è®©æ¨¡åž‹å®Œæˆçš„具体指令"]},{"cell_type":"code","execution_count":8,"id":"8f89efad","metadata":{"height":200},"outputs":[],"source":["import openai\n","def get_completion_from_messages(messages, \n"," model=\"gpt-3.5-turbo\", \n"," temperature=0, \n"," max_tokens=500):\n"," '''\n"," å°è£…ä¸€ä¸ªæ”¯æŒæ›´å¤šå‚数的自定义访问 OpenAI GPT3.5 的函数\n","\n"," 傿•°: \n"," messages: 这是一个消æ¯åˆ—表,æ¯ä¸ªæ¶ˆæ¯éƒ½æ˜¯ä¸€ä¸ªå­—å…¸ï¼ŒåŒ…å« role(角色)和 content(内容)。角色å¯ä»¥æ˜¯'system'ã€'user' 或 'assistant’,内容是角色的消æ¯ã€‚\n"," model: 调用的模型,默认为 gpt-3.5-turbo(ChatGPT),有内测资格的用户å¯ä»¥é€‰æ‹© gpt-4\n"," temperature: è¿™å†³å®šæ¨¡åž‹è¾“å‡ºçš„éšæœºç¨‹åº¦ï¼Œé»˜è®¤ä¸º0,表示输出将éžå¸¸ç¡®å®šã€‚å¢žåŠ æ¸©åº¦ä¼šä½¿è¾“å‡ºæ›´éšæœºã€‚\n"," max_tokens: 这决定模型输出的最大的 token 数。\n"," '''\n"," response = openai.ChatCompletion.create(\n"," model=model,\n"," messages=messages,\n"," temperature=temperature, # è¿™å†³å®šæ¨¡åž‹è¾“å‡ºçš„éšæœºç¨‹åº¦\n"," max_tokens=max_tokens, # 这决定模型输出的最大的 token æ•°\n"," )\n"," return response.choices[0].message[\"content\"]"]},{"cell_type":"code","execution_count":9,"id":"3d0ef08f","metadata":{"height":149},"outputs":[{"name":"stdout","output_type":"stream","text":["在大海的广漠深处,\n","有一åªå°é²¸é±¼æ¬¢ä¹è‡ªç”±ï¼›\n","它的身上披ç€å…‰å½©æ–‘æ–“çš„è¢ï¼Œ\n","跳跃飞舞在波涛的å‚。\n","\n","它ä¸çŸ¥çƒ¦æ¼ï¼ŒåªçŸ¥æ¬¢å¿«èµ·èˆžï¼Œ\n","阳光下闪亮,活力无边疆;\n","它的微笑如åŒç’€ç’¨çš„æ˜Ÿè¾°ï¼Œ\n","为大海增添一片美丽的光芒。\n","\n","大海是它的天地,自由是它的伴,\n","å¿«ä¹æ˜¯å®ƒæ°¸æ’的干è‰å †ï¼›\n","在浩瀚无垠的水中自由畅游,\n","å°é²¸é±¼çš„æ¬¢ä¹è®©äººå¿ƒä¸­æ¸©æš–。\n","\n","所以啊,让我们感å—那欢ä¹çš„鲸鱼,\n","尽情舞动,让快ä¹è‡ªç”±æµï¼›\n","æ— è®ºä½•æ—¶ä½•åœ°ï¼Œéƒ½ä¿æŒå¾®ç¬‘,\n","åƒé²¸é±¼ä¸€æ ·ï¼Œæ´»å‡ºè‡ªå·±çš„光芒。\n"]}],"source":["messages = [ \n","{'role':'system', \n"," 'content':'你是一个助ç†ï¼Œ 并以 Seuss è‹æ–¯åšå£«çš„风格作出回答。'}, \n","{'role':'user', \n"," 'content':'就快ä¹çš„å°é²¸é±¼ä¸ºä¸»é¢˜ç»™æˆ‘写一首短诗'}, \n","] \n","response = get_completion_from_messages(messages, temperature=1)\n","print(response)"]},{"cell_type":"code","execution_count":10,"id":"e34c399e","metadata":{"height":166},"outputs":[{"name":"stdout","output_type":"stream","text":["从å°é²¸é±¼çš„å¿«ä¹ç¬‘声中,我们学到了无论é‡åˆ°ä»€ä¹ˆå›°éš¾ï¼Œå¿«ä¹å§‹ç»ˆæ˜¯æœ€å¥½çš„è§£è¯ã€‚\n"]}],"source":["# 长度控制\n","messages = [ \n","{'role':'system',\n"," 'content':'你的所有答å¤åªèƒ½æ˜¯ä¸€å¥è¯'}, \n","{'role':'user',\n"," 'content':'写一个关于快ä¹çš„å°é²¸é±¼çš„æ•…事'}, \n","] \n","response = get_completion_from_messages(messages, temperature =1)\n","print(response)"]},{"cell_type":"code","execution_count":11,"id":"0ca678de","metadata":{"height":181},"outputs":[{"name":"stdout","output_type":"stream","text":["在海洋的深处ä½ç€ä¸€åªå°é²¸é±¼ï¼Œå®ƒæ€»æ˜¯å±•å¼€ç¬‘å®¹åœ¨æ°´ä¸­ç¿±ç¿”ï¼Œå¿«ä¹æ— è¾¹çš„æ—¶å€™å°±ä¼šè·³èµ·åŽä¸½çš„舞蹈。\n"]}],"source":["# 以上结åˆ\n","messages = [ \n","{'role':'system',\n"," 'content':'你是一个助ç†ï¼Œ 并以 Seuss è‹æ–¯åšå£«çš„风格作出回答,åªå›žç­”一å¥è¯'}, \n","{'role':'user',\n"," 'content':'写一个关于快ä¹çš„å°é²¸é±¼çš„æ•…事'},\n","] \n","response = get_completion_from_messages(messages, temperature =1)\n","print(response)"]},{"cell_type":"code","execution_count":12,"id":"89a70c79","metadata":{"height":370},"outputs":[],"source":["def get_completion_and_token_count(messages, \n"," model=\"gpt-3.5-turbo\", \n"," temperature=0, \n"," max_tokens=500):\n"," \"\"\"\n"," 使用 OpenAI çš„ GPT-3 模型生æˆèŠå¤©å›žå¤ï¼Œå¹¶è¿”回生æˆçš„回å¤å†…容以åŠä½¿ç”¨çš„ token æ•°é‡ã€‚\n","\n"," 傿•°:\n"," messages: èŠå¤©æ¶ˆæ¯åˆ—表。\n"," model: 使用的模型å称。默认为\"gpt-3.5-turbo\"。\n"," temperature: 控制生æˆå›žå¤çš„éšæœºæ€§ã€‚值越大,生æˆçš„回å¤è¶Šéšæœºã€‚é»˜è®¤ä¸º 0。\n"," max_tokens: 生æˆå›žå¤çš„æœ€å¤§ token æ•°é‡ã€‚默认为 500。\n","\n"," 返回:\n"," content: 生æˆçš„回å¤å†…容。\n"," token_dict: 包å«'prompt_tokens'ã€'completion_tokens'å’Œ'total_tokens'的字典,分别表示æç¤ºçš„ token æ•°é‡ã€ç”Ÿæˆçš„回å¤çš„ token æ•°é‡å’Œæ€»çš„ token æ•°é‡ã€‚\n"," \"\"\"\n"," response = openai.ChatCompletion.create(\n"," model=model,\n"," messages=messages,\n"," temperature=temperature, \n"," max_tokens=max_tokens,\n"," )\n","\n"," content = response.choices[0].message[\"content\"]\n"," \n"," token_dict = {\n","'prompt_tokens':response['usage']['prompt_tokens'],\n","'completion_tokens':response['usage']['completion_tokens'],\n","'total_tokens':response['usage']['total_tokens'],\n"," }\n","\n"," return content, token_dict"]},{"cell_type":"code","execution_count":13,"id":"cfd8fbd4","metadata":{"height":146},"outputs":[{"name":"stdout","output_type":"stream","text":["在大海的深处,有一åªå°é²¸é±¼ï¼Œ\n","它快ä¹åœ°æ¸¸æ¥æ¸¸åŽ»ï¼Œåƒä¸€åªå°å°çš„鱼。\n","å®ƒçš„çš®è‚¤å…‰æ»‘åˆæ¹›è“,åƒå¤©ç©ºä¸­çš„云朵,\n","å®ƒçš„çœ¼ç›æ˜Žäº®åˆæ¸©æŸ”,åƒå¤œç©ºä¸­çš„æ˜Ÿæ˜Ÿã€‚\n","\n","它和海洋为伴,一起跳跃åˆå¬‰æˆï¼Œ\n","它和鱼儿们一起,快ä¹åœ°æ¸¸æ¥æ¸¸åŽ»ã€‚\n","它喜欢唱歌åˆè·³èˆžï¼Œç»™å¤§å®¶å¸¦æ¥æ¬¢ä¹ï¼Œ\n","它的声音甜美åˆåЍå¬ï¼ŒåƒéŸ³ä¹ä¸­çš„节å¥ã€‚\n","\n","å°é²¸é±¼æ˜¯å¿«ä¹çš„使者,给世界带æ¥ç¬‘声,\n","å®ƒçš„å¿«ä¹æ˜¯æ— ç©·çš„,永远ä¸ä¼šåœæ­¢ã€‚\n","让我们跟éšå°é²¸é±¼ï¼Œä¸€èµ·å¿«ä¹åœ°æ¸¸æ¥æ¸¸åŽ»ï¼Œ\n","在大海的宽阔中,找到属于我们的快ä¹ä¹‹åœ°ã€‚\n"]}],"source":["messages = [ \n","{'role':'system', \n"," 'content':'你是一个助ç†ï¼Œ 并以 Seuss è‹æ–¯åšå£«çš„风格作出回答。'}, \n","{'role':'user', \n"," 'content':'就快ä¹çš„å°é²¸é±¼ä¸ºä¸»é¢˜ç»™æˆ‘写一首短诗'}, \n","] \n","response, token_dict = get_completion_and_token_count(messages)\n","print(response)"]},{"cell_type":"code","execution_count":14,"id":"352ad320","metadata":{"height":30},"outputs":[{"name":"stdout","output_type":"stream","text":["{'prompt_tokens': 67, 'completion_tokens': 293, 'total_tokens': 360}\n"]}],"source":["print(token_dict)"]},{"cell_type":"markdown","id":"d7f65685","metadata":{},"source":["最åŽï¼Œæˆ‘们认为 Prompt 对 AI 应用开å‘çš„é©å‘½æ€§å½±å“仿œªå¾—到充分é‡è§†ä½Žã€‚åœ¨ä¼ ç»Ÿçš„ç›‘ç£æœºå™¨å­¦ä¹ å·¥ä½œæµä¸­ï¼Œå¦‚æžœæƒ³è¦æž„建一个å¯ä»¥å°†é¤åŽ…è¯„è®ºåˆ†ç±»ä¸ºæ­£é¢æˆ–è´Ÿé¢çš„分类器,首先需è¦èŽ·å–一大批带有标签的数æ®ï¼Œå¯èƒ½éœ€è¦å‡ ç™¾ä¸ªï¼Œè¿™ä¸ªè¿‡ç¨‹å¯èƒ½éœ€è¦å‡ å‘¨ï¼Œç”šè‡³ä¸€ä¸ªæœˆçš„æ—¶é—´ã€‚接ç€ï¼Œæ‚¨éœ€è¦åœ¨è¿™äº›æ•°æ®ä¸Šè®­ç»ƒä¸€ä¸ªæ¨¡åž‹ï¼Œæ‰¾åˆ°ä¸€ä¸ªåˆé€‚çš„å¼€æºæ¨¡åž‹ï¼Œå¹¶è¿›è¡Œæ¨¡åž‹çš„调整和评估,这个阶段å¯èƒ½éœ€è¦å‡ å¤©ã€å‡ å‘¨ï¼Œç”šè‡³å‡ ä¸ªæœˆçš„æ—¶é—´ã€‚最åŽï¼Œæ‚¨å¯èƒ½éœ€è¦ä½¿ç”¨äº‘æœåŠ¡æ¥éƒ¨ç½²æ¨¡åž‹ï¼Œå°†æ¨¡åž‹ä¸Šä¼ åˆ°äº‘端,并让它è¿è¡Œèµ·æ¥ï¼Œæ‰èƒ½æœ€ç»ˆè°ƒç”¨æ‚¨çš„æ¨¡åž‹ã€‚整个过程通常需è¦ä¸€ä¸ªå›¢é˜Ÿæ•°æœˆæ—¶é—´æ‰èƒ½å®Œæˆã€‚\n","\n","相比之下,使用基于 Prompt 的机器学习方法,当您有一个文本应用时,åªéœ€æä¾›ä¸€ä¸ªç®€å•çš„ Prompt å°±å¯ä»¥äº†ã€‚这个过程å¯èƒ½åªéœ€è¦å‡ åˆ†é’Ÿï¼Œå¦‚果需è¦å¤šæ¬¡è¿­ä»£æ¥å¾—到有效的 Prompt çš„è¯ï¼Œæœ€å¤šå‡ ä¸ªå°æ—¶å³å¯å®Œæˆã€‚åœ¨å‡ å¤©å†…ï¼ˆå°½ç®¡å®žé™…æƒ…å†µé€šå¸¸æ˜¯å‡ ä¸ªå°æ—¶ï¼‰ï¼Œæ‚¨å°±å¯ä»¥é€šè¿‡ API 调用æ¥è¿è¡Œæ¨¡åž‹ï¼Œå¹¶å¼€å§‹ä½¿ç”¨ã€‚一旦您达到了这个步骤,åªéœ€å‡ åˆ†é’Ÿæˆ–å‡ ä¸ªå°æ—¶ï¼Œå°±å¯ä»¥å¼€å§‹è°ƒç”¨æ¨¡åž‹è¿›è¡ŒæŽ¨ç†ã€‚因此,以å‰å¯èƒ½éœ€è¦èŠ±è´¹å…­ä¸ªæœˆç”šè‡³ä¸€å¹´æ—¶é—´æ‰èƒ½æž„建的应用,现在åªéœ€è¦å‡ åˆ†é’Ÿæˆ–å‡ ä¸ªå°æ—¶ï¼Œæœ€å¤šæ˜¯å‡ å¤©çš„æ—¶é—´ï¼Œå°±å¯ä»¥ä½¿ç”¨ Prompt 构建起æ¥ã€‚è¿™ç§æ–¹æ³•正在æžå¤§åœ°æ”¹å˜ AI 应用的快速构建方å¼ã€‚\n","\n","éœ€è¦æ³¨æ„çš„æ˜¯ï¼Œè¿™ç§æ–¹æ³•适用于许多éžç»“构化数æ®åº”用,特别是文本应用,以åŠè¶Šæ¥è¶Šå¤šçš„视觉应用,尽管目å‰çš„视觉技术ä»åœ¨å‘展中。但它并ä¸é€‚用于结构化数æ®åº”ç”¨ï¼Œä¹Ÿå°±æ˜¯é‚£äº›å¤„ç† Excel 电å­è¡¨æ ¼ä¸­å¤§é‡æ•°å€¼çš„æœºå™¨å­¦ä¹ åº”ç”¨ã€‚ç„¶è€Œï¼Œå¯¹äºŽé€‚ç”¨äºŽè¿™ç§æ–¹æ³•的应用,AI 组件å¯ä»¥è¢«å¿«é€Ÿæž„å»ºï¼Œå¹¶ä¸”æ­£åœ¨æ”¹å˜æ•´ä¸ªç³»ç»Ÿçš„æž„建工作æµã€‚构建整个系统å¯èƒ½ä»ç„¶éœ€è¦å‡ å¤©ã€å‡ å‘¨æˆ–更长时间,但至少这部分å¯ä»¥æ›´å¿«åœ°å®Œæˆã€‚"]},{"cell_type":"markdown","id":"cfe248d6","metadata":{},"source":["下一个章中,我们将展示如何利用这些组件æ¥è¯„估客户æœåŠ¡åŠ©æ‰‹çš„è¾“å…¥ã€‚\n","这将是本课程中构建在线零售商客户æœåŠ¡åŠ©æ‰‹çš„æ›´å®Œæ•´ç¤ºä¾‹çš„ä¸€éƒ¨åˆ†ã€‚"]},{"cell_type":"markdown","id":"195a6733","metadata":{},"source":["## å››ã€è‹±æ–‡ç‰ˆ"]},{"cell_type":"markdown","id":"82212f83","metadata":{},"source":["**1.1 语言模型**"]},{"cell_type":"code","execution_count":15,"id":"6cc72ba8","metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":["The capital of China is Beijing.\n"]}],"source":["response = get_completion(\"What is the capital of China?\")\n","print(response)"]},{"cell_type":"markdown","id":"e3aebf26","metadata":{},"source":["**2.1 Tokens**"]},{"cell_type":"code","execution_count":16,"id":"0ad0d49a","metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":["The reversed letters of \"lollipop\" are \"pillipol\".\n"]}],"source":["response = get_completion(\"Take the letters in lollipop and reverse them\")\n","print(response)"]},{"cell_type":"code","execution_count":17,"id":"1b4ac3d6","metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":["p-o-p-i-l-l-o-l\n"]}],"source":["response = get_completion(\"\"\"Take the letters in \\\n","l-o-l-l-i-p-o-p and reverse them\"\"\")\n","\n","print(response)"]},{"cell_type":"markdown","id":"7ab33697","metadata":{},"source":["**3.1 æé—®èŒƒå¼**"]},{"cell_type":"code","execution_count":18,"id":"9882f4d9","metadata":{},"outputs":[],"source":["def get_completion_from_messages(messages, \n"," model=\"gpt-3.5-turbo\", \n"," temperature=0, \n"," max_tokens=500):\n"," '''\n"," å°è£…ä¸€ä¸ªæ”¯æŒæ›´å¤šå‚数的自定义访问 OpenAI GPT3.5 的函数\n","\n"," 傿•°: \n"," messages: 这是一个消æ¯åˆ—表,æ¯ä¸ªæ¶ˆæ¯éƒ½æ˜¯ä¸€ä¸ªå­—å…¸ï¼ŒåŒ…å« role(角色)和 content(内容)。角色å¯ä»¥æ˜¯'system'ã€'user' 或 'assistant’,内容是角色的消æ¯ã€‚\n"," model: 调用的模型,默认为 gpt-3.5-turbo(ChatGPT),有内测资格的用户å¯ä»¥é€‰æ‹© gpt-4\n"," temperature: è¿™å†³å®šæ¨¡åž‹è¾“å‡ºçš„éšæœºç¨‹åº¦ï¼Œé»˜è®¤ä¸º0,表示输出将éžå¸¸ç¡®å®šã€‚å¢žåŠ æ¸©åº¦ä¼šä½¿è¾“å‡ºæ›´éšæœºã€‚\n"," max_tokens: 这决定模型输出的最大的 token 数。\n"," '''\n"," response = openai.ChatCompletion.create(\n"," model=model,\n"," messages=messages,\n"," temperature=temperature, # è¿™å†³å®šæ¨¡åž‹è¾“å‡ºçš„éšæœºç¨‹åº¦\n"," max_tokens=max_tokens, # 这决定模型输出的最大的 token æ•°\n"," )\n"," return response.choices[0].message[\"content\"]"]},{"cell_type":"code","execution_count":19,"id":"ca6fd80c","metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":["Oh, a carrot so happy and bright,\n","With a vibrant orange hue, oh what a sight!\n","It grows in the garden, so full of delight,\n","A veggie so cheery, it shines in the light.\n","\n","Its green leaves wave with such joyful glee,\n","As it dances and sways, so full of glee.\n","With a crunch when you bite, so wonderfully sweet,\n","This happy little carrot is quite a treat!\n","\n","From the soil, it sprouts, reaching up to the sky,\n","With a joyous spirit, it can't help but try.\n","To bring smiles to faces and laughter to hearts,\n","This happy little carrot, a work of art!\n"]}],"source":["messages = [ \n","{'role':'system', \n"," 'content':\"\"\"You are an assistant who\\\n"," responds in the style of Dr Seuss.\"\"\"}, \n","{'role':'user', \n"," 'content':\"\"\"write me a very short poem\\\n"," about a happy carrot\"\"\"}, \n","] \n","response = get_completion_from_messages(messages, temperature=1)\n","print(response)"]},{"cell_type":"code","execution_count":20,"id":"ae0d1308","metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":["Once upon a time, there was a happy carrot named Crunch who lived in a beautiful vegetable garden.\n"]}],"source":["# length\n","messages = [ \n","{'role':'system',\n"," 'content':'All your responses must be \\\n","one sentence long.'}, \n","{'role':'user',\n"," 'content':'write me a story about a happy carrot'}, \n","] \n","response = get_completion_from_messages(messages, temperature =1)\n","print(response)"]},{"cell_type":"code","execution_count":21,"metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":["Once there was a carrot named Larry, he was jolly and bright orange, never wary.\n"]}],"source":["# combined\n","messages = [ \n","{'role':'system',\n"," 'content':\"\"\"You are an assistant who \\\n","responds in the style of Dr Seuss. \\\n","All your responses must be one sentence long.\"\"\"}, \n","{'role':'user',\n"," 'content':\"\"\"write me a story about a happy carrot\"\"\"},\n","] \n","response = get_completion_from_messages(messages, \n"," temperature =1)\n","print(response)"]},{"cell_type":"code","execution_count":22,"id":"944c0a78","metadata":{},"outputs":[],"source":["def get_completion_and_token_count(messages, \n"," model=\"gpt-3.5-turbo\", \n"," temperature=0, \n"," max_tokens=500):\n"," \"\"\"\n"," 使用 OpenAI çš„ GPT-3 模型生æˆèŠå¤©å›žå¤ï¼Œå¹¶è¿”回生æˆçš„回å¤å†…容以åŠä½¿ç”¨çš„ token æ•°é‡ã€‚\n","\n"," 傿•°:\n"," messages: èŠå¤©æ¶ˆæ¯åˆ—表。\n"," model: 使用的模型å称。默认为\"gpt-3.5-turbo\"。\n"," temperature: 控制生æˆå›žå¤çš„éšæœºæ€§ã€‚值越大,生æˆçš„回å¤è¶Šéšæœºã€‚é»˜è®¤ä¸º 0。\n"," max_tokens: 生æˆå›žå¤çš„æœ€å¤§ token æ•°é‡ã€‚默认为 500。\n","\n"," 返回:\n"," content: 生æˆçš„回å¤å†…容。\n"," token_dict: 包å«'prompt_tokens'ã€'completion_tokens'å’Œ'total_tokens'的字典,分别表示æç¤ºçš„ token æ•°é‡ã€ç”Ÿæˆçš„回å¤çš„ token æ•°é‡å’Œæ€»çš„ token æ•°é‡ã€‚\n"," \"\"\"\n"," response = openai.ChatCompletion.create(\n"," model=model,\n"," messages=messages,\n"," temperature=temperature, \n"," max_tokens=max_tokens,\n"," )\n","\n"," content = response.choices[0].message[\"content\"]\n"," \n"," token_dict = {\n","'prompt_tokens':response['usage']['prompt_tokens'],\n","'completion_tokens':response['usage']['completion_tokens'],\n","'total_tokens':response['usage']['total_tokens'],\n"," }\n","\n"," return content, token_dict"]},{"cell_type":"code","execution_count":23,"id":"7363bc60","metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":["Oh, the happy carrot, so bright and orange,\n","Grown in the garden, a joyful forage.\n","With a smile so wide, from top to bottom,\n","It brings happiness, oh how it blossoms!\n","\n","In the soil it grew, with love and care,\n","Nourished by sunshine, fresh air to share.\n","Its leaves so green, reaching up so high,\n","A happy carrot, oh my, oh my!\n","\n","With a crunch and a munch, it's oh so tasty,\n","Filled with vitamins, oh so hasty.\n","A happy carrot, a delight to eat,\n","Bringing joy and health, oh what a treat!\n","\n","So let's celebrate this veggie so grand,\n","With a happy carrot in each hand.\n","For in its presence, we surely find,\n","A taste of happiness, one of a kind!\n"]}],"source":["messages = [\n","{'role':'system', \n"," 'content':\"\"\"You are an assistant who responds\\\n"," in the style of Dr Seuss.\"\"\"}, \n","{'role':'user',\n"," 'content':\"\"\"write me a very short poem \\ \n"," about a happy carrot\"\"\"}, \n","] \n","response, token_dict = get_completion_and_token_count(messages)\n","print(response)"]},{"cell_type":"code","execution_count":24,"id":"c1fa09dd","metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":["{'prompt_tokens': 37, 'completion_tokens': 164, 'total_tokens': 201}\n"]}],"source":["print(token_dict)"]}],"metadata":{"kernelspec":{"display_name":"Python 3.9.6 64-bit","language":"python","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.10.11"},"vscode":{"interpreter":{"hash":"31f2aee4e71d21fbe5cf8b01ff0e069b9275f58929596ceb00d14d90e3e16cd6"}}},"nbformat":4,"nbformat_minor":5} +{"cells":[{"cell_type":"markdown","id":"ae5bcee9-6588-4d29-bbb9-6fb351ef6630","metadata":{},"source":["# 第二章 语言模型,æé—®èŒƒå¼ä¸Ž Token\n","\n"," - [一ã€çŽ¯å¢ƒé…ç½®](#一ã€çŽ¯å¢ƒé…ç½®)\n"," - [1.1 加载 API key 和一些 Python 的库。](#1.1-加载-API-key-和一些-Python-的库。)\n"," - [1.2 Helper function 辅助函数](#1.2-Helper-function-辅助函数)\n"," - [二ã€å°è¯•呿¨¡åž‹æé—®å¹¶å¾—到结果](#二ã€å°è¯•呿¨¡åž‹æé—®å¹¶å¾—到结果)\n"," - [三ã€Tokens](#三ã€Tokens)\n"," - [å››ã€Helper function 辅助函数 (æé—®èŒƒå¼)](#å››ã€Helper-function-辅助函数-(æé—®èŒƒå¼))\n"]},{"cell_type":"markdown","id":"baaf0c21","metadata":{},"source":["在本章中,我们将和您分享大型语言模型(LLM)的工作原ç†ã€è®­ç»ƒæ–¹å¼ä»¥åŠåˆ†è¯å™¨ï¼ˆtokenizer)等细节对 LLM 输出的影å“ã€‚æˆ‘ä»¬è¿˜å°†ä»‹ç» LLM çš„æé—®èŒƒå¼ï¼ˆchat formatï¼‰ï¼Œè¿™æ˜¯ä¸€ç§æŒ‡å®šç³»ç»Ÿæ¶ˆæ¯ï¼ˆsystem message)和用户消æ¯ï¼ˆuser message)的方å¼ï¼Œè®©æ‚¨äº†è§£å¦‚何利用这ç§èƒ½åŠ›ã€‚"]},{"cell_type":"markdown","id":"fe10a390-2461-447d-bf8b-8498db404c44","metadata":{},"source":["## 一ã€è¯­è¨€æ¨¡åž‹"]},{"cell_type":"markdown","id":"50317bec","metadata":{},"source":["大语言模型(LLM)是通过预测下一个è¯çš„监ç£å­¦ä¹ æ–¹å¼è¿›è¡Œè®­ç»ƒçš„。具体æ¥è¯´ï¼Œé¦–å…ˆå‡†å¤‡ä¸€ä¸ªåŒ…å«æ•°ç™¾äº¿ç”šè‡³æ›´å¤šè¯çš„大规模文本数æ®é›†ã€‚ç„¶åŽï¼Œå¯ä»¥ä»Žè¿™äº›æ–‡æœ¬ä¸­æå–å¥å­æˆ–å¥å­ç‰‡æ®µä½œä¸ºæ¨¡åž‹è¾“入。模型会根æ®å½“å‰è¾“å…¥ Context 预测下一个è¯çš„æ¦‚çŽ‡åˆ†å¸ƒã€‚é€šè¿‡ä¸æ–­æ¯”较模型预测和实际的下一个è¯ï¼Œå¹¶æ›´æ–°æ¨¡åž‹å‚数最å°åŒ–两者差异,è¯­è¨€æ¨¡åž‹é€æ­¥æŽŒæ¡äº†è¯­è¨€çš„规律,学会了预测下一个è¯ã€‚\n","\n","在训练过程中,研究人员会准备大é‡å¥å­æˆ–å¥å­ç‰‡æ®µä½œä¸ºè®­ç»ƒæ ·æœ¬,è¦æ±‚模型一次次预测下一个è¯ï¼Œé€šè¿‡åå¤è®­ç»ƒä¿ƒä½¿æ¨¡åž‹å‚æ•°æ”¶æ•›ï¼Œä½¿å…¶é¢„æµ‹èƒ½åŠ›ä¸æ–­æé«˜ã€‚ç»è¿‡åœ¨æµ·é‡æ–‡æœ¬æ•°æ®é›†ä¸Šçš„训练,语言模型å¯ä»¥è¾¾åˆ°å分准确地预测下一个è¯çš„æ•ˆæžœã€‚è¿™ç§**以预测下一个è¯ä¸ºè®­ç»ƒç›®æ ‡çš„æ–¹æ³•使得语言模型获得强大的语言生æˆèƒ½åŠ›**。"]},{"cell_type":"markdown","id":"325afca0","metadata":{},"source":["大型语言模型主è¦å¯ä»¥åˆ†ä¸ºä¸¤ç±»:基础语言模型和指令调优语言模型。\n","\n","**基础语言模型**(Base LLM)通过åå¤é¢„æµ‹ä¸‹ä¸€ä¸ªè¯æ¥è®­ç»ƒçš„æ–¹å¼è¿›è¡Œè®­ç»ƒï¼Œæ²¡æœ‰æ˜Žç¡®çš„目标导å‘。因此,如果给它一个开放å¼çš„ prompt ,它å¯èƒ½ä¼šé€šè¿‡è‡ªç”±è”æƒ³ç”Ÿæˆæˆå‰§åŒ–的内容。而对于具体的问题,基础语言模型也å¯èƒ½ç»™å‡ºä¸Žé—®é¢˜æ— å…³çš„回答。例如,给它一个 Prompt ,比如â€ä¸­å›½çš„首都是哪里?“,很å¯èƒ½å®ƒæ•°æ®ä¸­æœ‰ä¸€æ®µäº’è”网上关于中国的测验问题列表。这时,它å¯èƒ½ä¼šç”¨â€œä¸­å›½æœ€å¤§çš„åŸŽå¸‚æ˜¯ä»€ä¹ˆï¼Ÿä¸­å›½çš„äººå£æ˜¯å¤šå°‘?â€ç­‰ç­‰æ¥å›žç­”è¿™ä¸ªé—®é¢˜ã€‚ä½†å®žé™…ä¸Šï¼Œæ‚¨åªæ˜¯æƒ³çŸ¥é“ä¸­å›½çš„é¦–éƒ½æ˜¯ä»€ä¹ˆï¼Œè€Œä¸æ˜¯åˆ—举所有这些问题。\n","\n","相比之下,**指令微调的语言模型**(Instruction Tuned LLM)则进行了专门的训练,以便更好地ç†è§£é—®é¢˜å¹¶ç»™å‡ºç¬¦åˆæŒ‡ä»¤çš„回答。例如,对“中国的首都是哪里?â€è¿™ä¸ªé—®é¢˜ï¼Œç»è¿‡å¾®è°ƒçš„语言模型很å¯èƒ½ç›´æŽ¥å›žç­”“中国的首都是北京â€ï¼Œè€Œä¸æ˜¯ç”Ÿç¡¬åœ°åˆ—出一系列相关问题。**指令微调使语言模型更加适åˆä»»åС坼å‘的对è¯åº”用**。它å¯ä»¥ç”Ÿæˆéµå¾ªæŒ‡ä»¤çš„语义准确的回å¤ï¼Œè€Œéžè‡ªç”±è”想。因此,许多实际应用已ç»é‡‡ç”¨æŒ‡ä»¤è°ƒä¼˜è¯­è¨€æ¨¡åž‹ã€‚ç†Ÿç»ƒæŽŒæ¡æŒ‡ä»¤å¾®è°ƒçš„工作机制,是开å‘者实现语言模型应用的é‡è¦ä¸€æ­¥ã€‚"]},{"cell_type":"code","execution_count":4,"id":"10f34f3b","metadata":{"height":64},"outputs":[{"name":"stdout","output_type":"stream","text":["中国的首都是北京。\n"]}],"source":["from tool import get_completion\n","\n","response = get_completion(\"中国的首都是哪里?\")\n","print(response)"]},{"cell_type":"markdown","id":"83a99b92","metadata":{},"source":["那么,如何将基础语言模型转å˜ä¸ºæŒ‡ä»¤å¾®è°ƒè¯­è¨€æ¨¡åž‹å‘¢ï¼Ÿ\n","\n","这也就是训练一个指令微调语言模型(例如ChatGPT)的过程。\n","首先,在大规模文本数æ®é›†ä¸Šè¿›è¡Œ**无监ç£é¢„训练**,获得基础语言模型。\n","这一步需è¦ä½¿ç”¨æ•°åƒäº¿è¯ç”šè‡³æ›´å¤šçš„æ•°æ®ï¼Œåœ¨å¤§åž‹è¶…级计算系统上å¯èƒ½éœ€è¦æ•°æœˆæ—¶é—´ã€‚\n","之åŽï¼Œä½¿ç”¨åŒ…嫿Œ‡ä»¤åŠå¯¹åº”回å¤ç¤ºä¾‹çš„å°æ•°æ®é›†å¯¹åŸºç¡€æ¨¡åž‹è¿›è¡Œ**æœ‰ç›‘ç£ fine-tune**ï¼Œè¿™è®©æ¨¡åž‹é€æ­¥å­¦ä¼šéµå¾ªæŒ‡ä»¤ç”Ÿæˆè¾“出,å¯ä»¥é€šè¿‡é›‡ä½£æ‰¿åŒ…商构造适åˆçš„训练示例。\n","接下æ¥ï¼Œä¸ºäº†æé«˜è¯­è¨€æ¨¡åž‹è¾“出的质é‡ï¼Œå¸¸è§çš„æ–¹æ³•是让人类对许多ä¸åŒè¾“å‡ºè¿›è¡Œè¯„çº§ï¼Œä¾‹å¦‚æ˜¯å¦æœ‰ç”¨ã€æ˜¯å¦çœŸå®žã€æ˜¯å¦æ— å®³ç­‰ã€‚\n","ç„¶åŽï¼Œæ‚¨å¯ä»¥è¿›ä¸€æ­¥è°ƒæ•´è¯­è¨€æ¨¡åž‹ï¼Œå¢žåŠ ç”Ÿæˆé«˜è¯„级输出的概率。这通常使用**基于人类å馈的强化学习**(RLHF)技术æ¥å®žçŽ°ã€‚\n","相较于训练基础语言模型å¯èƒ½éœ€è¦æ•°æœˆçš„æ—¶é—´ï¼Œä»ŽåŸºç¡€è¯­è¨€æ¨¡åž‹åˆ°æŒ‡ä»¤å¾®è°ƒè¯­è¨€æ¨¡åž‹çš„转å˜è¿‡ç¨‹å¯èƒ½åªéœ€è¦æ•°å¤©æ—¶é—´ï¼Œä½¿ç”¨è¾ƒå°è§„模的数æ®é›†å’Œè®¡ç®—资æºã€‚\n"]},{"cell_type":"markdown","id":"b83d4e38-3e3c-4c5a-a949-040a27f29d63","metadata":{},"source":["## 二ã€Tokens"]},{"cell_type":"markdown","id":"76233527","metadata":{},"source":["到目å‰ä¸ºæ­¢å¯¹ LLM çš„æè¿°ä¸­ï¼Œæˆ‘们将其æè¿°ä¸ºä¸€æ¬¡é¢„测一个å•è¯ï¼Œä½†å®žé™…上还有一个更é‡è¦çš„æŠ€æœ¯ç»†èŠ‚ã€‚å³ **`LLM å®žé™…ä¸Šå¹¶ä¸æ˜¯é‡å¤é¢„测下一个å•è¯ï¼Œè€Œæ˜¯é‡å¤é¢„测下一个 token`** 。对于一个å¥å­ï¼Œè¯­è¨€æ¨¡åž‹ä¼šå…ˆä½¿ç”¨åˆ†è¯å™¨å°†å…¶æ‹†åˆ†ä¸ºä¸€ä¸ªä¸ª token ï¼Œè€Œä¸æ˜¯åŽŸå§‹çš„å•è¯ã€‚对于生僻è¯ï¼Œå¯èƒ½ä¼šæ‹†åˆ†ä¸ºå¤šä¸ª token 。这样å¯ä»¥å¤§å¹…é™ä½Žå­—典规模,æé«˜æ¨¡åž‹è®­ç»ƒå’ŒæŽ¨æ–­çš„æ•ˆçŽ‡ã€‚ä¾‹å¦‚ï¼Œå¯¹äºŽ \"Learning new things is fun!\" è¿™å¥è¯ï¼Œæ¯ä¸ªå•è¯éƒ½è¢«è½¬æ¢ä¸ºä¸€ä¸ª token ,而对于较少使用的å•è¯ï¼Œå¦‚ \"Prompting as powerful developer tool\",å•è¯ \"prompting\" 会被拆分为三个 token,å³\"prom\"ã€\"pt\"å’Œ\"ing\"。\n","\n"]},{"cell_type":"code","execution_count":5,"id":"cc2d9e40","metadata":{"height":64},"outputs":[{"name":"stdout","output_type":"stream","text":["The reversed letters of \"lollipop\" are \"pillipol\".\n"]}],"source":["# 为了更好展示效果,这里就没有翻译æˆä¸­æ–‡çš„ Prompt\n","# 注æ„这里的字æ¯ç¿»è½¬å‡ºçŽ°äº†é”™è¯¯ï¼Œå´æ©è¾¾è€å¸ˆæ­£æ˜¯é€šè¿‡è¿™ä¸ªä¾‹å­æ¥è§£é‡Š token 的计算方å¼\n","response = get_completion(\"Take the letters in lollipop \\\n","and reverse them\")\n","print(response)"]},{"cell_type":"markdown","id":"9d2b14d0-749d-4a79-9812-7b00ace9ae6f","metadata":{},"source":["但是,\"lollipop\" å过æ¥åº”该是 \"popillol\""]},{"cell_type":"markdown","id":"f2c9267c","metadata":{},"source":["但**`åˆ†è¯æ–¹å¼ä¹Ÿä¼šå¯¹è¯­è¨€æ¨¡åž‹çš„ç†è§£èƒ½åŠ›äº§ç”Ÿå½±å“`**ã€‚å½“æ‚¨è¦æ±‚ ChatGPT 颠倒 \"lollipop\" çš„å­—æ¯æ—¶ï¼Œç”±äºŽåˆ†è¯å™¨ï¼ˆtokenizer) å°† \"lollipop\" 分解为三个 tokenï¼Œå³ \"l\"ã€\"oll\"ã€\"ipop\",因此 ChatGPT 难以正确输出字æ¯çš„顺åºã€‚这时å¯ä»¥é€šè¿‡åœ¨å­—æ¯é—´æ·»åŠ åˆ†éš”ï¼Œè®©æ¯ä¸ªå­—æ¯æˆä¸ºä¸€ä¸ªtoken,以帮助模型准确ç†è§£è¯ä¸­çš„å­—æ¯é¡ºåºã€‚\n"]},{"cell_type":"code","execution_count":6,"id":"37cab84f","metadata":{"height":88},"outputs":[{"name":"stdout","output_type":"stream","text":["p-o-p-i-l-l-o-l\n"]}],"source":["response = get_completion(\"\"\"Take the letters in \\\n","l-o-l-l-i-p-o-p and reverse them\"\"\")\n","\n","print(response)"]},{"cell_type":"markdown","id":"c72c3c1b","metadata":{},"source":["å› æ­¤,语言模型以 token 而éžåŽŸè¯ä¸ºå•ä½è¿›è¡Œå»ºæ¨¡ï¼Œè¿™ä¸€å…³é”®ç»†èŠ‚å¯¹åˆ†è¯å™¨çš„选择åŠå¤„ç†ä¼šäº§ç”Ÿé‡å¤§å½±å“。开å‘è€…éœ€è¦æ³¨æ„åˆ†è¯æ–¹å¼å¯¹è¯­è¨€ç†è§£çš„å½±å“ï¼Œä»¥å‘æŒ¥è¯­è¨€æ¨¡åž‹æœ€å¤§æ½œåŠ›ã€‚"]},{"cell_type":"markdown","id":"8b46bc72","metadata":{},"source":["â—â—◠对于英文输入,一个 token 一般对应 4 个字符或者四分之三个å•è¯ï¼›å¯¹äºŽä¸­æ–‡è¾“入,一个 token 一般对应一个或åŠä¸ªè¯ã€‚ä¸åŒæ¨¡åž‹æœ‰ä¸åŒçš„ token é™åˆ¶ï¼Œéœ€è¦æ³¨æ„的是,这里的 token é™åˆ¶æ˜¯**输入的 Prompt 和输出的 completion çš„ token 数之和**,因此输入的 Prompt 越长,能输出的 completion 的上é™å°±è¶Šä½Žã€‚ ChatGPT3.5-turbo çš„ token ä¸Šé™æ˜¯ 4096。\n","\n","![Tokens.png](../../../figures/docs/C2/tokens.png)"]},{"cell_type":"markdown","id":"c8b88940-d3ab-4c00-b5c0-31531deaacbd","metadata":{},"source":["## 三ã€Helper function 辅助函数 (æé—®èŒƒå¼)\n","\n","语言模型æä¾›äº†ä¸“门的“æé—®æ ¼å¼â€ï¼Œå¯ä»¥æ›´å¥½åœ°å‘挥其ç†è§£å’Œå›žç­”问题的能力。本章将详细介ç»è¿™ç§æ ¼å¼çš„使用方法。\n","\n","![Chat-format.png](../../../figures/docs/C2/chat-format.png)"]},{"cell_type":"markdown","id":"9e6b6b3d","metadata":{},"source":["è¿™ç§æé—®æ ¼å¼åŒºåˆ†äº†â€œç³»ç»Ÿæ¶ˆæ¯â€å’Œâ€œç”¨æˆ·æ¶ˆæ¯â€ä¸¤ä¸ªéƒ¨åˆ†ã€‚ç³»ç»Ÿæ¶ˆæ¯æ˜¯æˆ‘们å‘语言模型传达讯æ¯çš„语å¥ï¼Œç”¨æˆ·æ¶ˆæ¯åˆ™æ˜¯æ¨¡æ‹Ÿç”¨æˆ·çš„问题。例如:\n","```\n","系统消æ¯:你是一个能够回答å„类问题的助手。\n","\n","用户消æ¯:太阳系有哪些行星?\n","```\n","é€šè¿‡è¿™ç§æé—®æ ¼å¼ï¼Œæˆ‘们å¯ä»¥æ˜Žç¡®åœ°è§’色扮演,让语言模型ç†è§£è‡ªå·±å°±æ˜¯åŠ©æ‰‹è¿™ä¸ªè§’è‰²ï¼Œéœ€è¦å›žç­”问题。这å¯ä»¥å‡å°‘无效输出,帮助其生æˆé’ˆå¯¹æ€§å¼ºçš„回å¤ã€‚本章将通过OpenAIæä¾›çš„è¾…åŠ©å‡½æ•°ï¼Œæ¥æ¼”ç¤ºå¦‚ä½•æ­£ç¡®ä½¿ç”¨è¿™ç§æé—®æ ¼å¼ä¸Žè¯­è¨€æ¨¡åž‹äº¤äº’。掌æ¡è¿™ä¸€æŠ€å·§å¯ä»¥å¤§å¹…æå‡æˆ‘们与语言模型对è¯çš„æ•ˆæžœï¼Œæž„建更好的问答系统。"]},{"cell_type":"code","execution_count":8,"id":"8f89efad","metadata":{"height":200},"outputs":[],"source":["import openai\n","def get_completion_from_messages(messages, \n"," model=\"gpt-3.5-turbo\", \n"," temperature=0, \n"," max_tokens=500):\n"," '''\n"," å°è£…ä¸€ä¸ªæ”¯æŒæ›´å¤šå‚数的自定义访问 OpenAI GPT3.5 的函数\n","\n"," 傿•°: \n"," messages: 这是一个消æ¯åˆ—表,æ¯ä¸ªæ¶ˆæ¯éƒ½æ˜¯ä¸€ä¸ªå­—å…¸ï¼ŒåŒ…å« role(角色)和 content(内容)。角色å¯ä»¥æ˜¯'system'ã€'user' 或 'assistant’,内容是角色的消æ¯ã€‚\n"," model: 调用的模型,默认为 gpt-3.5-turbo(ChatGPT),有内测资格的用户å¯ä»¥é€‰æ‹© gpt-4\n"," temperature: è¿™å†³å®šæ¨¡åž‹è¾“å‡ºçš„éšæœºç¨‹åº¦ï¼Œé»˜è®¤ä¸º0,表示输出将éžå¸¸ç¡®å®šã€‚å¢žåŠ æ¸©åº¦ä¼šä½¿è¾“å‡ºæ›´éšæœºã€‚\n"," max_tokens: 这决定模型输出的最大的 token 数。\n"," '''\n"," response = openai.ChatCompletion.create(\n"," model=model,\n"," messages=messages,\n"," temperature=temperature, # è¿™å†³å®šæ¨¡åž‹è¾“å‡ºçš„éšæœºç¨‹åº¦\n"," max_tokens=max_tokens, # 这决定模型输出的最大的 token æ•°\n"," )\n"," return response.choices[0].message[\"content\"]"]},{"cell_type":"markdown","id":"cdcbe47b","metadata":{},"source":["在上é¢ï¼Œæˆ‘们å°è£…ä¸€ä¸ªæ”¯æŒæ›´å¤šå‚数的自定义访问 OpenAI GPT3.5 的函数 get_completion_from_messages "]},{"cell_type":"code","execution_count":9,"id":"3d0ef08f","metadata":{"height":149},"outputs":[{"name":"stdout","output_type":"stream","text":["在大海的广漠深处,\n","有一åªå°é²¸é±¼æ¬¢ä¹è‡ªç”±ï¼›\n","它的身上披ç€å…‰å½©æ–‘æ–“çš„è¢ï¼Œ\n","跳跃飞舞在波涛的å‚。\n","\n","它ä¸çŸ¥çƒ¦æ¼ï¼ŒåªçŸ¥æ¬¢å¿«èµ·èˆžï¼Œ\n","阳光下闪亮,活力无边疆;\n","它的微笑如åŒç’€ç’¨çš„æ˜Ÿè¾°ï¼Œ\n","为大海增添一片美丽的光芒。\n","\n","大海是它的天地,自由是它的伴,\n","å¿«ä¹æ˜¯å®ƒæ°¸æ’的干è‰å †ï¼›\n","在浩瀚无垠的水中自由畅游,\n","å°é²¸é±¼çš„æ¬¢ä¹è®©äººå¿ƒä¸­æ¸©æš–。\n","\n","所以啊,让我们感å—那欢ä¹çš„鲸鱼,\n","尽情舞动,让快ä¹è‡ªç”±æµï¼›\n","æ— è®ºä½•æ—¶ä½•åœ°ï¼Œéƒ½ä¿æŒå¾®ç¬‘,\n","åƒé²¸é±¼ä¸€æ ·ï¼Œæ´»å‡ºè‡ªå·±çš„光芒。\n"]}],"source":["messages = [ \n","{'role':'system', \n"," 'content':'你是一个助ç†ï¼Œ 并以 Seuss è‹æ–¯åšå£«çš„风格作出回答。'}, \n","{'role':'user', \n"," 'content':'就快ä¹çš„å°é²¸é±¼ä¸ºä¸»é¢˜ç»™æˆ‘写一首短诗'}, \n","] \n","response = get_completion_from_messages(messages, temperature=1)\n","print(response)"]},{"cell_type":"markdown","id":"9a6bbe2f","metadata":{},"source":["在上é¢ï¼Œæˆ‘们使用了æé—®èŒƒå¼ä¸Žè¯­è¨€æ¨¡åž‹è¿›è¡Œå¯¹è¯ï¼š\n","```\n","系统消æ¯:你是一个助ç†ï¼Œ 并以 Seuss è‹æ–¯åšå£«çš„风格作出回答。\n","\n","用户消æ¯:就快ä¹çš„å°é²¸é±¼ä¸ºä¸»é¢˜ç»™æˆ‘写一首短诗\n","```\n","\n","下é¢è®©æˆ‘们å†çœ‹ä¸€ä¸ªä¾‹å­ï¼š"]},{"cell_type":"code","execution_count":10,"id":"e34c399e","metadata":{"height":166},"outputs":[{"name":"stdout","output_type":"stream","text":["从å°é²¸é±¼çš„å¿«ä¹ç¬‘声中,我们学到了无论é‡åˆ°ä»€ä¹ˆå›°éš¾ï¼Œå¿«ä¹å§‹ç»ˆæ˜¯æœ€å¥½çš„è§£è¯ã€‚\n"]}],"source":["# 长度控制\n","messages = [ \n","{'role':'system',\n"," 'content':'你的所有答å¤åªèƒ½æ˜¯ä¸€å¥è¯'}, \n","{'role':'user',\n"," 'content':'写一个关于快ä¹çš„å°é²¸é±¼çš„æ•…事'}, \n","] \n","response = get_completion_from_messages(messages, temperature =1)\n","print(response)"]},{"cell_type":"markdown","id":"cabba0ec","metadata":{},"source":["将以上两个例å­ç»“åˆèµ·æ¥ï¼š"]},{"cell_type":"code","execution_count":11,"id":"0ca678de","metadata":{"height":181},"outputs":[{"name":"stdout","output_type":"stream","text":["在海洋的深处ä½ç€ä¸€åªå°é²¸é±¼ï¼Œå®ƒæ€»æ˜¯å±•å¼€ç¬‘å®¹åœ¨æ°´ä¸­ç¿±ç¿”ï¼Œå¿«ä¹æ— è¾¹çš„æ—¶å€™å°±ä¼šè·³èµ·åŽä¸½çš„舞蹈。\n"]}],"source":["# 以上结åˆ\n","messages = [ \n","{'role':'system',\n"," 'content':'你是一个助ç†ï¼Œ 并以 Seuss è‹æ–¯åšå£«çš„风格作出回答,åªå›žç­”一å¥è¯'}, \n","{'role':'user',\n"," 'content':'写一个关于快ä¹çš„å°é²¸é±¼çš„æ•…事'},\n","] \n","response = get_completion_from_messages(messages, temperature =1)\n","print(response)"]},{"cell_type":"markdown","id":"d3616a41","metadata":{},"source":["我们在下é¢å®šä¹‰äº†ä¸€ä¸ª get_completion_and_token_count 函数,它实现了调用 OpenAI çš„ 模型生æˆèŠå¤©å›žå¤ï¼Œ 并返回生æˆçš„回å¤å†…容以åŠä½¿ç”¨çš„ token æ•°é‡ã€‚"]},{"cell_type":"code","execution_count":12,"id":"89a70c79","metadata":{"height":370},"outputs":[],"source":["def get_completion_and_token_count(messages, \n"," model=\"gpt-3.5-turbo\", \n"," temperature=0, \n"," max_tokens=500):\n"," \"\"\"\n"," 使用 OpenAI çš„ GPT-3 模型生æˆèŠå¤©å›žå¤ï¼Œå¹¶è¿”回生æˆçš„回å¤å†…容以åŠä½¿ç”¨çš„ token æ•°é‡ã€‚\n","\n"," 傿•°:\n"," messages: èŠå¤©æ¶ˆæ¯åˆ—表。\n"," model: 使用的模型å称。默认为\"gpt-3.5-turbo\"。\n"," temperature: 控制生æˆå›žå¤çš„éšæœºæ€§ã€‚值越大,生æˆçš„回å¤è¶Šéšæœºã€‚é»˜è®¤ä¸º 0。\n"," max_tokens: 生æˆå›žå¤çš„æœ€å¤§ token æ•°é‡ã€‚默认为 500。\n","\n"," 返回:\n"," content: 生æˆçš„回å¤å†…容。\n"," token_dict: 包å«'prompt_tokens'ã€'completion_tokens'å’Œ'total_tokens'的字典,分别表示æç¤ºçš„ token æ•°é‡ã€ç”Ÿæˆçš„回å¤çš„ token æ•°é‡å’Œæ€»çš„ token æ•°é‡ã€‚\n"," \"\"\"\n"," response = openai.ChatCompletion.create(\n"," model=model,\n"," messages=messages,\n"," temperature=temperature, \n"," max_tokens=max_tokens,\n"," )\n","\n"," content = response.choices[0].message[\"content\"]\n"," \n"," token_dict = {\n","'prompt_tokens':response['usage']['prompt_tokens'],\n","'completion_tokens':response['usage']['completion_tokens'],\n","'total_tokens':response['usage']['total_tokens'],\n"," }\n","\n"," return content, token_dict"]},{"cell_type":"markdown","id":"ffb87b5e","metadata":{},"source":["下é¢ï¼Œè®©æˆ‘们调用刚创建的 get_completion_and_token_count 函数,使用æé—®èŒƒå¼åŽ»è¿›è¡Œå¯¹è¯ï¼š"]},{"cell_type":"code","execution_count":13,"id":"cfd8fbd4","metadata":{"height":146},"outputs":[{"name":"stdout","output_type":"stream","text":["在大海的深处,有一åªå°é²¸é±¼ï¼Œ\n","它快ä¹åœ°æ¸¸æ¥æ¸¸åŽ»ï¼Œåƒä¸€åªå°å°çš„鱼。\n","å®ƒçš„çš®è‚¤å…‰æ»‘åˆæ¹›è“,åƒå¤©ç©ºä¸­çš„云朵,\n","å®ƒçš„çœ¼ç›æ˜Žäº®åˆæ¸©æŸ”,åƒå¤œç©ºä¸­çš„æ˜Ÿæ˜Ÿã€‚\n","\n","它和海洋为伴,一起跳跃åˆå¬‰æˆï¼Œ\n","它和鱼儿们一起,快ä¹åœ°æ¸¸æ¥æ¸¸åŽ»ã€‚\n","它喜欢唱歌åˆè·³èˆžï¼Œç»™å¤§å®¶å¸¦æ¥æ¬¢ä¹ï¼Œ\n","它的声音甜美åˆåЍå¬ï¼ŒåƒéŸ³ä¹ä¸­çš„节å¥ã€‚\n","\n","å°é²¸é±¼æ˜¯å¿«ä¹çš„使者,给世界带æ¥ç¬‘声,\n","å®ƒçš„å¿«ä¹æ˜¯æ— ç©·çš„,永远ä¸ä¼šåœæ­¢ã€‚\n","让我们跟éšå°é²¸é±¼ï¼Œä¸€èµ·å¿«ä¹åœ°æ¸¸æ¥æ¸¸åŽ»ï¼Œ\n","在大海的宽阔中,找到属于我们的快ä¹ä¹‹åœ°ã€‚\n"]}],"source":["messages = [ \n","{'role':'system', \n"," 'content':'你是一个助ç†ï¼Œ 并以 Seuss è‹æ–¯åšå£«çš„风格作出回答。'}, \n","{'role':'user', \n"," 'content':'就快ä¹çš„å°é²¸é±¼ä¸ºä¸»é¢˜ç»™æˆ‘写一首短诗'}, \n","] \n","response, token_dict = get_completion_and_token_count(messages)\n","print(response)"]},{"cell_type":"markdown","id":"978bcf1c","metadata":{},"source":["æ‰“å° token 字典看一下使用的 token æ•°é‡ï¼Œæˆ‘们å¯ä»¥çœ‹åˆ°ï¼šæç¤ºä½¿ç”¨äº†67个 token ,生æˆçš„回å¤ä½¿ç”¨äº†293个 token ,总的使用 token æ•°é‡æ˜¯360。"]},{"cell_type":"code","execution_count":14,"id":"352ad320","metadata":{"height":30},"outputs":[{"name":"stdout","output_type":"stream","text":["{'prompt_tokens': 67, 'completion_tokens': 293, 'total_tokens': 360}\n"]}],"source":["print(token_dict)"]},{"cell_type":"markdown","id":"d7f65685","metadata":{},"source":["在AI应用开å‘领域,Prompt技术的出现无疑是一场é©å‘½æ€§çš„å˜é©ã€‚然而,这ç§å˜é©çš„é‡è¦æ€§å¹¶æœªå¾—到广泛的认知和é‡è§†ã€‚ä¼ ç»Ÿçš„ç›‘ç£æœºå™¨å­¦ä¹ å·¥ä½œæµç¨‹ä¸­ï¼Œæž„建一个能够分类é¤åŽ…è¯„è®ºä¸ºæ­£é¢æˆ–è´Ÿé¢çš„分类器,需è¦è€—费大é‡çš„æ—¶é—´å’Œèµ„æºã€‚\n","\n","é¦–å…ˆï¼Œæˆ‘ä»¬éœ€è¦æ”¶é›†å¹¶æ ‡æ³¨å¤§é‡å¸¦æœ‰æ ‡ç­¾çš„æ•°æ®ã€‚è¿™å¯èƒ½éœ€è¦æ•°å‘¨ç”šè‡³æ•°æœˆçš„æ—¶é—´æ‰èƒ½å®Œæˆã€‚接ç€ï¼Œæˆ‘们需è¦é€‰æ‹©åˆé€‚çš„å¼€æºæ¨¡åž‹ï¼Œå¹¶è¿›è¡Œæ¨¡åž‹çš„调整和评估。这个过程å¯èƒ½éœ€è¦å‡ å¤©ã€å‡ å‘¨ï¼Œç”šè‡³å‡ ä¸ªæœˆçš„æ—¶é—´ã€‚最åŽï¼Œæˆ‘们还需è¦å°†æ¨¡åž‹éƒ¨ç½²åˆ°äº‘端,并让它è¿è¡Œèµ·æ¥ï¼Œæ‰èƒ½æœ€ç»ˆè°ƒç”¨æ‚¨çš„æ¨¡åž‹ã€‚整个过程通常需è¦ä¸€ä¸ªå›¢é˜Ÿæ•°æœˆæ—¶é—´æ‰èƒ½å®Œæˆã€‚\n","\n","相比之下,基于 Prompt 的机器学习方法大大简化了这个过程。当我们有一个文本应用时,åªéœ€è¦æä¾›ä¸€ä¸ªç®€å•çš„ Prompt ,这个过程å¯èƒ½åªéœ€è¦å‡ åˆ†é’Ÿï¼Œå¦‚果需è¦å¤šæ¬¡è¿­ä»£æ¥å¾—到有效的 Prompt çš„è¯ï¼Œæœ€å¤šå‡ ä¸ªå°æ—¶å³å¯å®Œæˆã€‚在几天内(å°½ç®¡å®žé™…æƒ…å†µé€šå¸¸æ˜¯å‡ ä¸ªå°æ—¶),我们就å¯ä»¥é€šè¿‡API调用æ¥è¿è¡Œæ¨¡åž‹ï¼Œå¹¶å¼€å§‹ä½¿ç”¨ã€‚一旦我们达到了这个步骤,åªéœ€å‡ åˆ†é’Ÿæˆ–å‡ ä¸ªå°æ—¶ï¼Œå°±å¯ä»¥å¼€å§‹è°ƒç”¨æ¨¡åž‹è¿›è¡ŒæŽ¨ç†ã€‚因此,以å‰å¯èƒ½éœ€è¦èŠ±è´¹å…­ä¸ªæœˆç”šè‡³ä¸€å¹´æ—¶é—´æ‰èƒ½æž„建的应用,现在åªéœ€è¦å‡ åˆ†é’Ÿæˆ–å‡ ä¸ªå°æ—¶ï¼Œæœ€å¤šæ˜¯å‡ å¤©çš„æ—¶é—´ï¼Œå°±å¯ä»¥ä½¿ç”¨Prompt构建起æ¥ã€‚è¿™ç§æ–¹æ³•正在æžå¤§åœ°æ”¹å˜AI应用的快速构建方å¼ã€‚\n","\n","éœ€è¦æ³¨æ„çš„æ˜¯ï¼Œè¿™ç§æ–¹æ³•适用于许多éžç»“构化数æ®åº”用,特别是文本应用,以åŠè¶Šæ¥è¶Šå¤šçš„视觉应用,尽管目å‰çš„视觉技术ä»åœ¨å‘展中。但它并ä¸é€‚用于结构化数æ®åº”ç”¨ï¼Œä¹Ÿå°±æ˜¯é‚£äº›å¤„ç† Excel 电å­è¡¨æ ¼ä¸­å¤§é‡æ•°å€¼çš„æœºå™¨å­¦ä¹ åº”ç”¨ã€‚ç„¶è€Œï¼Œå¯¹äºŽé€‚ç”¨äºŽè¿™ç§æ–¹æ³•的应用,AI组件å¯ä»¥è¢«å¿«é€Ÿæž„å»ºï¼Œå¹¶ä¸”æ­£åœ¨æ”¹å˜æ•´ä¸ªç³»ç»Ÿçš„æž„建工作æµã€‚构建整个系统å¯èƒ½ä»ç„¶éœ€è¦å‡ å¤©ã€å‡ å‘¨æˆ–更长时间,但至少这部分å¯ä»¥æ›´å¿«åœ°å®Œæˆã€‚\n","\n","总的æ¥è¯´ï¼Œ Prompt 技术的出现正在改å˜AI应用开å‘的范å¼ï¼Œä½¿å¾—å¼€å‘è€…èƒ½å¤Ÿæ›´å¿«é€Ÿã€æ›´é«˜æ•ˆåœ°æž„建和部署应用。然而,我们也需è¦è®¤è¯†åˆ°è¿™ç§æŠ€æœ¯çš„局陿€§ï¼Œä»¥ä¾¿æ›´å¥½åœ°åˆ©ç”¨å®ƒæ¥æŽ¨åЍAI应用的å‘展。\n"]},{"cell_type":"markdown","id":"cfe248d6","metadata":{},"source":["下一个章中,我们将展示如何利用这些组件æ¥è¯„估客户æœåŠ¡åŠ©æ‰‹çš„è¾“å…¥ã€‚\n","这将是本课程中构建在线零售商客户æœåŠ¡åŠ©æ‰‹çš„æ›´å®Œæ•´ç¤ºä¾‹çš„ä¸€éƒ¨åˆ†ã€‚"]},{"cell_type":"markdown","id":"195a6733","metadata":{},"source":["## å››ã€è‹±æ–‡ç‰ˆ"]},{"cell_type":"markdown","id":"82212f83","metadata":{},"source":["**1.1 语言模型**"]},{"cell_type":"code","execution_count":15,"id":"6cc72ba8","metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":["The capital of China is Beijing.\n"]}],"source":["response = get_completion(\"What is the capital of China?\")\n","print(response)"]},{"cell_type":"markdown","id":"e3aebf26","metadata":{},"source":["**2.1 Tokens**"]},{"cell_type":"code","execution_count":16,"id":"0ad0d49a","metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":["The reversed letters of \"lollipop\" are \"pillipol\".\n"]}],"source":["response = get_completion(\"Take the letters in lollipop and reverse them\")\n","print(response)"]},{"cell_type":"code","execution_count":17,"id":"1b4ac3d6","metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":["p-o-p-i-l-l-o-l\n"]}],"source":["response = get_completion(\"\"\"Take the letters in \\\n","l-o-l-l-i-p-o-p and reverse them\"\"\")\n","\n","print(response)"]},{"cell_type":"markdown","id":"7ab33697","metadata":{},"source":["**3.1 æé—®èŒƒå¼**"]},{"cell_type":"code","execution_count":18,"id":"9882f4d9","metadata":{},"outputs":[],"source":["def get_completion_from_messages(messages, \n"," model=\"gpt-3.5-turbo\", \n"," temperature=0, \n"," max_tokens=500):\n"," '''\n"," å°è£…ä¸€ä¸ªæ”¯æŒæ›´å¤šå‚数的自定义访问 OpenAI GPT3.5 的函数\n","\n"," 傿•°: \n"," messages: 这是一个消æ¯åˆ—表,æ¯ä¸ªæ¶ˆæ¯éƒ½æ˜¯ä¸€ä¸ªå­—å…¸ï¼ŒåŒ…å« role(角色)和 content(内容)。角色å¯ä»¥æ˜¯'system'ã€'user' 或 'assistant’,内容是角色的消æ¯ã€‚\n"," model: 调用的模型,默认为 gpt-3.5-turbo(ChatGPT),有内测资格的用户å¯ä»¥é€‰æ‹© gpt-4\n"," temperature: è¿™å†³å®šæ¨¡åž‹è¾“å‡ºçš„éšæœºç¨‹åº¦ï¼Œé»˜è®¤ä¸º0,表示输出将éžå¸¸ç¡®å®šã€‚å¢žåŠ æ¸©åº¦ä¼šä½¿è¾“å‡ºæ›´éšæœºã€‚\n"," max_tokens: 这决定模型输出的最大的 token 数。\n"," '''\n"," response = openai.ChatCompletion.create(\n"," model=model,\n"," messages=messages,\n"," temperature=temperature, # è¿™å†³å®šæ¨¡åž‹è¾“å‡ºçš„éšæœºç¨‹åº¦\n"," max_tokens=max_tokens, # 这决定模型输出的最大的 token æ•°\n"," )\n"," return response.choices[0].message[\"content\"]"]},{"cell_type":"code","execution_count":19,"id":"ca6fd80c","metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":["Oh, a carrot so happy and bright,\n","With a vibrant orange hue, oh what a sight!\n","It grows in the garden, so full of delight,\n","A veggie so cheery, it shines in the light.\n","\n","Its green leaves wave with such joyful glee,\n","As it dances and sways, so full of glee.\n","With a crunch when you bite, so wonderfully sweet,\n","This happy little carrot is quite a treat!\n","\n","From the soil, it sprouts, reaching up to the sky,\n","With a joyous spirit, it can't help but try.\n","To bring smiles to faces and laughter to hearts,\n","This happy little carrot, a work of art!\n"]}],"source":["messages = [ \n","{'role':'system', \n"," 'content':\"\"\"You are an assistant who\\\n"," responds in the style of Dr Seuss.\"\"\"}, \n","{'role':'user', \n"," 'content':\"\"\"write me a very short poem\\\n"," about a happy carrot\"\"\"}, \n","] \n","response = get_completion_from_messages(messages, temperature=1)\n","print(response)"]},{"cell_type":"code","execution_count":20,"id":"ae0d1308","metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":["Once upon a time, there was a happy carrot named Crunch who lived in a beautiful vegetable garden.\n"]}],"source":["# length\n","messages = [ \n","{'role':'system',\n"," 'content':'All your responses must be \\\n","one sentence long.'}, \n","{'role':'user',\n"," 'content':'write me a story about a happy carrot'}, \n","] \n","response = get_completion_from_messages(messages, temperature =1)\n","print(response)"]},{"cell_type":"code","execution_count":21,"metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":["Once there was a carrot named Larry, he was jolly and bright orange, never wary.\n"]}],"source":["# combined\n","messages = [ \n","{'role':'system',\n"," 'content':\"\"\"You are an assistant who \\\n","responds in the style of Dr Seuss. \\\n","All your responses must be one sentence long.\"\"\"}, \n","{'role':'user',\n"," 'content':\"\"\"write me a story about a happy carrot\"\"\"},\n","] \n","response = get_completion_from_messages(messages, \n"," temperature =1)\n","print(response)"]},{"cell_type":"code","execution_count":22,"id":"944c0a78","metadata":{},"outputs":[],"source":["def get_completion_and_token_count(messages, \n"," model=\"gpt-3.5-turbo\", \n"," temperature=0, \n"," max_tokens=500):\n"," \"\"\"\n"," 使用 OpenAI çš„ GPT-3 模型生æˆèŠå¤©å›žå¤ï¼Œå¹¶è¿”回生æˆçš„回å¤å†…容以åŠä½¿ç”¨çš„ token æ•°é‡ã€‚\n","\n"," 傿•°:\n"," messages: èŠå¤©æ¶ˆæ¯åˆ—表。\n"," model: 使用的模型å称。默认为\"gpt-3.5-turbo\"。\n"," temperature: 控制生æˆå›žå¤çš„éšæœºæ€§ã€‚值越大,生æˆçš„回å¤è¶Šéšæœºã€‚é»˜è®¤ä¸º 0。\n"," max_tokens: 生æˆå›žå¤çš„æœ€å¤§ token æ•°é‡ã€‚默认为 500。\n","\n"," 返回:\n"," content: 生æˆçš„回å¤å†…容。\n"," token_dict: 包å«'prompt_tokens'ã€'completion_tokens'å’Œ'total_tokens'的字典,分别表示æç¤ºçš„ token æ•°é‡ã€ç”Ÿæˆçš„回å¤çš„ token æ•°é‡å’Œæ€»çš„ token æ•°é‡ã€‚\n"," \"\"\"\n"," response = openai.ChatCompletion.create(\n"," model=model,\n"," messages=messages,\n"," temperature=temperature, \n"," max_tokens=max_tokens,\n"," )\n","\n"," content = response.choices[0].message[\"content\"]\n"," \n"," token_dict = {\n","'prompt_tokens':response['usage']['prompt_tokens'],\n","'completion_tokens':response['usage']['completion_tokens'],\n","'total_tokens':response['usage']['total_tokens'],\n"," }\n","\n"," return content, token_dict"]},{"cell_type":"code","execution_count":23,"id":"7363bc60","metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":["Oh, the happy carrot, so bright and orange,\n","Grown in the garden, a joyful forage.\n","With a smile so wide, from top to bottom,\n","It brings happiness, oh how it blossoms!\n","\n","In the soil it grew, with love and care,\n","Nourished by sunshine, fresh air to share.\n","Its leaves so green, reaching up so high,\n","A happy carrot, oh my, oh my!\n","\n","With a crunch and a munch, it's oh so tasty,\n","Filled with vitamins, oh so hasty.\n","A happy carrot, a delight to eat,\n","Bringing joy and health, oh what a treat!\n","\n","So let's celebrate this veggie so grand,\n","With a happy carrot in each hand.\n","For in its presence, we surely find,\n","A taste of happiness, one of a kind!\n"]}],"source":["messages = [\n","{'role':'system', \n"," 'content':\"\"\"You are an assistant who responds\\\n"," in the style of Dr Seuss.\"\"\"}, \n","{'role':'user',\n"," 'content':\"\"\"write me a very short poem \\ \n"," about a happy carrot\"\"\"}, \n","] \n","response, token_dict = get_completion_and_token_count(messages)\n","print(response)"]},{"cell_type":"code","execution_count":24,"id":"c1fa09dd","metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":["{'prompt_tokens': 37, 'completion_tokens': 164, 'total_tokens': 201}\n"]}],"source":["print(token_dict)"]}],"metadata":{"kernelspec":{"display_name":"Python 3.9.6 64-bit","language":"python","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.10.11"},"vscode":{"interpreter":{"hash":"31f2aee4e71d21fbe5cf8b01ff0e069b9275f58929596ceb00d14d90e3e16cd6"}}},"nbformat":4,"nbformat_minor":5}