Select Page
LiveKit-擁有自己的AI即時語音客服聊天小助理

LiveKit-擁有自己的AI即時語音客服聊天小助理

公開如何使用 OpenAI 配合 LiveKit 來實現會多國語言的小姐姐,可以即時回答您的問題,這個跟 Twilio 一樣的簡單和易用

取得 LiveKit key

利用 google 帳號登入 LiveKit Login 命名一個 project

並且到專案中的 settings -> KEYS ,取得 API KEY

程式碼

首先安裝相關依賴

pip install livekit-agents livekit-plugins-openai livekit-plugins-silero python-dotenv

設定環境變數

LIVEKIT_URL=""
LIVEKIT_API_KEY=""
LIVEKIT_API_SECRET=""
OPENAI_API_KEY=""

主要程式碼

import asyncio
from dotenv import load_dotenv
from livekit.agents import AutoSubscribe, JobContext,WorkerOptions, cli, llm
from livekit.agents.voice_assistant import VoiceAssistant
from livekit.plugins import openai, silero


load_dotenv()

async def entry(ctx: JobContext):
    chat_ctx = llm.ChatContext().append(
        role="system",
        text=("你是專業的助理,回答時候用專業的語氣回應。")
    )

    await ctx.connect(auto_subscribe=AutoSubscribe.AUDIO_ONLY)

    asssitant = VoiceAssistant(
        vad=silero.VAD.load(),
        stt=openai.STT(),
        tts=openai.TTS(voice="nova"),
        llm=openai.LLM(model="gpt-4o-mini"),
        chat_ctx=chat_ctx
    )
    asssitant.start(ctx.room)

    await asyncio.sleep(1)
    await asssitant.say("你好,第一次見面,很高興認識你",allow_interruptions=True)


if __name__ == "__main__":
    cli.run_app(WorkerOptions(entrypoint_fnc=entry))

測試與驗證

道專案中,可以看到 Get started 中有支援各種的平台的程式碼以及 server 可以使用

價格說明

https://livekit.io/pricing

參考資料

https://livekit.io

https://github.com/livekit/agents

demo code

GraphRAG 使用本地端的 Ollama

GraphRAG圖像檢索增強生成(Graph Retrieval-Augmented Generation,GraphRAG)超好用,但也超級貴,超級花錢,想要省錢的話,就要用本地端的服務如(Ollama),要用的話,可以按照下面的步驟處理,前提是你已經可以使用 OpenAI 版本的 GraphRAG 了,本篇是要把 OpenAI 改成 Ollama

講在前面

要先設定好 GraphRAG

下載以及安裝好 Ollama

安裝 ollama 的 Python 套件

pip install ollama

修改原先的 setting.yaml 檔案

把舊的 yaml 檔案改成 ollama 的設定檔,新的設定檔案如下

encoding_model: cl100k_base
skip_workflows: []
llm:
  api_key: ${GRAPHRAG_API_KEY}
  type: openai_chat # or azure_openai_chat
  # model: gpt-4o-mini
  model_supports_json: true # recommended if this is available for your model.
  # max_tokens: 4000
  # request_timeout: 180.0
  # api_base: https://<instance>.openai.azure.com
  # api_version: 2024-02-15-preview
  # organization: <organization_id>
  # deployment_name: <azure_model_deployment_name>
  # tokens_per_minute: 150_000 # set a leaky bucket throttle
  # requests_per_minute: 10_000 # set a leaky bucket throttle
  # max_retries: 10
  # max_retry_wait: 10.0
  # sleep_on_rate_limit_recommendation: true # whether to sleep when azure suggests wait-times
  # concurrent_requests: 25 # the number of parallel inflight requests that may be made

  # ollama api_base
  api_base: http://localhost:11434/v1
  model: llama3

parallelization:
  stagger: 0.3
  # num_threads: 50 # the number of threads to use for parallel processing

async_mode: threaded # or asyncio

