1 个不稳定版本
0.1.0 | 2022 年 1 月 21 日 |
---|
#14 in #合成
44KB
883 行
准备
您必须有一个 API 密钥才能使用此库。
为了获取 API 密钥,您必须在 TextSynth 上创建一个账户。
注册并验证您的电子邮件地址后,您将获得一个 API 密钥。
基本用法
最常用的类型和特质在 prelude
中。首先导入它们
use textsynth::prelude::*;
我们现在需要创建一个 TextSynth
实例。这是我们可以创建引擎的地方,下面将进一步解释。将您在准备阶段获得的 API 密钥传递给 TextSynth::new
。
let api_key = String::from("<your-api-key>");
let textsynth = TextSynth::new(api_key);
我们现在需要创建一个 Engine
。一个 Engine
是有趣事情发生的地方。这是您可以完成文本和记录概率的地方。
然而,要创建一个引擎,我们需要提供一个定义,一个 EngineDefinition
。一个 EngineDefinition
是 TextSynth API 需要的信息,以确定应使用哪个引擎。它还确定了在文本完成中可以使用多少最大令牌。
通常,您可以使用 EngineDefinition::GptJ6B
来使用 GPT-J 模型。还有其他模型可用,但这个可能是您最常用的。
let engine = textsynth.engine(EngineDefinition::GptJ6B);
让我们开始有趣的吧。
记录概率
这是在上下文之后生成续写的概率的对数。当只有少数答案(如是/否)可能时,可用于回答问题。它还可以用于基准测试模型。
您需要向此函数提供两个参数
- 一个
context
,您希望预测其续写的文本,以及 - 一个
continuation
,一个非空字符串,您希望将其与context
进行预测。
let context = String::from("The quick brown fox jumps over the lazy");
let continuation = String::from(" dog");
let continuation = NonEmptyString::new(continuation)?;
let log_probabilities = engine.log_probabilities(context, continuation).await??;
log_probabilities
是 LogProbabilities
类型,其中包含 API 的结果。它包含多个字段。
log_probability
:这是在上下文之前生成的延续概率的对数。它总是 <= 0。is_greedy
:如果continuation
将通过从continuation
进行贪婪采样生成,则true
。total_tokens
:表示令牌的总数。它有助于估计请求使用的计算资源数量。
println!("log probability = {}", log_probabilities.log_probability());
println!("is greedy = {}", log_probabilities.is_greedy());
println!("total tokens = {}", log_probabilities.total_tokens());
文本补全
由于这里我们只展示基本用法(更多高级用法请参阅文档),我们将只关注大多数用户感兴趣的部分。
为了开始文本补全的过程,我们需要提供一个 prompt
,即输入文本。
let prompt = String::from("Once upon a time, there was")
let text_completion = engine.text_completion(prompt);
这创建了一个构建器,其中包含许多方法,但我们只关注最常见的一些。
即时文本补全
嗯,"即时"文本补全。您仍需要等待 API 返回结果。
这将获取整个结果,而不会将其分成多个块。
let text_completion = text_completion.now().await??;
text
字段包含生成的文本本身。
println!("{}", text_completion.text());
流式文本补全
这返回一系列文本补全。
let text_completion = text_completion.stream().await?;
遍历它,您可以得到 text
。
// due to `async` limitations, we must iterate like this
while let Some(text_completion) = text_completion.next().await {
let text_completion = text_completion???;
print!("{}", text_completion.text());
io::stdout().flush()?;
}
示例
示例可以在 examples
目录中找到。
应用
使用此库的程序是 synthtext 程序。
许可证
此软件采用 MIT 许可证。
依赖项
~4–18MB
~247K SLoC