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(會逐步累積)

















留言

這個網誌中的熱門文章

何謂淨重(Net Weight)、皮重(Tare Weight)與毛重(Gross Weight)

(2021年度)駕訓學科筆試準備題庫歸納分析_法規是非題

經得起原始碼資安弱點掃描的程式設計習慣培養(五)_Missing HSTS Header