TypeChat.NET
TypeChat.NET 将 TypeChat 的理念引入 .NET。
TypeChat.NET 提供 跨平台 库,帮助您使用强类型、类型验证和简单类型安全程序(计划)构建自然语言接口。强类型可能有助于使使用语言模型的软件更加确定和可靠。
// 将用户意图转换为强类型的日历操作
var model = new LanguageModel(Config.LoadOpenAI());
var translator = new JsonTranslator<CalendarActions>(model);
// 翻译自然语言请求
CalendarActions actions = await translator.TranslateAsync(requestText);
TypeChat.NET 正在 积极开发 中,并频繁更新。随着团队探索该领域并融入反馈,该框架将不断发展。包含的 示例 中展示了支持的场景。文档也会不断改进。如有疑问,请查看代码。
程序集
TypeChat.NET 目前包括以下程序集:
-
Microsoft.TypeChat:将用户意图翻译为强类型和验证对象的类。
-
Microsoft.TypeChat.Program:合成、验证和运行 JSON 程序 的类。
-
Microsoft.TypeChat.SemanticKernel:与 Microsoft Semantic Kernel 的集成,用于模型、插件、嵌入和其他功能。
Microsoft.TypeChat
TypeChat 使用语言模型将用户意图翻译成符合模式的 JSON。然后验证该 JSON 并将其反序列化为类型化对象,必要时应用额外的约束检查。验证错误会返回给语言模型,语言模型使用这些错误来修复它最初返回的 JSON。
TypeChat 提供:
- JSON 翻译、验证、修复和反序列化
- 可扩展性:自定义模式、验证器和提示的接口
- 模式导出:生成您想要翻译到的 .NET 类型的模式的类。导出的模式包括依赖项和基类。导出的模式使用 Typescript 指定,它可以简洁地表达 JSON 对象的模式。
- TypeChat 示例中展示了常见场景的支持。当您遇到限制(例如当前如何导出泛型)时,您可以提供模式文本,例如手动编写的 Typescript。
- 词汇表和注释的辅助属性。词汇表是约束可以分配给字符串属性的值的字符串表。词汇表的动态加载支持运行时变化的场景。
- 注意:与 TypeChat 一样,TypeChat.NET 仅使用 Typescript 指定的模式进行测试。
[Comment("目前库存的牛奶")]
public class Milks
{
[JsonVocab("全脂牛奶 | 低脂牛奶 | 脱脂牛奶 | 豆奶 | 杏仁奶")]
public string Name { get; set; }
}
Microsoft.TypeChat.Program
TypeChat.Program 将自然语言请求翻译为简单程序(计划),用 JSON 表示。
JSON 程序可以被视为使用 JSON 表达和强制执行相关语法的DSL或计划。JSON 程序可以针对它们所目标的 API 进行类型检查,然后可以使用解释器运行,或编译成 .NET 代码。
TypeChat.Program 包括:
- 程序翻译:将用户意图翻译成遵循 Program Grammar 的程序
- 程序解释器:使用解释器运行由 ProgramTranslator 生成的程序。
- 程序编译器:使用动态语言运行时(DLR)编译具有类型检查的程序/计划。编译诊断用于修复程序。
// 将用户意图翻译为调用数学 API 方法的类型化程序
var model = new LanguageModel(Config.LoadOpenAI());
var api = new MathAPI();
var translator = new ProgramTranslator<IMathAPI>(model, api);
// 翻译自然语言请求
Program program = await translator.TranslateAsync(requestText);
// 运行程序
program.Run(api);
Microsoft.TypeChat.SemanticKernel
TypeChat.SemanticKernel 使用 Semantic Kernel 1.0。 它包括以下类:
- 插件的 Json 程序:将注册的插件转换为 JSON 程序可以目标的 API。参见 插件示例。
- 使用 Semantic Kernel 访问语言模型和嵌入。
TypeChat.NET 的早期版本使用 Semantic Kernel 的预发布编程模型。您可以使用 sk_prerelease 分支访问此弃用版本。
入门
前提:OpenAI
- OpenAI 语言模型:TypeChat.NET 及其示例目前需要熟悉并访问 OpenAI 的语言模型。
- TypeChat.NET 已测试并支持以下模型:
- gpt-35-turbo
- gpt-4
- ada-002
- 有些示例和场景在 gpt-4 上效果最好
构建
- Visual Studio 2022
- 从根目录加载 typechat.sln
- 还原包
- 构建
- dotnet build
- 启动命令提示符/终端
- 转到项目的根目录
- dotnet build Typechat.sln
Nuget 包
- Microsoft.Typechat
dotnet add package Microsoft.TypeChat
- Microsoft.TypeChat.Program
dotnet add package Microsoft.TypeChat.Program
- Microsoft.Typechat.SemanticKernel
dotnet add package Microsoft.TypeChat.SemanticKernel
示例
要了解 TypeChat.NET 的实际效果,请浏览 示例项目 和 TypeChat.Examples 库。
每个示例都包括一个含有示例输入的 input.txt 文件。传递输入文件作为参数以 批处理模式 运行示例。
下面的部分描述了哪些示例最适合介绍哪些概念。某些示例或场景在 gpt-4 上效果最好。
Hello World
情感分析 示例是 TypeChat 的 Hello World,也是 JsonTranslator 的简单介绍。
JsonTranslator
以下示例演示了如何使用 JsonTranslator、模式和词汇:
分层模式
- 多模式:动态地将用户意图路由到其他子应用。
- 模式层次结构:使用多个子 JsonTranslator 的 Json Translator。针对每个用户请求,它选择语义上最接近的子翻译器并将输入路由到它。
- 文本分类器 和 向量文本索引 展示了如何建立一个简单的分类器来路由输入。
Json 程序
交互式代理
- 健康数据:如何使用交互式机器人收集用户的健康信息。
- 代理类:用于处理具有历史记录的交互式代理。这些类展示了如何使用 TypeChat.NET 进行强类型的与消息传递代理或机器人的交互。这些代理可以包括内置交互历史等功能。
API 密钥和配置
要使用 TypeChat.net 或运行示例,您需要 OpenAI 服务的 API 密钥。支持 Azure OpenAI 和 OpenAI 服务。
配置示例的 API 密钥
- 转到解决方案中的 示例 文件夹。
- 复制 appSettings.json 文件并命名为 appSettings.Development.json。确保它与 appSettings.json 位于同一文件夹。
- appSettings.Development.json 是 appSettings.json 中设置的本地开发仅覆盖文件,永远不会被签入。
- 将您的 API 密钥添加到 appSettings.Development.json。
一个典型的 appSettings.Development.json 可能如下所示:
// 针对 Azure OpenAI 服务
{
"OpenAI": {
"Azure": true,
"ApiKey": "您的 API 密钥",
"Endpoint": "https://YOUR_RESOURCE_NAME.openai.azure.com",
"Model": "gpt-35-turbo" // Azure 部署名
}
}
// 针对 OpenAI 服务:
{
"OpenAI": {
"Azure": false,
"ApiKey": "您的 API 密钥",
"Endpoint": "https://api.openai.com/v1/chat/completions",
"Model": "gpt-3.5-turbo" // OpenAI 模型名
}
}
OpenAIConfig
TypeChat 示例使用 LanguageModel 类访问语言模型。OpenAIConfig 类为 LanguageModel 提供配置。您可以从应用程序的配置、Json 文件或环境变量中初始化 OpenAIConfig。 参见 OpenAIConfig.cs 了解:
- 可配置属性
- 支持的环境变量
// 您的配置
OpenAIConfig config = Config.LoadOpenAI();
// 或 Json 文件
OpenAIConfig config = OpenAIConfig.LoadFromJsonFile(...);
// 或从配置
config = OpenAIConfig.FromEnvironment();
var model = new LanguageModel(config);
使用 Semantic Kernel
您还可以使用 SemanticKernel Kernel 对象访问一个由 KernelBuilder 创建的 LanguageModel。
const string modelName = "gpt-35-turbo";
new ChatLanguageModel(_kernel.GetService<IChatCompletionService>(modelName), modelName);
使用您自己的客户端
TypeChat 通过 ILanguageModel 接口访问语言模型。LanguageModel 实现了 ILanguageModel。
您可以通过实现 ILanguageModel 来使用您自己的模型客户端。如果您不使用上述列出的一种 OpenAI 模型,则可能还需要提供适合您模型的 JsonTranslatorPrompts。
行为准则
此项目采用了 Microsoft 开源行为准则。 有关更多信息,请参见 行为准则 FAQ 或联系 opencode@microsoft.com 以提出任何其他问题或意见。
许可证
版权所有 (c) Microsoft Corporation. 保留所有权利。
根据 MIT 许可证授权。
商标
此项目可能包含项目、产品或服务的商标或徽标。Microsoft 商标或徽标的授权使用需遵守且必须符合 Microsoft 商标和品牌指南。 在修改版本的此项目中使用 Microsoft 商标或徽标不得引起混淆或暗示 Microsoft 的赞助。 使用任何第三方商标或徽标需遵守这些第三方的政策。