LLM及LangChain開發筆記(7)_聊天機器人函數改寫_自動點餐機器人_結合OpenAI GPT-3.5 API 和 Panel GUI 工具
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 | import openai import os from dotenv import load_dotenv, find_dotenv _ = load_dotenv(find_dotenv()) # read local .env file openai.api_key = os.getenv('OPENAI_API_KEY') def get_completion_from_messages(messages, model="gpt-3.5-turbo", temperature=0): response = openai.ChatCompletion.create( model=model, messages=messages, temperature=temperature, # this is the degree of randomness of the model's output ) # print(str(response.choices[0].message)) return response.choices[0].message["content"] def merge_histories(_): prompt = chat.value_input chat.value = '' retailshop.append({'role':'user', 'content':f"{prompt}"}) response = get_completion_from_messages(retailshop) retailshop.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) #!pip install panel import panel as pn # GUI pn.extension() panels = [] # collect display retailshop = [ {'role':'system', 'content':""" 你好,我是 OrderBot,一家麵包餐廳的自動化點餐服務。 首先會先向顧客問候,接著收集訂單, 然後詢問是自取還是外送。 我們會等待顧客提供完整訂單後,進行總結,並最後再次確認是否還需要添加其他品項。 如果是外送,會要求提供地址。 最後,我們會收取付款。 請務必釐清所有選項、附加服務與大小,以便能從菜單中唯一地識別每個品項。 我們的菜單包括: 德國香腸麵包:12.95、10.00、7.00 葡萄乾麵包:10.95、9.25、6.50 果子麵包:11.95、9.75、6.75 薯條:4.50、3.50 希臘沙拉:7.25 配料: 額外起司:2.00 蘑菇:1.50 香腸:3.00 加拿大培根:3.50 甜麵醬:1.50 辣椒:1.00 飲料: 可樂:3.00、2.00、1.00 雪碧:3.00、2.00、1.00 瓶裝水:5.00。 """}] chat = pn.widgets.TextInput(value="Hi", placeholder='Enter text here…') button_conversation = pn.widgets.Button(name="Chat!") interactive_conversation = pn.bind(merge_histories, button_conversation) dashboard = pn.Column( chat, pn.Row(button_conversation), pn.panel(interactive_conversation, loading_indicator=True, height=300), ) dashboard |
get_completion_from_messages 函數
用於接收 messages 對話歷史列表(每筆都有角色與內容)。
temperature決定回答的隨機程度,0 是最保守僅傾向回標準唯一簡短答案的。
較不會太隨意發揮。
merge_histories對話互動處理函式
這個函式會在每次按下「Chat!」按鈕時執行如下動作:
- 讀取使用者輸入 chat.value_input。
- 清空輸入框。
- 把使用者輸入加入對話歷史 retailshop。
- 呼叫 GPT 模型取得回答,並加入歷史中。
- 將使用者輸入與 AI 回應用 Panel 的 Markdown 視覺化顯示。
Panel GUI 元件初始化
pn.extension() 用於 Panel GUI 元件初始化
panels 是儲存畫面要顯示的每一列(使用者與 AI 的對話)。
retailshop 是聊天歷史,第一筆是「系統指令(system)」角色,
說明聊天機器人的角色與菜單(即 prompt 設定)。
UI 元件:輸入框、按鈕與互動邏輯
- TextInput 是用戶輸入訊息用的欄位。
- Button 是觸發與 AI 對話的按鈕。
- pn.bind() 把 button_conversation 與 merge_histories() 綁定,點擊按鈕會觸發對話。
組合 Panel dashboard畫面元件並顯示
建立並顯示一個介面,包括:
使用者輸入框 和 chat字眼的按鈕 button_conversation
對話紀錄畫面 interactive_conversation(會逐步累積)
留言
張貼留言