embeddings:
  ## parallelization: override the global parallelization settings for embeddings
  async_mode: threaded # or asyncio
  llm:
    api_key: ${GRAPHRAG_API_KEY}
    type: openai_embedding # or azure_openai_embedding
    # model: text-embedding-3-small
    
    # ollama
    model: nomic-embed-text 
    api_base: http://localhost:11434/api

    # api_base: https://<instance>.openai.azure.com
    # api_version: 2024-02-15-preview
    # organization: <organization_id>
    # deployment_name: <azure_model_deployment_name>
    # tokens_per_minute: 150_000 # set a leaky bucket throttle
    # requests_per_minute: 10_000 # set a leaky bucket throttle
    # max_retries: 10
    # max_retry_wait: 10.0
    # sleep_on_rate_limit_recommendation: true # whether to sleep when azure suggests wait-times
    # concurrent_requests: 25 # the number of parallel inflight requests that may be made
    # batch_size: 16 # the number of documents to send in a single request
    # batch_max_tokens: 8191 # the maximum number of tokens to send in a single request
    # target: required # or optional
  
chunks:
  size: 300
  overlap: 100
  group_by_columns: [id] # by default, we don't allow chunks to cross documents
    
input:
  type: file # or blob
  file_type: text # or csv
  base_dir: "input"
  file_encoding: utf-8
  file_pattern: ".*\\.txt$"

cache:
  type: file # or blob
  base_dir: "cache"
  # connection_string: <azure_blob_storage_connection_string>
  # container_name: <azure_blob_storage_container_name>

storage:
  type: file # or blob
  base_dir: "output/${timestamp}/artifacts"
  # connection_string: <azure_blob_storage_connection_string>
  # container_name: <azure_blob_storage_container_name>

reporting:
  type: file # or console, blob
  base_dir: "output/${timestamp}/reports"
  # connection_string: <azure_blob_storage_connection_string>
  # container_name: <azure_blob_storage_container_name>

entity_extraction:
  ## llm: override the global llm settings for this task
  ## parallelization: override the global parallelization settings for this task
  ## async_mode: override the global async_mode settings for this task
  prompt: "prompts/entity_extraction.txt"
  entity_types: [organization,person,geo,event]
  max_gleanings: 0

summarize_descriptions:
  ## llm: override the global llm settings for this task
  ## parallelization: override the global parallelization settings for this task
  ## async_mode: override the global async_mode settings for this task
  prompt: "prompts/summarize_descriptions.txt"
  max_length: 500

claim_extraction:
  ## llm: override the global llm settings for this task
  ## parallelization: override the global parallelization settings for this task
  ## async_mode: override the global async_mode settings for this task
  # enabled: true
  prompt: "prompts/claim_extraction.txt"
  description: "Any claims or facts that could be relevant to information discovery."
  max_gleanings: 0

community_report:
  ## llm: override the global llm settings for this task
  ## parallelization: override the global parallelization settings for this task
  ## async_mode: override the global async_mode settings for this task
  prompt: "prompts/community_report.txt"
  max_length: 2000
  max_input_length: 8000

cluster_graph:
  max_cluster_size: 10

embed_graph:
  enabled: true # if true, will generate node2vec embeddings for nodes
  # num_walks: 10
  # walk_length: 40
  # window_size: 2
  # iterations: 3
  # random_seed: 597832

umap:
  enabled: true # if true, will generate UMAP embeddings for nodes

snapshots:
  graphml: true
  raw_entities: true
  top_level_nodes: true

local_search:
  # text_unit_prop: 0.5
  # community_prop: 0.1
  # conversation_history_max_turns: 5
  # top_k_mapped_entities: 10
  # top_k_relationships: 10
  # max_tokens: 12000

global_search:
  # max_tokens: 12000
  # data_max_tokens: 12000
  # map_max_tokens: 1000
  # reduce_max_tokens: 2000
  # concurrency: 32

其中修改 llm 區塊

修改 model: llama3

加入 api_base: http://localhost:11434/v1

