天天看點

重新定義聊天機器人:GPT 4o 的多模态互動創新

作者:ChatGPT掃地僧

重新定義聊天機器人:GPT 4o 的多模态互動創新

原文:Multimodal Chatbot with Text and Audio Using GPT 4o

介紹

自 OpenAI 推出 GPT 模型(如 GPT 4o)以來,自然語言處理的格局已經完全改變,并轉向了一個稱為生成式人工智能的新概念。大型語言模型是其核心,它們能夠了解複雜的人類查詢并生成相關的答案。對于這種大型語言模型的下一步發展是多模态性,即能夠了解除文本以外的資料。這可能包括圖像、音頻和視訊。最近一些多模型已經釋出,包括開源和閉源的,比如谷歌的 Gemini、LlaVa 和 GPT 4v。最近,OpenAI 宣布推出了一種新的多模型,名為 GPT 4o(Omni)。在本文中,我們将使用這個 OpenAI GPT 4o 建立一個多模态聊天機器人。

重新定義聊天機器人:GPT 4o 的多模态互動創新

學習目标

  • • 了解 GPT-4o 在文本、音頻和圖像生成方面的能力
  • • 學習為處理使用者輸入(圖像和音頻)建立輔助函數以供 GPT-4o 使用
  • • 使用 Chainlit 建構一個與 GPT-4o 互動的多模态聊天機器人
  • • 實作處理聊天機器人中的文本、圖像和音頻輸入的功能
  • • 了解使用多模态方法進行聊天機器人互動的好處
  • • 探索 GPT-4o 多模态能力的潛在應用

目錄

什麼是 GPT 4o?

最近宣布的 OpenAI 的 GPT-4o 在速度、準确性和了解以及生成文本、音頻和圖像方面的能力上标志着人工智能的重大飛躍。這個“多語言”模型可以翻譯語言、撰寫創意内容、分析或生成具有不同語調的語音,甚至描述現實場景或根據您的描述建立圖像。除了其令人印象深刻的能力,GPT-4o 與 ChatGPT 無縫內建,允許實時對話,它可以識别視覺資訊并提出相關問題。跨模态互動的能力為與計算機更自然、更直覺地互動鋪平了道路,可能有助于視覺受障礙使用者,并創造新的藝術媒介。GPT-4o 作為突破性的下一代模型,推動了人工智能的邊界。

建立輔助函數

在本節中,我們将開始編寫多模态聊天機器人的代碼。第一步是下載下傳我們将在此代碼中使用的必要庫。為此,我們運作以下指令

pip install openai chainlit           

運作此指令将安裝 OpenAI 庫。這将讓我們使用不同的 OpenAI 模型,包括文本生成模型(如 GPT 4o 和 GPT 3.5)、圖像生成模型(如 DallE-3)和語音轉文本模型(如 Whisper)。

我們安裝 chainlit 以建立使用者界面。Chainlit 庫讓我們完全使用 Python 建立快速聊天機器人,無需編寫 Javascript、HTML 或 CSS。在開始聊天機器人之前,我們需要建立一些輔助函數。首先是處理圖像的函數。我們不能直接提供模型的圖像。我們需要将它們編碼為 base64,然後再提供。為此,我們使用以下代碼

import base64
def image2base64(image_path):
    with open(image_path, "rb") as img:
        encoded_string =, base64.b64encode(img.read())
    return encoded_string.decode("utf-8")           
  • • 首先,我們導入 base64 庫進行編碼。然後,我們建立一個名為 image_2_base64() 的函數,以圖像路徑作為輸入。
  • • 接下來,我們以讀取位元組的模式打開提供的路徑中的圖像。然後,我們調用 base64 庫的 b64encode() 方法,将圖像編碼為 base64。
  • • 編碼的資料是位元組形式的,是以我們需要将其轉換為模型期望的 Unicode 格式,以便将此圖像與使用者查詢一起傳遞。
  • • 是以,我們調用 decode() 方法,該方法接受 base64 編碼的位元組并使用 UTF-8 編碼對其進行解碼,最終傳回 base64 編碼的字元串。
  • • 最後,我們傳回 base64 編碼的字元串,可以與要發送給 GPT-4o 模型的文本連接配接在一起。
  • • 從高層次上來看,我們所做的是将圖像轉換為“Base 64 編碼的位元組”,然後将“Base 64 編碼的位元組”轉換為“Base 64 編碼的字元串”。

多模态聊天甚至需要音頻輸入。是以,我們在将其發送到模型之前需要處理音頻。為此,我們使用 OpenAI 的語音轉文本模型。其代碼如下所示。

