CleverBird
é um pacote Swift que fornece uma maneira conveniente de interagir com as APIs de bate-papo da OpenAI e realizar várias tarefas, incluindo contagem e codificação de tokens. O pacote foi projetado para oferecer uma experiência de desenvolvedor (DX) superior, tornando o tópico de bate-papo o centro das interações.
CleverBird
inclui suporte para incorporação de documentos e consultas de similaridade. Isso o torna uma ferramenta versátil para uma ampla gama de aplicações, especialmente casos em que os prompts de bate-papo precisam de memória contextual aprimorada.
CleverBird
se concentra estritamente em interações baseadas em bate-papo e em torná-las incríveis.
Observe que CleverBird
é um pacote não oficial , não fornecido pela própria OpenAI.
TokenEncoder
.EmbeddedDocumentStore
para gerenciar e consultar semelhanças de documentos. Importe o pacote CleverBird
:
import CleverBird
Inicialize um OpenAIAPIConnection
com sua chave de API. Observe que as chaves de API devem sempre ser carregadas de variáveis de ambiente e não codificadas em sua fonte. Depois de carregar sua chave API, passe-a para o inicializador da conexão:
let openAIAPIConnection = OpenAIAPIConnection ( apiKey : < OPENAI_API_KEY > )
Crie uma instância ChatThread
e adicione mensagens do sistema, do usuário ou do assistente ao tópico de bate-papo:
let chatThread = ChatThread ( )
. addSystemMessage ( content : " You are a helpful assistant. " )
. addUserMessage ( content : " Who won the world series in 2020? " )
Gere uma conclusão usando o thread de chat e passando a conexão API:
let completion = try await chatThread . complete ( using : openAIAPIConnection )
O método complete(using:)
também inclui vários parâmetros opcionais:
let completion = chatThread . complete (
using : openAIAPIConnection ,
model : . gpt4o ,
temperature : 0.7 ,
maxTokens : 500
)
No exemplo acima, criamos um preenchimento usando um modelo específico, temperatura e número máximo de tokens. Todos os parâmetros, exceto connection
são opcionais. A lista completa de parâmetros é a seguinte:
connection
: o objeto de conexão da API (obrigatório).model
: o modelo a ser usado para a conclusão.temperature
: Controla a aleatoriedade. Valores mais altos (até 1) geram resultados mais aleatórios, enquanto valores mais baixos geram resultados mais determinísticos.topP
: O parâmetro de amostragem do núcleo. Ele especifica a massa de probabilidade a ser coberta com a previsão.stop
: uma matriz de strings. O modelo irá parar de gerar quando encontrar qualquer uma dessas strings.maxTokens
: o número máximo de tokens a serem gerados.presencePenalty
: Uma penalidade pelo uso de tokens que já foram usados.frequencyPenalty
: Uma penalidade pelo uso de tokens frequentes.functions
: as funções da ferramenta (também conhecidas como "ações") a serem disponibilizadas ao modelo.functionCallMode
: o modo de chamada da função: .auto
, .none
ou .specific
.As mensagens de resposta são anexadas automaticamente ao thread, para que você possa continuar interagindo com ele apenas adicionando novas mensagens de usuário e solicitando conclusões adicionais.
Você pode personalizar cada chamada para complete(using:)
com valores diferentes para os mesmos parâmetros em chamadas subsequentes no mesmo thread, se desejar:
let completion = try await chatThread . complete (
using : openAIAPIConnection ,
model : . gpt35Turbo ,
temperature : 0.5 ,
maxTokens : 300
)
Gere uma conclusão com streaming usando a versão de streaming de uma conversa de chat:
let chatThread = ChatThread ( ) . withStreaming ( )
let completionStream = try await chatThread . complete ( using : openAIAPIConnection )
for try await messageChunk in completionStream {
print ( " Received message chunk: ( messageChunk ) " )
}
Assim como acontece com a conclusão não transmitida, a mensagem será automaticamente anexada ao tópico após o término da transmissão, mas o fluxo permite que você a veja conforme ela está sendo transmitida.
Para incluir o uso (o número de tokens usados no prompt e na conclusão), adicione set streamOptions
no método complete
. O uso está disponível como uma propriedade de StreamableChatThread
após a conclusão do stream.
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 ) " )
}
Calcule a contagem de tokens para mensagens na conversa de chat:
let tokenCount = try chatThread . tokenCount ( )
Se você precisar contar tokens ou codificar/decodificar texto fora de um tópico de bate-papo, use a classe TokenEncoder
:
let tokenEncoder = try TokenEncoder ( model : . gpt3 )
let encodedTokens = try tokenEncoder . encode ( text : " Hello, world! " )
let decodedText = try tokenEncoder . decode ( tokens : encodedTokens )
CleverBird
oferece suporte a chamadas de função. Este poderoso recurso permite que os desenvolvedores definam seus próprios comandos personalizados, facilitando o controle do comportamento da IA. Chamadas de função podem ser incluídas no ChatThread
e usadas no método complete()
.
Primeiro, defina os parâmetros da sua função e a própria função. A classe Function.Parameters
é usada para definir as propriedades e os parâmetros necessários da sua função.
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 )
Em seguida, inicialize seu ChatThread
com sua conexão API e uma série de funções:
let chatThread = ChatThread ( functions : [ getCurrentWeather ] )
. addSystemMessage ( content : " You are a helpful assistant. " )
Finalmente, chame a função complete(using:)
para gerar uma resposta. Se o assistente precisar executar uma função durante a conversa, ele usará as definições de função que você forneceu.
Observe que as funções só são suportadas em conclusões que não sejam de streaming no momento.
A classe EmbeddedDocumentStore
fornece uma maneira conveniente de gerenciar e consultar uma coleção de documentos com base em sua similaridade. Esta classe permite que você:
Primeiro, adicione uma instância do EmbeddedDocumentStore
ao seu código:
let openAIAPIConnection = OpenAIAPIConnection ( apiKey : " your_api_key_here " )
let embeddedDocumentStore = EmbeddedDocumentStore ( connection : connection )
Você pode adicionar um único documento ou um lote de documentos à loja.
let singleDocument = " My single document "
try await embeddedDocumentStore . embedAndStore ( singleDocument )
let documentCollection = [ " First document " , " Second document " , " Third document " ]
try await embeddedDocumentStore . embedAndStore ( documentCollection )
Você pode consultar a loja em busca de documentos semelhantes a um documento de entrada.
let similarityResults = try await embeddedDocumentStore . queryDocumentSimilarity ( " Query text here " )
let mostSimilarResult = similarityResults . first ? . document ?? " No result returned "
O armazenamento pode ser salvo e carregado de um arquivo (representado no formato JSON) para armazenamento persistente.
embeddedDocumentStore . save ( to : fileURL )
embeddedDocumentStore . load ( from : fileURL )
CleverBird
foi escrito por BT Franklin (@btfranklin) de 2023 em diante e está licenciado sob a licença do MIT. Consulte LICENSE.md.