修改 embeddings 區塊

model: nomic-embed-text

api_base: http://localhost:11434/api

修改 GraphRAG 的程式碼

除了設定好 setting.yaml 以外,程式碼也要修改成可以支持 ollama 的程式碼,有兩處要改,可以用以下現成的程式碼

  1. C:\Users\xxx\anaconda3\envs\GraphRAG\Lib\site-packages\graphrag\llm\openai\openai_embeddings_llm.py

加入 ollama setting 區塊

# Copyright (c) 2024 Microsoft Corporation.
# Licensed under the MIT License

"""The EmbeddingsLLM class."""

from typing_extensions import Unpack

from graphrag.llm.base import BaseLLM
from graphrag.llm.types import (
    EmbeddingInput,
    EmbeddingOutput,
    LLMInput,
)
import ollama

from .openai_configuration import OpenAIConfiguration
from .types import OpenAIClientTypes


class OpenAIEmbeddingsLLM(BaseLLM[EmbeddingInput, EmbeddingOutput]):
    """A text-embedding generator LLM."""

    _client: OpenAIClientTypes
    _configuration: OpenAIConfiguration

    def __init__(self, client: OpenAIClientTypes, configuration: OpenAIConfiguration):
        self.client = client
        self.configuration = configuration

    async def _execute_llm(
        self, input: EmbeddingInput, **kwargs: Unpack[LLMInput]
    ) -> EmbeddingOutput | None:
        args = {
            "model": self.configuration.model,
            **(kwargs.get("model_parameters") or {}),
        }
        # openai setting
        # embedding = await self.client.embeddings.create(
        #    input=input,
        #    **args,
        #)
        #return [d.embedding for d in embedding.data]

        # ollama setting
        embedding_list=[]
        for inp in input:
            embedding = ollama.embeddings(model='qwen:7b', prompt=inp) #如果要改模型, 模型的名字要換掉
            embedding_list.append(embedding['embedding'])
        return embedding_list        
  1. C:\Users\xxx\anaconda3\envs\GraphRAG\Lib\site-packages\graphrag\query\llm\oai\embedding.py

加入 ollama setting 區塊,並且關閉 openai setting 區塊即可

# Copyright (c) 2024 Microsoft Corporation.
# Licensed under the MIT License

"""OpenAI Embedding model implementation."""

import asyncio
from collections.abc import Callable
from typing import Any

import numpy as np
import tiktoken
from tenacity import (
    AsyncRetrying,
    RetryError,
    Retrying,
    retry_if_exception_type,
    stop_after_attempt,
    wait_exponential_jitter,
)

from graphrag.query.llm.base import BaseTextEmbedding
from graphrag.query.llm.oai.base import OpenAILLMImpl
from graphrag.query.llm.oai.typing import (
    OPENAI_RETRY_ERROR_TYPES,
    OpenaiApiType,
)
from graphrag.query.llm.text_utils import chunk_text
from graphrag.query.progress import StatusReporter
import ollama