from openai import OpenAI
client = OpenAI()
def audio_process(audio_path):
    audio_file = open(audio_path, "rb")
    transcription = client.audio.transcriptions.create(
        model="whisper-1", file=audio_file
    )
    return transcription.text           
  • • 我們首先從 OpenAI 函數中導入 OpenAI 類。確定 .env 檔案中存在 OpenAI API 密鑰。
  • • 接下來,我們執行個體化一個 OpenAI 對象,并将該對象存儲在變量 client 中。
  • • 現在,我們建立一個名為 audio_process() 的函數,該函數期望輸入音頻路徑。
  • • 然後,我們以隻讀模式打開檔案,并将結果位元組存儲在變量 audio_file 中。
  • • 然後,我們調用 client.audio.transcriptions.create() 函數,并将 audio_file 傳遞給該函數。除此之外,我們還告訴要使用哪個模型進行語音轉文本轉換。這裡我們給出了“whisper-1”。
  • • 調用上述函數将會将 audio_file 的内容傳遞給該模型,并将相應的轉錄存儲在 transcription 變量中。
  • • 最後,我們傳回文本部分,即從該函數中實際轉錄的音頻的文本。

我們無法預料使用者會向模型詢問什麼類型的消息。使用者有時可能隻發送純文字,有時可能包含圖檔,有時可能包含音頻檔案。是以,基于此,我們需要修改将發送給 OpenAI 模型的消息。為此,我們可以編寫另一個函數,該函數将向模型提供不同的使用者輸入。其代碼如下:

def append_messages(image_url=None, query=None, audio_transcript=None):
    message_list = []
    if image_url:
        message_list.append({"type": "image_url", "image_url": {"url": image_url}})
    if query and not audio_transcript:
        message_list.append({"type": "text", "text": query})
    if audio_transcript:
        message_list.append({"type": "text", "text": query + "\n" + audio_transcript})
    response = client.chat.completions.create(
        model="gpt-4o",
        messages=[{"role": "user", "content": message_list}],
        max_tokens=1024,
    )
    return response.choices[0]           
  • • 我們建立了一個名為 append_messages() 的函數,其中定義了三個參數。一個是 image_url,第二個是使用者查詢,最後一個是音頻轉錄。
  • • 然後,我們通過将空清單指派給空的 message_list 變量來建立一個空的 message_list 變量。
  • • 接下來,我們檢查是否提供了 image_url,如果提供了,我們将建立一個字典,其中鍵為“type”,值為“image_url”,另一個鍵為“image_url”,我們通過給出調用該函數的 image_url 來傳遞另一個字典。這是 OpenAI 期望發送圖檔的格式。
  • • 然後,我們檢查是否提供了查詢,并且沒有提供音頻轉錄。然後,我們隻需将另一個字典附加到 messag_list,其中包含代碼中看到的鍵值對。
  • • 最後,我們檢查是否向函數提供了音頻轉錄,如果是,則将其與使用者查詢組合在一起,并将其附加到消息清單中。
  • • 然後,我們調用 client.chat.completions.create() 函數,在其中傳遞模型,這裡是 GPT-4o,以及我們之前建立的 message_list,并将結果存儲在 response 變量中。
  • • 我們甚至将 max_tokens 設定為 1024。除此之外,我們還可以提供額外的參數,如 temperature、top_p 和 top_k。
  • • 最後,我們通過傳回 response.choices[0] 存儲由 GPT 4 Omni 生成的響應。

通過這樣做,我們已經建立了輔助函數。稍後我們将調用這些輔助函數,以傳遞使用者查詢、音頻和圖像資料,并擷取響應。

建構聊天機器人界面

現在,我們将建構 Chatbot 的 UI 部分。這可以很容易地使用 Chainlit 庫建構。我們将編寫的代碼将與定義輔助函數的同一檔案中。代碼如下:

import chainlit as cl
@cl.on_message
async def chat(msg: cl.Message):
    images = [file for file in msg.elements if "image" in file.mime]
    audios = [file for file in msg.elements if "audio" in file.mime]
    if len(images) > 0:
        base64_image = image2base64(images[0].path)
        image_url = f"data:image/png;base64,{base64_image}"
    elif len(audios) > 0:
        text = audio_process(audios[0].path)
    response_msg = cl.Message(content="")
    if len(images) == 0 and len(audios) == 0:
        response = append_messages(query=msg.content)
    elif len(audios) == 0:
        response = append_messages(image_url=image_url, query=msg.content)
    else:
        response = append_messages(query=msg.content, audio_transcript=text)
    response_msg.content = response.message.content
    await response_msg.send()           
  • • 我們首先導入 chainlit 庫。然後,我們建立一個裝飾器 @cl.on_message(),它告訴下面的函數在使用者輸入消息時運作。
  • • Chainlit 庫期望一個異步函數。是以,我們定義了一個名為 chat 的異步函數,它接受一個名為 cl.Message 的變量。無論使用者輸入的是文本、音頻還是圖檔,所有内容都存儲在 cl.Message 中。
  • • msg.elements 包含使用者發送的消息類型清單。這些可以是純文字使用者查詢,也可以是帶有圖檔或音頻的使用者查詢。
  • • 是以,我們檢查使用者消息中是否存在一些圖檔或音頻檔案,并将它們存儲在 images 和 audio 變量中。
  • • 現在,我們使用 if 塊檢查是否存在圖檔,然後将它們轉換為 base64 字元串,并以 GPT-4o 模型期望的格式存儲在 image_url 變量中。
  • • 我們甚至檢查音頻是否存在,如果存在,我們通過調用 audio_process() 函數處理該音頻,該函數傳回音頻轉錄,并将其存儲在名為 text 的變量中。
  • • 然後,我們通過給它一個空消息來建立一個消息占位符 response_img。
  • • 然後再次檢查是否存在圖檔或音頻。如果兩者都不存在,我們隻将使用者查詢發送到 append_message 函數;如果有音頻/圖檔,我們甚至将它們傳遞給 append_messages 函數。
  • • 然後,我們将模型的結果存儲在 response 變量中,并将其附加到我們之前建立的占位符消息變量 response_msg 中。
  • • 最後,我們調用 response_msg.send(),這将在使用者界面中顯示響應。

