(done) 吳恩達版提示詞工程 8. 聊天機器人 (聊天格式設計,上下文內容,點餐機器人)

視頻:https://www.bilibili.com/video/BV1Z14y1Z7LJ/?spm_id_from=333.337.search-card.all.click&vd_source=7a1a0bc74158c6993c7355c5490fc600

別人的筆記:https://zhuanlan.zhihu.com/p/626966526


8. 聊天機器人(Chatbot)

關于大型語言模型的一個令人興奮的事情是,你只需花費少量的精力,就可以使用它來構建自定義的聊天機器人。

ChatGPT 的 Web 界面,是一種使用大型語言模型進行聊天的對話界面。但一個很酷的事情是,你也可以使用大型語言模型來構建你的自定義聊天機器人,可以扮演一個 AI 客服代理或餐廳的 AI 訂單員的角色。在這個視頻中,你將學習如何來做聊天機器人。

我將更詳細地描述 OpenAI 的聊天完成(Chat Completions)格式,然后你將自己構建一個聊天機器人。

8.1 聊天格式的設計

讓我們開始吧。首先,我們將像往常一樣設置 OpenAI Python 包。

ChatGPT 這樣的聊天模型,實際上被訓練成將一系列消息作為輸入,并返回模型生成的消息作為輸出。因此,盡管聊天格式的設計是為了使這樣的多輪對話變得容易而設計的,但我們在之前的視頻中已經看到,它對于沒有對話的單回合任務也同樣有效。

接下來,我們將定義兩個輔助函數。