class OpenAIEmbedding(BaseTextEmbedding, OpenAILLMImpl):
    """Wrapper for OpenAI Embedding models."""

    def __init__(
        self,
        api_key: str | None = None,
        azure_ad_token_provider: Callable | None = None,
        model: str = "text-embedding-3-small",
        deployment_name: str | None = None,
        api_base: str | None = None,
        api_version: str | None = None,
        api_type: OpenaiApiType = OpenaiApiType.OpenAI,
        organization: str | None = None,
        encoding_name: str = "cl100k_base",
        max_tokens: int = 8191,
        max_retries: int = 10,
        request_timeout: float = 180.0,
        retry_error_types: tuple[type[BaseException]] = OPENAI_RETRY_ERROR_TYPES,  # type: ignore
        reporter: StatusReporter | None = None,
    ):
        OpenAILLMImpl.__init__(
            self=self,
            api_key=api_key,
            azure_ad_token_provider=azure_ad_token_provider,
            deployment_name=deployment_name,
            api_base=api_base,
            api_version=api_version,
            api_type=api_type,  # type: ignore
            organization=organization,
            max_retries=max_retries,
            request_timeout=request_timeout,
            reporter=reporter,
        )

        self.model = model
        self.encoding_name = encoding_name
        self.max_tokens = max_tokens
        self.token_encoder = tiktoken.get_encoding(self.encoding_name)
        self.retry_error_types = retry_error_types

    def embed(self, text: str, **kwargs: Any) -> list[float]:
        """
        Embed text using OpenAI Embedding's sync function.

        For text longer than max_tokens, chunk texts into max_tokens, embed each chunk, then combine using weighted average.
        Please refer to: https://github.com/openai/openai-cookbook/blob/main/examples/Embedding_long_inputs.ipynb
        """
        token_chunks = chunk_text(
            text=text, token_encoder=self.token_encoder, max_tokens=self.max_tokens
        )
        chunk_embeddings = []
        chunk_lens = []
        for chunk in token_chunks:
            try:
                # openai setting
                #embedding, chunk_len = self._embed_with_retry(chunk, **kwargs)
                #chunk_embeddings.append(embedding)
                #chunk_lens.append(chunk_len)

                # ollama setting
                embedding = ollama.embeddings(model="nomic-embed-text", prompt=chunk)['embedding'] #如果要替換嵌入模型, 請修改此處的模型名稱
                chunk_lens.append(chunk)
                chunk_embeddings.append(embedding)
                chunk_lens.append(chunk_lens)                
            # TODO: catch a more specific exception
            except Exception as e:  # noqa BLE001
                self._reporter.error(
                    message="Error embedding chunk",
                    details={self.__class__.__name__: str(e)},
                )

                continue
        #chunk_embeddings = np.average(chunk_embeddings, axis=0, weights=chunk_lens)
        #chunk_embeddings = chunk_embeddings / np.linalg.norm(chunk_embeddings)
        return chunk_embeddings.tolist()

    async def aembed(self, text: str, **kwargs: Any) -> list[float]:
        """
        Embed text using OpenAI Embedding's async function.

        For text longer than max_tokens, chunk texts into max_tokens, embed each chunk, then combine using weighted average.
        """
        token_chunks = chunk_text(
            text=text, token_encoder=self.token_encoder, max_tokens=self.max_tokens
        )
        chunk_embeddings = []
        chunk_lens = []
        embedding_results = await asyncio.gather(*[
            self._aembed_with_retry(chunk, **kwargs) for chunk in token_chunks
        ])
        embedding_results = [result for result in embedding_results if result[0]]
        chunk_embeddings = [result[0] for result in embedding_results]
        chunk_lens = [result[1] for result in embedding_results]
        chunk_embeddings = np.average(chunk_embeddings, axis=0, weights=chunk_lens)  # type: ignore
        chunk_embeddings = chunk_embeddings / np.linalg.norm(chunk_embeddings)
        return chunk_embeddings.tolist()

    def _embed_with_retry(
        self, text: str | tuple, **kwargs: Any
    ) -> tuple[list[float], int]:
        try:
            retryer = Retrying(
                stop=stop_after_attempt(self.max_retries),
                wait=wait_exponential_jitter(max=10),
                reraise=True,
                retry=retry_if_exception_type(self.retry_error_types),
            )
            for attempt in retryer:
                with attempt:
                    embedding = (
                        self.sync_client.embeddings.create(  # type: ignore
                            input=text,
                            model=self.model,
                            **kwargs,  # type: ignore
                        )
                        .data[0]
                        .embedding
                        or []
                    )
                    return (embedding, len(text))
        except RetryError as e:
            self._reporter.error(
                message="Error at embed_with_retry()",
                details={self.__class__.__name__: str(e)},
            )
            return ([], 0)
        else:
            # TODO: why not just throw in this case?
            return ([], 0)

    async def _aembed_with_retry(
        self, text: str | tuple, **kwargs: Any
    ) -> tuple[list[float], int]:
        try:
            retryer = AsyncRetrying(
                stop=stop_after_attempt(self.max_retries),
                wait=wait_exponential_jitter(max=10),
                reraise=True,
                retry=retry_if_exception_type(self.retry_error_types),
            )
            async for attempt in retryer:
                with attempt:
                    embedding = (
                        await self.async_client.embeddings.create(  # type: ignore
                            input=text,
                            model=self.model,
                            **kwargs,  # type: ignore
                        )
                    ).data[0].embedding or []
                    return (embedding, len(text))
        except RetryError as e:
            self._reporter.error(
                message="Error at embed_with_retry()",
                details={self.__class__.__name__: str(e)},
            )
            return ([], 0)
        else:
            # TODO: why not just throw in this case?
            return ([], 0)