最終代碼将是

from openai import OpenAI
import base64
import chainlit as cl
client = OpenAI()
def append_messages(image_url=None, query=None, audio_transcript=None):
    message_list = []
    if image_url:
        message_list.append({"type": "image_url", "image_url": {"url": image_url}})
    if query and not audio_transcript:
        message_list.append({"type": "text", "text": query})
    if audio_transcript:
        message_list.append({"type": "text", "text": query + "\n" + audio_transcript})
    response = client.chat.completions.create(
        model="gpt-4o",
        messages=[{"role": "user", "content": message_list}],
        max_tokens=1024,
    )
    return response.choices[0]
def image2base64(image_path):
    with open(image_path, "rb") as img:
        encoded_string = base64.b64encode(img.read())
    return encoded_string.decode("utf-8")
def audio_process(audio_path):
    audio_file = open(audio_path, "rb")
    transcription = client.audio.transcriptions.create(
        model="whisper-1", file=audio_file
    )
    return transcription.text
@cl.on_message
async def chat(msg: cl.Message):
    images = [file for file in msg.elements if "image" in file.mime]
    audios = [file for file in msg.elements if "audio" in file.mime]
    if len(images) > 0:
        base64_image = image2base64(images[0].path)
        image_url = f"data:image/png;base64,{base64_image}"
    elif len(audios) > 0:
        text = audio_process(audios[0].path)
    response_msg = cl.Message(content="")
    if len(images) == 0 and len(audios) == 0:
        response = append_messages(query=msg.content)
    elif len(audios) == 0:
        response = append_messages(image_url=image_url, query=msg.content)
    else:
        response = append_messages(query=msg.content, audio_transcript=text)
    response_msg.content = response.message.content
    await response_msg.send()           

要運作此代碼,請鍵入 chainlit run app.py,假設代碼存儲在名為 app.py 的檔案中。運作此指令後,localhost:8000 端口将變為活動狀态,并且我們将看到以下圖像

重新定義聊天機器人:GPT 4o 的多模态互動創新

現在讓我們隻輸入一個普通文本查詢,看看生成的輸出

重新定義聊天機器人:GPT 4o 的多模态互動創新

我們看到 GPT-4o 成功為使用者查詢生成了輸出。我們甚至注意到這裡正在突出顯示代碼,并且我們可以快速複制和粘貼。這一切都由 Chainlit 管理,它處理底層的 HTML、CSS 和 Javascript。接下來,讓我們嘗試上傳一張圖檔并詢問模型相關資訊。

重新定義聊天機器人:GPT 4o 的多模态互動創新

在這裡,模型對我們上傳的圖檔做出了良好的響應。它識别出圖檔是一個表情符号,并提供了關于它的資訊以及可以在哪裡使用它。現在,讓我們傳遞一個音頻檔案并進行測試

重新定義聊天機器人:GPT 4o 的多模态互動創新

speech.mp3 音頻包含有關機器學習的資訊,是以我們要求模型總結其内容。模型生成了與音頻檔案中的内容相關的摘要。

結論

總之,利用OpenAI的GPT-4o (Omni)開發多模态聊天機器人标志着人工智能技術邁出了重要一步,開啟了互動體驗的新時代。在這裡,我們探讨了如何無縫地将文本、圖像和音頻輸入整合到與聊天機器人的對話中,充分利用了GPT-4o的能力。這種創新的方法增強了使用者參與度,并為不同的實際應用打開了大門,從幫助視障使用者到創造新的藝術媒介。通過将語言了解的能力與多模态功能相結合,GPT-4o展現了其革新人們與人工智能系統互動方式的潛力。

主要觀點

  • • GPT-4o代表了人工智能的重要時刻,僅通過一個模型就能提供文本、音頻和圖像的了解和生成能力
  • • 将多模态功能整合到聊天機器人中,使互動更加自然和直覺,增加了使用者的參與度和體驗
  • • 助手功能在預處理輸入中起着至關重要的作用,例如将圖像編碼為base64并轉錄音頻檔案,然後再将它們輸入模型
  • • append_messages函數根據使用者查詢動态調整輸入格式,是以可以接受純文字、圖像和音頻轉錄
  • • Chainlit庫簡化了聊天機器人界面的開發,處理底層的HTML、CSS和JavaScript,使UI建立變得簡單易行 [20]

繼續閱讀