CleverBird
ist ein Swift-Paket, das eine bequeme Möglichkeit bietet, mit den Chat-APIs von OpenAI zu interagieren und verschiedene Aufgaben auszuführen, einschließlich Token-Zählung und -Codierung. Das Paket ist darauf ausgelegt, eine überragende Developer Experience (DX) zu bieten, indem es den Chat-Thread zum Mittelpunkt der Interaktionen macht.
CleverBird
bietet Unterstützung für Dokumenteinbettungen und Ähnlichkeitsabfragen. Dies macht es zu einem vielseitigen Tool für eine Vielzahl von Anwendungen, insbesondere für Fälle, in denen Chat-Eingabeaufforderungen ein verbessertes Kontextgedächtnis erfordern.
CleverBird
konzentriert sich ausschließlich auf chatbasierte Interaktionen und darauf, diese großartig zu gestalten.
Bitte beachten Sie, dass CleverBird
ein inoffizielles Paket ist, das nicht von OpenAI selbst bereitgestellt wird.
TokenEncoder
-Klasse.EmbeddedDocumentStore
-Klasse zum Verwalten und Abfragen von Dokumentähnlichkeiten. Importieren Sie das CleverBird
-Paket:
import CleverBird
Initialisieren Sie eine OpenAIAPIConnection
mit Ihrem API-Schlüssel. Bitte beachten Sie, dass API-Schlüssel immer aus Umgebungsvariablen geladen und nicht fest in Ihre Quelle codiert werden sollten. Nachdem Sie Ihren API-Schlüssel geladen haben, übergeben Sie ihn an den Initialisierer der Verbindung:
let openAIAPIConnection = OpenAIAPIConnection ( apiKey : < OPENAI_API_KEY > )
Erstellen Sie eine ChatThread
Instanz und fügen Sie System-, Benutzer- oder Assistentennachrichten zum Chat-Thread hinzu:
let chatThread = ChatThread ( )
. addSystemMessage ( content : " You are a helpful assistant. " )
. addUserMessage ( content : " Who won the world series in 2020? " )
Generieren Sie mithilfe des Chat-Threads und der Übergabe der API-Verbindung eine Vervollständigung:
let completion = try await chatThread . complete ( using : openAIAPIConnection )
Die Methode complete(using:)
enthält außerdem verschiedene optionale Parameter:
let completion = chatThread . complete (
using : openAIAPIConnection ,
model : . gpt4o ,
temperature : 0.7 ,
maxTokens : 500
)
Im obigen Beispiel haben wir eine Vervollständigung mit einem bestimmten Modell, einer bestimmten Temperatur und einer maximalen Anzahl von Token erstellt. Alle Parameter außer connection
sind optional. Die vollständige Liste der Parameter lautet wie folgt:
connection
: Das API-Verbindungsobjekt (erforderlich).model
: Das für die Vervollständigung zu verwendende Modell.temperature
: Steuert die Zufälligkeit. Höhere Werte (bis zu 1) erzeugen mehr zufällige Ausgaben, während niedrigere Werte deterministischere Ausgaben erzeugen.topP
: Der Kernprobenparameter. Es gibt die Wahrscheinlichkeitsmasse an, die mit der Vorhersage abgedeckt werden soll.stop
: Ein Array von Strings. Das Modell stoppt die Generierung, wenn es auf eine dieser Zeichenfolgen stößt.maxTokens
: Die maximale Anzahl der zu generierenden Token.presencePenalty
: Eine Strafe für die Verwendung bereits verwendeter Token.frequencyPenalty
: Eine Strafe für die Verwendung häufiger Token.functions
: Die Werkzeugfunktionen (auch „Aktionen“ genannt), die dem Modell zur Verfügung gestellt werden sollen.functionCallMode
: Der Funktionsaufrufmodus: .auto
, .none
oder .specific
.Die Antwortnachrichten werden automatisch an den Thread angehängt, sodass Sie weiterhin mit ihm interagieren können, indem Sie einfach neue Benutzernachrichten hinzufügen und zusätzliche Vervollständigungen anfordern.
Sie können jeden Aufruf so anpassen, dass er bei nachfolgenden Aufrufen im selben Thread mit unterschiedlichen Werten für dieselben Parameter complete(using:)
, wenn Sie möchten:
let completion = try await chatThread . complete (
using : openAIAPIConnection ,
model : . gpt35Turbo ,
temperature : 0.5 ,
maxTokens : 300
)
Generieren Sie einen Abschluss mit Streaming mithilfe der Streaming-Version eines Chat-Threads:
let chatThread = ChatThread ( ) . withStreaming ( )
let completionStream = try await chatThread . complete ( using : openAIAPIConnection )
for try await messageChunk in completionStream {
print ( " Received message chunk: ( messageChunk ) " )
}
Genau wie bei der nicht gestreamten Vervollständigung wird die Nachricht nach Abschluss des Streamings automatisch an den Thread angehängt, aber im Stream können Sie sehen, wie sie eintrifft.
Um die Nutzung (die Anzahl der in der Eingabeaufforderung und Vervollständigung verwendeten Token) einzubeziehen, fügen Sie set streamOptions
in der complete
Methode hinzu. Die Verwendung ist als Eigenschaft von StreamableChatThread
verfügbar, nachdem der Stream abgeschlossen ist.
let chatThread = ChatThread ( ) . withStreaming ( )
let completionStream = try await chatThread . complete ( using : openAIAPIConnection , includeUsage : true )
for try await messageChunk in completionStream {
print ( " Received message chunk: ( messageChunk ) " )
}
if let usage = completionStream . usage {
print ( " Usage: ( usage ) " )
}
Berechnen Sie die Token-Anzahl für Nachrichten im Chat-Thread:
let tokenCount = try chatThread . tokenCount ( )
Wenn Sie außerhalb eines Chat-Threads Token zählen oder Text kodieren/dekodieren müssen, verwenden Sie die TokenEncoder
Klasse:
let tokenEncoder = try TokenEncoder ( model : . gpt3 )
let encodedTokens = try tokenEncoder . encode ( text : " Hello, world! " )
let decodedText = try tokenEncoder . decode ( tokens : encodedTokens )
CleverBird
unterstützt Funktionsaufrufe. Mit dieser leistungsstarken Funktion können Entwickler ihre eigenen benutzerdefinierten Befehle definieren und so das Verhalten der KI einfacher steuern. Funktionsaufrufe können in den ChatThread
eingebunden und in der Methode complete()
verwendet werden.
Definieren Sie zunächst Ihre Funktionsparameter und die Funktion selbst. Die Function.Parameters
Klasse wird zum Festlegen der Eigenschaften und erforderlichen Parameter Ihrer Funktion verwendet.
let getCurrentWeatherParameters = Function . Parameters (
properties : [
" location " : Function . Parameters . Property ( type : . string ,
description : " The city and state, e.g. San Francisco, CA " ) ,
" format " : Function . Parameters . Property ( type : . string ,
description : " The temperature unit to use. Infer this from the user's location. " ,
enumCases : [ " celsius " , " fahrenheit " ] )
] ,
required : [ " location " , " format " ] )
let getCurrentWeather = Function ( name : " get_current_weather " ,
description : " Get the current weather " ,
parameters : getCurrentWeatherParameters )
Initialisieren Sie dann Ihren ChatThread
mit Ihrer API-Verbindung und einer Reihe von Funktionen:
let chatThread = ChatThread ( functions : [ getCurrentWeather ] )
. addSystemMessage ( content : " You are a helpful assistant. " )
Rufen Sie abschließend die Funktion complete(using:)
auf, um eine Antwort zu generieren. Wenn der Assistent während des Gesprächs eine Funktion ausführen muss, verwendet er die von Ihnen bereitgestellten Funktionsdefinitionen.
Bitte beachten Sie, dass Funktionen derzeit nur in Nicht-Streaming-Abschlüssen unterstützt werden.
Die EmbeddedDocumentStore
-Klasse bietet eine praktische Möglichkeit, eine Sammlung von Dokumenten basierend auf ihrer Ähnlichkeit zu verwalten und abzufragen. Dieser Kurs ermöglicht Ihnen:
Fügen Sie zunächst eine Instanz des EmbeddedDocumentStore
zu Ihrem Code hinzu:
let openAIAPIConnection = OpenAIAPIConnection ( apiKey : " your_api_key_here " )
let embeddedDocumentStore = EmbeddedDocumentStore ( connection : connection )
Sie können dem Speicher ein einzelnes Dokument oder einen Stapel von Dokumenten hinzufügen.
let singleDocument = " My single document "
try await embeddedDocumentStore . embedAndStore ( singleDocument )
let documentCollection = [ " First document " , " Second document " , " Third document " ]
try await embeddedDocumentStore . embedAndStore ( documentCollection )
Sie können den Speicher nach Dokumenten abfragen, die einem Eingabedokument ähneln.
let similarityResults = try await embeddedDocumentStore . queryDocumentSimilarity ( " Query text here " )
let mostSimilarResult = similarityResults . first ? . document ?? " No result returned "
Der Speicher kann zur dauerhaften Speicherung in einer Datei (dargestellt im JSON-Format) gespeichert und aus dieser geladen werden.
embeddedDocumentStore . save ( to : fileURL )
embeddedDocumentStore . load ( from : fileURL )
CleverBird
wurde ab 2023 von BT Franklin (@btfranklin) geschrieben und ist unter der MIT-Lizenz lizenziert. Siehe LICENSE.md.