參考資料

如何使用2024年提示詞冠軍的CO-STAR框架優化Prompt

如何使用2024年提示詞冠軍的CO-STAR框架優化Prompt

在人工智慧生成內容的領域,提示詞(Prompt)設計的好壞往往決定了最終結果的質量。隨著語言模型的進步,越來越多的研究者與開發者開始探索更高效的提示詞架構。在新加坡舉辦的一場GPT-4提示詞設計競賽中,Sheila Tao通過CO-STAR的提示詞架構獲得了冠軍。這個架構為設計有效的提示詞提供了一個明確的框架,幫助使用者更精準地引導語言模型生成期望的內容。

CO-STAR框架介紹

CO-STAR是一種設計提示詞結構的模板,包含六個關鍵要素:上下文(Context)、目標(Objective)、風格(Style)、語氣(Tone)、受眾(Audience)和響應(Response)。通過這六個要素的協同作用,使用者可以更好地控制生成的內容,確保其符合特定的需求。

1. 上下文(Context)

上下文是提示詞的基礎,它提供了生成內容的背景資訊。這一部分的設計旨在讓語言模型理解當前任務的情境。上下文可以包括已有的文本、問題的背景描述,或是其他可能影響生成結果的資訊。

範例:如果你要生成一篇關於氣候變遷的文章,可以在上下文中提供相關的背景數據和問題描述,讓模型更好地理解這個主題。

2. 目標(Objective)

目標定義了提示詞的核心需求,即希望模型達成的結果。這部分明確指出你希望生成的內容應該涵蓋哪些主題或回答哪些問題。

範例:你可能會指示模型撰寫一篇關於氣候變遷的教育性文章,目的是讓大眾了解這一問題的嚴重性。

3. 風格(Style)

風格決定了生成內容的表達方式,涵蓋了文本的結構、用詞選擇等方面。不同的風格可能會影響讀者對文本的理解和感受。

範例:你可以指定內容應該以學術性的風格來撰寫,這樣會使得內容更加嚴謹和專業。

4. 語氣(Tone)

語氣影響了文本的情感表達方式,這在塑造讀者的感受方面至關重要。根據內容的不同,語氣可以是正式、非正式、幽默或是嚴肅的。

範例:在撰寫一篇新聞報導時,你可能會要求語氣保持中立和客觀。

5. 受眾(Audience)

受眾是提示詞設計中常被忽視的一個部分,但它至關重要。了解你希望吸引的讀者群體可以幫助你調整提示詞的其他要素,確保生成的內容適合這一群體的需求。

範例:如果你的文章是針對青少年,那麼語言應該更簡單易懂,風格可以更輕鬆。

6. 響應(Response)

響應是提示詞的最終結果,這是你希望模型生成的內容形式。響應可以是段落、清單、對話等多種形式,具體取決於你的需求。

範例:你可能要求模型生成一個包含多個段落的詳細分析,或是提供一個簡單的要點清單。

為什麼CO-STAR框架如此有效?

