前言
本文主要记录我自身使用 C# 对接 OpenAI 对接接口的一些简要步骤,希望对大家有所帮助。
Betalgo.OpenAI
gitHub Betalgo.Open 开源地址
betalgo/openai: OpenAI .NET sdk – ChatGPT (github.com)
详细步骤
1、配置你的 OpenAI key 由官网提供
OpenAI API 官网地址
可能需要你充一点 Money
这里就是你的每日费用统计。
2、OpenAI API 介绍
你完全可以选择 Http 调用,OpenAI 给了你传统Restful接口的调用方法。
arduino复制代码curl https://api.openai.com/v1/chat/completions
-H "Content-Type: application/json"
-H "Authorization: Bearer $OPENAI_API_KEY"
-d '{
"model": "gpt-3.5-turbo",
"messages": [{"role": "user", "content": "Say this is a test!"}],
"temperature": 0.7
}'
OpenAI的记住对话功能:
- 其实就是用
role
和content
来实现的: role 指定角色
这是一个使用curl命令向OpenAI API发送请求的示例。该请求使用POST方法发送JSON数据到api.openai.com/v1/chat/com…
在请求中,使用了两个自定义的HTTP标头:
"Content-Type: application/json"
指定了请求的内容类型为JSON。"Authorization: Bearer $OPENAI_API_KEY"
包含了一个Bearer令牌,用于身份验证和授权。$OPENAI_API_KEY
为你第一步注册的 key。
请求的主体是一个JSON对象,包含了以下字段:
- “model”指定了要使用的模型的名称,这里是”gpt-3.5-turbo”。
- “messages”是一个包含了用户消息的数组,每条消息都包含了”role”和”content”字段,指定了消息的角色和内容。
- “temperature”指定了用于生成回复的多样性参数,值为0.7。
这种方式非常简单,但是弊端就是响应速度非常非常的慢,特别是你的回答的内容字数非常多时候,响应速度令人发指。这种方式肯定有能用到的地方,但是基于目前的需求,我们还是选择另一种请求方式-流式响应。
3、OpenAI 流式响应
只需要在消息体json中加入stream=True
。
流式响应协议 SSE 具体请看我的另一篇文章:
聊天无障碍:OpenAI SSE 协议的流式响应 & Chatgpt带给我的反思 – 掘金 (juejin.cn)
虽然官方给出了流式响应的示例,但是只有 python 和 js 的。C#官方没有给出,请看下文。
4、加入 Betalgo.OpenAI 依赖
xml复制代码<ItemGroup>
<PackageReference Include="Betalgo.OpenAI" Version="7.4.1" />
</ItemGroup>
或者直接 NuGet 搜索 Betalgo.OpenAI 搜索下载。
5、将 OpenAIService 接口注入IOC
ini复制代码builder.Services.AddOpenAIService(settings =>
{
settings.ApiKey = options.ApiKey;
settings.BaseDomain = options.BaseDomain;
});
6、接口实例
一个整套的C#流式响应的过程,仅供参考~
Controller 层
c#复制代码[HttpPost("text", Name = "ChatText")]
public async Task<IActionResult> ChatText([FromBody] List<ChatMessage> messages)
{
try
{
HttpContext.Response.ContentType = "text/event-stream";
HttpContext.Response.Headers.Add("Cache-Control", "no-cache");
HttpContext.Response.Headers.Add("Connection", "keep-alive");
await foreach (var s in _chatOpenAIService.ChatOpenAI(messages))
{
await HttpContext.Response.WriteAsync(s);
await HttpContext.Response.Body.FlushAsync();
}
}
catch (Exception e)
{
Log.Error(e,"");
}
return new EmptyResult();
}
IService 层
c#复制代码public interface IChatOpenAIService
{
public IAsyncEnumerable<string> ChatOpenAI(List<ChatMessage> messages);
public Task<AIName> getAIName(long id);
}
Service 层
c#复制代码public async IAsyncEnumerable<string> ChatOpenAI(List<ChatMessage> messages)
{
var completionResult = _openAiService.ChatCompletion.CreateCompletionAsStream(new ChatCompletionCreateRequest
{
Messages = messages,
Model = Models.ChatGpt3_5Turbo,
MaxTokens = 1000
});
await foreach (var completion in completionResult)
{
if (completion.Successful)
{
Console.Write(completion.Choices.First().Message.Content);
yield return completion.Choices.First().Message.Content;
}
else
{
if (completion.Error == null)
{
throw new Exception("Unknown Error");
}
Console.WriteLine($"{completion.Error.Code}: {completion.Error.Message}");
}
}
}
总结
一定要多思考,如果人永远待在舒适圈的话,人永远不会成长。共勉
觉得作者写的不错的,值得你们借鉴的话,就请点一个免费的赞吧!这个对我来说真的很重要。૮(˶ᵔ ᵕ ᵔ˶)ა