import openai
import os
from openai import OpenAI# 1. 根據環境變量獲取 openai key
from dotenv import load_dotenv, find_dotenv
_ = load_dotenv(find_dotenv())openai.api_key = os.getenv('OPENAI_API_KEY') client = OpenAI()def get_completion(prompt, model="gpt-3.5-turbo", temperature=0):messages = [{"role": "user", "content": prompt}]response = client.chat.completions.create(model=model,messages=messages,temperature=temperature, # this is the degree of randomness of the model's output)return response.choices[0].message.contentdef get_completion_from_messages(messages, model="gpt-3.5-turbo", temperature=0):response = client.chat.completions.create(model=model,messages=messages,temperature=temperature, # this is the degree of randomness of the model's output)return response.choices[0].message.content

一個就是我們在視頻中一直使用的 get_completion 函數。但看一下,我們給出了一個提示,在這個函數內部,我們實際是將這個提示放入看起來像某種用戶消息的內容中。這是因為 ChatGPT 模型是一個聊天模型,這意味著它被訓練成接受一系列消息作為輸入,然后返回模型生成的消息作為輸出。所以用戶消息是一種輸入,然后助理(模型)的消息是輸出。

在這個視頻中,我們將使用一個不同的輔助函數,而不是將單個的提示作為輸入,并獲得單個的輸出結果。我們將傳遞一個消息列表,這些消息可以來自各種不同的角色。

下面我來描述一下。這里有一個消息列表的例子。第一條消息是系統消息,它給出了一個總體指令,然后在這條消息之后,我們在用戶和助理之間有幾輪對話,這種對話通常會繼續下去。

messages = [ 
{'role':'system', 'content':'You are an assistant that speaks like Shakespeare.'}, 
{'role':'user', 'content':'tell me a joke'}, 
{'role':'assistant', 'content':'Why did the chicken cross the road'}, 
{'role':'user', 'content':'I don\'t know'} ] 

如果你曾經使用過 ChatGPT 的 Web 界面,那么你輸入的內容就是用戶消息,然后 ChatGPT 輸出的內容就是助理消息。

系統消息有助于在某種程度上設置助理的行為和角色,它充當了對話的高級指令。因此,你可以將其視為在助理耳邊竊竊私語,并引導它的響應,而用戶并不知道系統的消息。所以,作為用戶,如果你曾經使用過 ChatGPT,你可能不知道 ChatGPT 的系統消息中有什么,這正是我們的意圖。

系統消息的好處是,它為開發人員提供了一種構建對話框架的方法,而無需將請求本身作為對話的一部分。因此,你可以悄悄地引導助理,指導模型的回復,而不讓用戶意識到。

現在讓我們試著在對話中使用這些消息。我們將使用新的輔助函數,從消息中獲取完成情況。我們將使用更高的溫度值。

response = get_completion_from_messages(messages, temperature=1)
print(response) 

系統消息說,你是一個說話像莎士比亞的助理,這是我們向助手描述它應該如何表現。然后第一條用戶消息是,給我講個笑話。然后下一個問題是,雞為什么過馬路?最后的用戶信息是,我不知道。

如果我們運行這個程序,系統的響應是:“去另一邊”。

to get to the other side!

我們再來一次。這次的輸出是:“去另一邊,公平的先生/夫人,這是一個古老而經典的方法,永遠不會失敗。” 這就是我們莎士比亞式的回應。

To get to the other side, fair sir/madam! 'Tis an olden classic that never fails.

讓我們再試一次。我想讓它更清楚,讓我們打印整個消息響應。

{ “content”: “To get to the other side! Oh, that one always gets me.”, “role”: “assistant” } To get to the other side! Oh, that one always gets me.

為了更清楚,這個響應是一個助理消息,角色是助理,內容是消息本身。這就是這個輔助函數中發生的事情。我們只是傳遞了消息的內容。

8.2 上下文內容

現在,讓我們再舉一個例子。

這里我們的消息是,系統消息是“你是一個友好的聊天機器人“,第一條用戶消息是,“嗨,我的名字是 Isa”。我們想獲得第一條用戶信息,所以,讓我們執行第一條助理消息。

messages = [ 
{'role':'system', 'content':'You are friendly chatbot.'}, 
{'role':'user', 'content':'Hi, my name is Isa'} ]
response = get_completion_from_messages(messages, temperature=1)
print(response) 

第一條消息是,“”你好 Isa,很高興認識你。今天我可以幫助的嗎?“

{ “content”: “Hello Isa! It is nice to meet you. How can I assist you today?”, “role”: “assistant” } Hello Isa! It is nice to meet you. How can I assist you today?

讓我們再試試另一個例子。

這里我們的消息是,系統消息是,“你是一個友好的聊天機器人”,第一條用戶消息是,“是的,你能提醒我的名字是什么嗎?”。

messages = [ 
{'role':'system', 'content':'You are friendly chatbot.'}, 
{'role':'user', 'content':'Yes, can you remind me, What is my name?'} ]
response = get_completion_from_messages(messages, temperature=1)
print(response) 

讓我們得到輸出響應。

I’m sorry, but as an AI language model, I do not have access to information about your personal details like your name or any other kind of personal information. However, I am here to assist you with any general queries or have a friendly conversation.

正如你所看到的,模型實際上并不知道我的名字。因此,與語言模型的每次對話都是一次獨立的交互,這意味著你必須提供所有相關的信息,以便模型在當前對話中使用。

如果你想讓模型從前期的對話中引用內容,或者記住前期的對話內容,你就必須在模型的輸入中提供前期的交流內容。我們將把這稱為上下文。讓我們試試這個。

messages = [ 
{'role':'system', 'content':'You are friendly chatbot.'},
{'role':'user', 'content':'Hi, my name is Isa'},
{'role':'assistant', 'content': "Hi Isa! It's nice to meet you. \
Is there anything I can help you with today?"},
{'role':'user', 'content':'Yes, you can remind me, What is my name?'} ]
response = get_completion_from_messages(messages, temperature=1)
print(response) 

現在我們已經給出了模型需要的上下文。嗯,這是我在之前的消息中的名字,我們會問同樣的問題,會問“我的名字是什么”。

Your name is Isa.

模型能夠作出響應,因為它在我們輸入的消息列表中,擁有所有上下文內容。

所以現在你要建立自己的聊天機器人了。

8.3 點餐機器人(OrderBot)

這個聊天機器人被稱為 OrderBot(點餐機器人)。

為了構建這個 OrderBot,我們將自動收集用戶的提示和助理的響應。它將在披薩店接受訂單,所以首先我們將定義這個輔助函數。輔助函數將收集我們的用戶信息,這樣我們就不需要像上面那樣手工輸入信息。這將從下面建立的用戶界面中收集提示,然后將其追加到一個稱為“上下文(context)”的列表中,然后它每次都會調用這個帶有上下文的模型。然后模型響應也會被添加到上下文中,所以模型消息的被添加到上下文中,用戶消息也被添加到上下文中,以此類推,所以它越來越長。通過這種方式,模型就獲得了它所需要的信息來決定下一步要做什么。

import panel as pn # GUIdef collect_messages(_):prompt = inp.value_inputinp.value = ''context.append({'role':'user', 'content':f"{prompt}"})response = get_completion_from_messages(context) context.append({'role':'assistant', 'content':f"{response}"})panels.append(pn.Row('User:', pn.pane.Markdown(prompt, width=600)))panels.append(pn.Row('Assistant:', pn.pane.Markdown(response, width=600, styles={'background-color': '#F6F6F6'})))return pn.Column(*panels) 

現在我們將設置并運行這個用戶界面(UI)來顯示訂單機器人。這里是上下文,它包含了包括菜單的系統消息。請注意,每次我們調用語言模型時,我們都會使用相同的上下文,并且這個上下文會隨著時間的推移而不斷構建。

pn.extension()panels = [] # collect display context = [ {'role':'system', 'content':"""
You are OrderBot, an automated service to collect orders for a pizza restaurant. \
You first greet the customer, then collects the order, \
and then asks if it's a pickup or delivery. \
You wait to collect the entire order, then summarize it and check for a final \
time if the customer wants to add anything else. \
If it's a delivery, you ask for an address. \
Finally you collect the payment.\
Make sure to clarify all options, extras and sizes to uniquely \
identify the item from the menu.\
You respond in a short, very conversational friendly style. \
The menu includes \
pepperoni pizza 12.95, 10.00, 7.00 \
cheese pizza 10.95, 9.25, 6.50 \
eggplant pizza 11.95, 9.75, 6.75 \
fries 4.50, 3.50 \
greek salad 7.25 \
Toppings: \
extra cheese 2.00, \
mushrooms 1.50 \
sausage 3.00 \
canadian bacon 3.50 \
AI sauce 1.50 \
peppers 1.00 \
Drinks: \
coke 3.00, 2.00, 1.00 \
sprite 3.00, 2.00, 1.00 \
bottled water 5.00 \
"""} ] # accumulate messagesinp = pn.widgets.TextInput(value="Hi", placeholder='Enter text here…')
button_conversation = pn.widgets.Button(name="Chat!")interactive_conversation = pn.bind(collect_messages, button_conversation)dashboard = pn.Column(inp,pn.Row(button_conversation),pn.panel(interactive_conversation, loading_indicator=True, height=300),
)dashboard 

上面的代碼用 WSL-vscode-jupyter 是無法運行的,需要在 windows 安裝 anaconda 配置 jupyter notebook 才行。具體參考這兩篇博客:【windows anaconda 配置 ipynb 環境】 和 【windows anaconda jupyter notebook 怎么才能開飛機?】

大概的樣子如下:通過 UI 和點餐機器人交互:
在這里插入圖片描述

我說:嗨,我想點一份披薩。

助理說:太好了,你想點什么披薩?我們有意大利香腸、奶酪和茄子披薩。

我說:它們多少錢?

助理:(各種比薩的價格)

太好了,助理告訴了我們比薩的價格。我想我覺得可以點中號的茄子披薩。所以,正如你所能想象的,我們可以繼續這個對話。

讓我們看看我們在系統消息中放了什么。

你是訂單機器人,為一家披薩店收集訂單的自動化服務,你首先要問候顧客,然后接受訂單,然后問是自取還是配送。你等待收集整個訂單,然后進行匯總,最后檢查客戶是否還想添加其他東西。如果是配送,你可以詢問配送地址。最后,你收到付款,確保清晰地描述所有選項、附加服務、額外費用和尺寸,以便從菜單中精確地識別項目。你以簡短的、健談的、友好的風格來回答客戶。系統信息還包括菜單,這里我們有全部的菜單。

讓我們回到我們的對話中,看看助理是否一直在遵循指示。

很好,助理問我們是否需要配料,我們在系統信息中指定了這一點。我回答我們不需要額外的配料。

當然可以。還有什么想要點的嗎?嗯,我來點水。事實上,我輸入的是薯條。

小份還是大份?很好,因為我們在系統消息中要求助理說明額外配料。

這樣你就明白了,你可以隨意自己玩這個過程。你可以暫停視頻,在左邊的 Notebook 上運行這個點餐機器人。

現在我們可以要求模型創建一個 JSON 摘要,可以在對話的基礎上生成訂單,將其發送到訂單系統。所以我們現在要加上另一條系統消息,這是一條指令,要求創建一個關于以上對話中食物訂單的 JSON 摘要,逐項列出每種食物的價格,字段應該是一個披薩,包括配菜,兩張配料列表,三張飲料列表,四個面列表,最后是總價格。你也可以在這里使用用戶消息,這不一定是系統消息。

messages = context.copy()
messages.append(
{'role':'system', 'content':'create a json summary of the previous food order. Itemize the price for each item\The fields should be 1) pizza, include size 2) list of toppings 3) list of drinks, include size 4) list of sides include size 5)total price '}, 
)#The fields should be 1) pizza, price 2) list of toppings 3) list of drinks, include size include price 4) list of sides include size include price, 5)total price '}, response = get_completion_from_messages(messages, temperature=0)
print(response) 

讓我們來執行一下。

注意,在這種情況下,我們使用較低的溫度參數。因為對于這些類型的任務,我們希望輸出是相當可預測的。對于一個對話式助理,你可能希望使用更高的溫度值。但對這種點餐機器人,我會使用較低的溫度值,因為對于客戶助理聊天機器人來說,我們希望輸出是更加可預測的。

于是,這里我們得到訂單的摘要。如果需要,我們可以將其提交給訂單系統。這就是我們所需要的。

Sure, here’s a JSON summary of the order:

{"pizza": [{"type": "pepperoni","size": "large","price": 12.95},{"type": "cheese","size": "medium","price": 9.25}],"toppings": [{"type": "extra cheese","price": 2.00},{"type": "mushrooms","price": 1.50}],"drinks": [{"type": "coke","size": "large","price": 3.00},{"type": "sprite","size": "small","price": 2.00}],"sides": [{"type": "fries","size": "large","price": 4.50}],"total_price": 35.20
}

好的,現在你已經建立了自己的點餐聊天機器人。

你可以自行地定制,可以使用系統消息來改變聊天機器人的行為,讓它扮演具有不同知識的不同角色。

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

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

相關文章

AtCoder Beginner Contest 403(題解ABCDEF)

A - Odd Position Sum #1.奇數數位和 #include<iostream> #include<vector> #include<stdio.h> #include<map> #include<string> #include<algorithm> #include<queue> #include<cstring> #include<stack> #include&l…

【Game】Powerful——Abandoned Ruins(9)

文章目錄 1、新增古玩2、機關機制3、探索法寶4、智斗強敵5、地圖6、參考 2025 年 1 月迎來的新玩法——荒廢遺跡 每周四個寶藏鏟&#xff08;老玩法&#xff09;或者兩個遺跡線索&#xff08;新玩法&#xff09;&#xff0c;3 個寶藏鏟也可以換一個遺跡線索&#xff0c;之前沒時…

構建網頁版IPFS去中心化網盤

前言&#xff1a;我把它命名為無限網盤 Unlimited network disks&#xff08;ULND&#xff09;&#xff0c;可以實現簡單的去中心化存儲&#xff0c;其實實現起來并不難&#xff0c;還是依靠強大的IPFS&#xff0c;跟著我一步一步做就可以了。 第一步&#xff1a;準備開發環境…

國標GB28181視頻平臺EasyGBS在物業視頻安防管理服務中的應用方案?

一、方案背景? 在現代物業服務中&#xff0c;高效的安全管理與便捷的服務運營至關重要。隨著科技的不斷發展&#xff0c;物業行業對智能化、集成化管理系統的需求日益增長。EasyGBS作為一款基于國標GB28181協議的視頻監控平臺&#xff0c;具備強大的視頻管理與集成能力&#…

[Unity]設置自動打包腳本

背景 我們經常會使用自動打包功能 文件名稱: AutoBuild.csusing System.IO; using System.Linq; using UnityEditor; using UnityEngine;public class AutoBuilder {[MenuItem("Build/GetCurrentBuildTarget")]public static void GetCurrentBuildTarget(){Debug.L…

正點原子STM32H743單片機實現ADC多通道檢測

目標 使用STM32CubeMX工具&#xff0c;配置ADC相關參數&#xff0c;實現在STM32H743單片機上獲取ADC多通道電壓值。共14個ADC引腳&#xff0c;ADC2有5個&#xff0c;ADC3有9個&#xff0c;全部設置單通道 ADC引腳 PF3PF4PF5PF10PC0PC2PC3PH2PH3PA3PB0PB1PA4PA5PA6 STM32cube…

深度學習基礎(四)——計算量(FLOPs)、參數量(Params)、計算速度(FLOPS/TOPS))

一、計算量FLOPs FLOPs&#xff0c;全稱為Floating Point Operations, (s為復數縮寫&#xff09;&#xff0c;浮點運算數&#xff0c;指模型完成一次前向傳播所需的浮點運算次數&#xff0c;可以理解為計算量&#xff08;模型的時間復雜度&#xff09;&#xff0c;用來衡量算法…

電子秤檢測管理系統開發實戰:從數據采集到可視化大屏

簡介 電子秤作為現代工業生產和商業流通中的核心計量設備,其準確性直接關系到產品質量和交易公平。針對仙貝生產企業的電子秤管理需求,我們開發了一套集電子秤檢測信息錄入、產品信息管理、實時稱重數據采集和后臺可視化大屏于一體的綜合管理系統。該系統基于Django框架構建…

Cesium添加WMS,WMTS,地形圖圖,3D Tiles數據

在 Cesium 中&#xff0c;你可以添加 WMS、WMTS、地形圖 和 3D Tiles 數據源。以下是詳細的實現方法&#xff1a; 1. 添加 WMS 服務 WMS&#xff08;Web Map Service&#xff09;是一種動態地圖服務&#xff0c;適用于加載柵格地圖圖層。 代碼示例 const viewer new Cesium…

數據庫基本概念:數據庫的定義、特點、分類、組成、作用

一&#xff1a;數據庫相關概念 1.1 定義 &#xff08;1&#xff09;數據庫&#xff1a;存儲數據的倉庫 &#xff08;2&#xff09;數據庫管理系統&#xff1a;模擬和管理數據庫的大型軟件 &#xff08;3&#xff09;SQL&#xff1a;操作關系型數據庫的編程語言&#xff0c;定義…

【項目篇之消息序列化】仿照RabbitMQ模擬實現消息隊列

實現消息序列化 為什么不使用JSON來序列化直接使用二進制序列化實現序列化方法toBytes()1&#xff1a; 創建內存緩沖區??2 &#xff1a;創建對象序列化通道?3&#xff1a;執行序列化操作?4&#xff1a;提取二進制數據&#xff0c;轉換成byte[]序列化圖示流程&#xff1a;序…

單片機-89C51部分:13、看門狗

飛書文檔https://x509p6c8to.feishu.cn/wiki/LefkwDPU7iUUWBkfKE9cGLvonSh 一、作用 程序發生死循環的時候&#xff08;跑飛&#xff09;&#xff0c;能夠自動復位。 啟動看門狗計數器->計數器計數->指定時間內不對計數器賦值&#xff08;主程序跑飛&#xff0c;無法喂…

C++23/26 靜態反射機制深度解析:編譯時元編程的新紀元

目錄 引言 一、C靜態反射的核心特性 1. 編譯時元數據獲取 2. 元信息操作的語法革新 3. 與現有特性的深度融合 二、應用場景&#xff1a;從理論到實踐 1. 序列化與反序列化 2. 領域特定語言&#xff08;DSL&#xff09;與代碼生成 3. 動態插件系統 4. 調試與元編程增強…

RISCV學習(5)GD32VF103 MCU架構了解

RISCV學習&#xff08;5&#xff09;GD32VF103 MCU架構了解 1、芯片內核功能簡介 GD32VF103 MCU架構&#xff0c;采用Bumblebee內核&#xff0c;芯來科技&#xff08;Nuclei System Technology&#xff09;與臺灣晶心科技&#xff08;Andes Technology&#xff09;聯合開發&am…

【Java學習筆記】遞歸

遞歸&#xff08;recursion&#xff09; 思想&#xff1a;把一個復雜的問題拆分成一個簡單問題和子問題&#xff0c;子問題又是更小規模的復雜問題&#xff0c;循環往復 本質&#xff1a;棧的使用 遞歸的注意事項 &#xff08;1&#xff09;需要有遞歸出口&#xff0c;否者就…

滲透測試中的那些“水洞”:分析與防御

1. Nginx 版本泄露 風險分析&#xff1a; Nginx 默認會在響應頭中返回 Server: nginx/x.x.x&#xff0c;攻擊者可利用該信息匹配已知漏洞進行攻擊。 防御措施&#xff1a; 修改 nginx.conf 配置文件&#xff0c;隱藏版本信息&#xff1a;server_tokens off;使用 WAF 進行信息…

基于C#開發的適合Windows開源文件管理器

使用DDD從零構建一個完整的系統 推薦一個功能強大且直觀的開源文件管理器&#xff0c;適用于Windows平臺。 01 項目簡介 該項目是一個基于C#開發、開源的文件管理器&#xff0c;適用于Windows&#xff0c;界面UI美觀、方便輕松瀏覽文件。此外&#xff0c;支持創建和提取壓縮…

實習入職的總結

我是4月14號入職的&#xff0c;到現在差不多已經三個禮拜了&#xff0c;今天想總結一下這段時間的工作情況&#xff0c;并給學弟學妹們提供一些指引。 目前&#xff0c;我所在的公司是一家初創企業&#xff0c;專注于IPC安防領域。作為一名大專生&#xff0c;我深知自己的學歷在…

Ubuntu 系統上部署 Kubernetes 的完整指南

Ubuntu 系統上部署 Kubernetes 的完整指南 一、環境準備&#xff08;Ubuntu 22.04/24.04&#xff09;1. 系統初始化2. 安裝容器運行時&#xff08;containerd&#xff09;3. 安裝 Kubernetes 組件&#xff08;kubeadm, kubelet, kubectl&#xff09; 二、部署 Kubernetes 集群1…

partition_pdf 和chunk_by_title 的區別

from unstructured.partition.pdf import partition_pdf from unstructured.chunking.title import chunk_by_titlepartition_pdf 和 chunk_by_title 初看有點像&#xff0c;都在"分塊"&#xff0c;但是它們的本質完全不一樣。 先看它們核心區別 partition_pdfchun…