CO-STAR框架的成功在於它的結構化方法,這使得提示詞設計變得更加精確和有針對性,也就是說你已經抓到了如何當一個好的主管的精隨。當你明確了每個要素,模型能夠更好地理解你的需求,從而生成符合期望的內容。此外,這個框架也能幫助你在提示詞的不同層面上進行調整,進一步優化結果。

舉例來說,如果你對生成的內容不滿意,可能是因為上下文提供的信息不足,或是語氣與目標不符。通過CO-STAR框架,你可以更容易地找出問題所在,並進行相應的調整。

如果還不甚滿意LLM的輸出結果,建議用自己的訓練資料,並且做出關聯圖,讓語言模型好理解,我最常採用 GraphRAG 處理他

CO-STAR 注意事項

使用分隔符:

分隔符幫助語言模型(LLM)區分提示中的不同部分,尤其是指令區塊和數據區塊對於複雜任務尤其重要。

LLM防護網:

這是一種附加的額外提示,用於指示LLM應如何行為,包括任務定義、輸出格式和防護圍欄(防止LLM生成不當內容),例如要求大語言模型用指定語言輸出

使用LLM分析數據集:

不使用插件或代碼,僅採用LLM來分析數據集,這在模式識別任務中特別有用。

猜解複雜的指令:

太過長的文章以及複雜的句型,是需要被理解的,但連人類都很常誤會意思,何況是LLM,所以分割成小塊且清楚的指令才能幫助模型理解和回答

使用CO-STAR框架的示例與對比

為了更好地理解CO-STAR框架的實際應用,我們用一個具體的例子來說明它如何改善提示詞的設計。

假設我們需要生成一篇關於「如何保持工作與生活的平衡」的文章,我們將展示在沒有使用CO-STAR框架和使用後的效果對比。

沒有使用CO-STAR框架的提示詞

在沒有使用CO-STAR框架的情況下,我們可能只會簡單地輸入一個直接的提示詞:

提示詞
“寫一篇關於如何保持工作與生活平衡的文章。”

生成的內容

保持工作與生活平衡是一項挑戰,尤其是在快節奏的現代社會。人們應該設定明確的工作時間,並確保下班後有足夠的休息時間。安排時間進行娛樂活動也很重要,比如運動或與朋友聚會。這有助於減少壓力並提高整體生活質量。

分析: 這篇文章雖然提供了一些基本的建議,但內容過於簡單,沒有考慮到讀者的特定需求或語境,語氣也較為中立,缺乏吸引力,說白了,就是無聊雞肋且廢話太多的一句話,簡稱廢文。

使用CO-STAR框架的提示詞

現在,我們運用CO-STAR框架來重新設計這個提示詞,以提高生成內容的質量。

CO-STAR提示詞

  • Context(上下文):這篇文章將發布在一個專為職場人士設計的IG平台上,主要讀者是希望改善工作與生活平衡的職場中高層管理者。
  • Objective(目標):提供實際且具體的策略,幫助讀者在高壓的工作環境中維持健康的工作與生活平衡。
  • Style(風格):專業且有說服力,引用實際案例和研究數據支持論點。
  • Tone(語氣):積極且鼓勵人心,給予讀者信心去實踐建議。
  • Audience(受眾):中高層管理者,他們時間緊張,承受較大的職場壓力,但希望改善生活質量。
  • Response(響應):生成一篇包含具體步驟和案例的文章,提供可行的建議,幫助讀者實現工作與生活的平衡。

提示詞
“為職場中高層管理者撰寫一篇專業的文章,討論如何在高壓環境下維持工作與生活的平衡。這篇文章應該包括具體的策略和案例研究,並引用最新的研究數據。語氣應積極且鼓勵人心,風格應專業且有說服力。”

建議用格式化過的方法編排提示詞後,再傳給LLM

# Context #
這篇文章將發布在一個專為職場人士設計的IG平台上,主要讀者是希望改善工作與生活平衡的職場中高層管理者。

# Objective #
提供實際且具體的策略,幫助讀者在高壓的工作環境中維持健康的工作與生活平衡。

