CleverBird
是一个 Swift 包,提供了一种与 OpenAI 聊天 API 交互并执行各种任务(包括令牌计数和编码)的便捷方式。该包旨在通过使聊天线程成为交互的中心来提供卓越的开发人员体验 (DX)。
CleverBird
支持文档嵌入和相似性查询。这使其成为适用于广泛应用的多功能工具,特别是在聊天提示需要增强上下文记忆的情况下。
CleverBird
专注于基于聊天的交互,并使其变得非常棒。
请注意, CleverBird
是一个非官方软件包,不是 OpenAI 本身提供的。
TokenEncoder
类促进令牌计数和编码。EmbeddedDocumentStore
类来管理和查询文档相似性。 导入CleverBird
包:
import CleverBird
使用您的 API 密钥初始化OpenAIAPIConnection
。请注意,API 密钥应始终从环境变量加载,而不是硬编码到源中。加载 API 密钥后,将其传递给连接的初始化程序:
let openAIAPIConnection = OpenAIAPIConnection ( apiKey : < OPENAI_API_KEY > )
创建一个ChatThread
实例并将系统、用户或助理消息添加到聊天线程:
let chatThread = ChatThread ( )
. addSystemMessage ( content : " You are a helpful assistant. " )
. addUserMessage ( content : " Who won the world series in 2020? " )
使用聊天线程并传递 API 连接生成完成:
let completion = try await chatThread . complete ( using : openAIAPIConnection )
complete(using:)
方法还包含各种可选参数:
let completion = chatThread . complete (
using : openAIAPIConnection ,
model : . gpt4o ,
temperature : 0.7 ,
maxTokens : 500
)
在上面的示例中,我们使用特定模型、温度和最大令牌数创建了一个完成。除connection
之外的所有参数都是可选的。完整参数列表如下:
connection
:API 连接对象(必需)。model
:用于完成的模型。temperature
:控制随机性。较高的值(最多 1)生成更多的随机输出,而较低的值生成更多的确定性输出。topP
:核采样参数。它指定预测覆盖的概率质量。stop
:字符串数组。当模型遇到任何这些字符串时,它将停止生成。maxTokens
:要生成的最大令牌数。presencePenalty
:对使用已经使用过的代币的惩罚。frequencyPenalty
:对使用频繁令牌的惩罚。functions
:可供模型使用的工具函数(也称为“操作”)。functionCallMode
:函数调用模式: .auto
、 .none
或.specific
。响应消息会自动附加到线程上,因此您只需添加新的用户消息并请求其他完成即可继续与其交互。
如果需要,您可以在同一线程中的后续调用中使用相同参数的不同值来自定义每个调用来complete(using:)
:
let completion = try await chatThread . complete (
using : openAIAPIConnection ,
model : . gpt35Turbo ,
temperature : 0.5 ,
maxTokens : 300
)
使用聊天线程的流式传输版本通过流式传输生成完成:
let chatThread = ChatThread ( ) . withStreaming ( )
let completionStream = try await chatThread . complete ( using : openAIAPIConnection )
for try await messageChunk in completionStream {
print ( " Received message chunk: ( messageChunk ) " )
}
就像非流式完成一样,消息在完成流式传输后将自动附加到线程上,但流允许您在消息通过时看到它。
要包含使用情况(提示和完成中使用的标记数量),请在complete
方法中添加streamOptions
。流完成后,该用法可作为StreamableChatThread
的属性使用。
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 ) " )
}
计算聊天线程中消息的令牌计数:
let tokenCount = try chatThread . tokenCount ( )
如果您需要在聊天线程之外计算令牌或对文本进行编码/解码,请使用TokenEncoder
类:
let tokenEncoder = try TokenEncoder ( model : . gpt3 )
let encodedTokens = try tokenEncoder . encode ( text : " Hello, world! " )
let decodedText = try tokenEncoder . decode ( tokens : encodedTokens )
CleverBird
支持函数调用。这一强大的功能允许开发人员定义自己的自定义命令,从而更轻松地控制人工智能的行为。函数调用可以包含在ChatThread
中并在complete()
方法中使用。
首先,定义函数参数和函数本身。 Function.Parameters
类用于设置函数的属性和所需参数。
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 )
然后,使用 API 连接和函数数组初始化ChatThread
:
let chatThread = ChatThread ( functions : [ getCurrentWeather ] )
. addSystemMessage ( content : " You are a helpful assistant. " )
最后,调用complete(using:)
函数来生成响应。如果助手需要在对话期间执行某项功能,它将使用您提供的功能定义。
请注意,目前仅在非流式完成中支持函数。
EmbeddedDocumentStore
类提供了一种根据文档的相似性来管理和查询文档集合的便捷方法。该课程允许您:
首先,将EmbeddedDocumentStore
的实例添加到您的代码中:
let openAIAPIConnection = OpenAIAPIConnection ( apiKey : " your_api_key_here " )
let embeddedDocumentStore = EmbeddedDocumentStore ( connection : connection )
您可以将单个文档或一批文档添加到商店。
let singleDocument = " My single document "
try await embeddedDocumentStore . embedAndStore ( singleDocument )
let documentCollection = [ " First document " , " Second document " , " Third document " ]
try await embeddedDocumentStore . embedAndStore ( documentCollection )
您可以在存储中查询与输入文档相似的文档。
let similarityResults = try await embeddedDocumentStore . queryDocumentSimilarity ( " Query text here " )
let mostSimilarResult = similarityResults . first ? . document ?? " No result returned "
可以将存储保存到文件(以 JSON 格式表示)中并从文件中加载以进行持久存储。
embeddedDocumentStore . save ( to : fileURL )
embeddedDocumentStore . load ( from : fileURL )
CleverBird
由 BT Franklin (@btfranklin) 从 2023 年起编写,并根据 MIT 许可证获得许可。请参阅 LICENSE.md。