# Style #
專業且有說服力,引用實際案例和研究數據支持論點。

# Tone #
積極且鼓勵人心,給予讀者信心去實踐建議。

# Audience #
中高層管理者,他們時間緊張,承受較大的職場壓力,但希望改善生活質量。

# Response #
生成一篇包含具體步驟和案例的文章,提供可行的建議,幫助讀者實現工作與生活的平衡。

生成的內容

在現代職場中,中高層管理者往往面臨著巨大的工作壓力,如何在這樣的環境中維持工作與生活的平衡成為一項關鍵挑戰。根據哈佛商學院的最新研究,超過70%的管理者表示,壓力已經嚴重影響了他們的生活質量。為了應對這一問題,我們可以採取以下三個具體策略:

  1. 設立明確的界限:管理者應該為自己設定明確的工作時間和個人時間界限,並嚴格遵守。例如,可以在晚餐後將手機設置為勿擾模式,專注於與家人共度的時光。
  2. 尋求支持系統:建立一個由同事、家人和朋友組成的支持系統,這可以幫助管理者在壓力過大時及時得到情感和實際的支持。
  3. 實行主動管理:制定每週的工作與生活計畫,確保每週都有足夠的時間進行休閒活動,這不僅有助於減輕壓力,還能提高工作效率。

這些策略不僅能幫助管理者更好地平衡工作與生活,還能提升他們的整體生活質量。根據美國心理學會的研究,採取這些策略的管理者在工作滿意度和幸福感上都有顯著提高。

分析: 使用CO-STAR框架後,生成的內容更加具體、針對性強,並且提供了實際可操作的建議。語氣積極鼓勵,風格專業且可信,與中高層管理者的需求高度契合。

對比總結

通過這個示例,我們可以明顯看出CO-STAR框架的優勢,它不僅幫助你設計出更精確的提示詞,還確保了生成的內容更具質量和價值,相比於簡單的提示詞,CO-STAR框架能夠大幅度提升內容的針對性和專業度,使其更能滿足特定受眾的需求,話說,現在的小朋友必學提示詞的技巧,才不會淹沒在浪潮中。

參考資料

https://towardsdatascience.com/how-i-won-singapores-gpt-4-prompt-engineering-competition-34c195a93d41

https://hub.baai.ac.cn/view/37050

延伸閱讀

OpenAI Spring Update – GPT-4o

OpenAI Spring Update – GPT-4o

這一次OpenAI的2024年春季更新,帶來了虛擬人的真正可行性,因為可以真正即時的交互對談,過程中也真的像極了真人,有語氣,不會笨笨的把句子唸到完畢,完全能理解使用者的指令,並且做出對應的動作,重點還 free

更新說明

Hello GPT-4o | OpenAI

影片如下

Introducing GPT-4o (youtube.com)

重點摘要

realtime

反應速度快、真的超快,再也沒有延遲,可以看看DEMO

有了真的的人類情緒

懂說話者的語氣,你可以緊張、可以不舒服,他都可以感受到

chatgpt 可以用各種語氣回應,甚至連叫他用歌劇的方法也可以

Live research

可以用錄影的方法,了解上下文解題,數學題代公式的也難不倒

也可以用攝像頭看得出來使用者的情緒

Free to everyone

Desktop and Mobile Phones app

https://openai.com/chatgpt/download

Web UI Update

如何踏出開發 Microsoft OpenAI API 的第一步

如何踏出開發 Microsoft OpenAI API 的第一步

想要做自己的 chatGPT ? 想要用自己的 DATA 訓練機器人? 不知道甚麼是 VectorDB,或是想要企業的聊天機器人應用? 還是想要結合EXCEL回答問題,還是想用機器人幫你完成各式各樣的任務。

第一步驟推薦看下面的文章

GitHub – xuhaoruins/Azure-OpenAI-App-Innovation-Workshop

Azure_App_Innovation_Inspiration_Demo · Streamlit (haxu.dev)