当前位置: 首页 > news >正文

如何用.net做网站网页制作教程零基础合集

如何用.net做网站,网页制作教程零基础合集,什么是网络设计图,中小企业网站制作广州网络服务公司找赛合公司代码已经开源:🚀 fgpt 欢迎大家star⭐和fork 👏 ChatGPT现在免费提供了GPT3.5的Web访问,不需要注册就可以直接使用,但是,它的使用方式是通过Web页面,不够方便。 更多技术分享关注 入职啦&…

代码已经开源:🚀 fgpt 欢迎大家star⭐和fork 👏

ChatGPT现在免费提供了GPT3.5的Web访问,不需要注册就可以直接使用,但是,它的使用方式是通过Web页面,不够方便。

更多技术分享关注 入职啦(https://ruzhila.cn/?from=csdn)

Shell-GPT 是一个流行的OpenAI 命令行工具,可以调用ChatGPT的API,但是它需要注册并获取API密钥,并且需要Python环境,对于一些不熟悉Python的用户来说,可能不太方便。

无依赖命令行使用GPT还是非常方便的,因此我决定用Rust实现一个类似的工具💡,不需要注册就可以直接使用,支持CLIOpenAI API代理的两种模式, 实际的运行效果:

在这里插入图片描述

📖 文章系列分为三部分发布,记录完整的过程:

  • 基于ChatGPT的Web API实现基本的调用,内置支持代理(这个很重要)
  • 完善命令行的功能: 支持代码、文件输入、交互式输入等
  • 实现OpenAI API代理,兼容OpenAI的OpenAPI接口, 等同于免费使用GPT3.5的API

ChatGPT的Web API工作流程

通过分析ChatGPT的Web API,我们可以发现它的工作流程如下:

  • 调用backend-anon/sentinel/chat-requirements接口,获取一个token
  • 调用backend-anon/conversation接口,基于SSE获取聊天的结果

所以要做的事情,就是根据这个流程,用Rust实现完整的流程,已达到调用ChatGPT的目的。

我设计了一个简单的使用方式:

fgpt "输出一段python代码,实现字符串反转"

fgpt这个命令行工具,会调用ChatGPT的Web API,返回一段Python代码,并且根据SSE实现打字机的效果和交互式的输入。

需要用到哪些Rust的库(第一个版本)

第一个版本目标是完成基本的调用,所以只需要能使用命令行参数、发送HTTP请求、序列化和反序列化、日志输出、生成uuid、正则表达式匹配、实现Stream的功能等。

第一个版本大概需要用到以下几个库:

  • clap 用于解析命令行参数
  • reqwest 用于发送HTTP请求
  • tokio 用于异步编程
  • serde 用于序列化和反序列化
  • logenv_logger 用于日志输出
  • uuid用来生成uuidregex 用于正则表达式匹配
  • featuresBytes 用于实现Stream的功能

程序结构分析

fgpt的代码结构如下:

mpi@mpis-Mac-mini fgpt % ls src 
cli.rs          main.rs         proxy.rs        fgpt.rs

主要的代码实现在src/fgpt.rs中,src中包含了cli.rsproxy.rs两个模块,分别实现了CLIOpenAI API代理的功能。

fgpt.rs 的实现

命令行API代理只是呈现的方式不同,但是实现的逻辑是一样的,背后调用的都是fgpt.rs的逻辑。

所以我基于Stream的特性,设计了一个能够支持CLIAPI代理的通用的Stream,可以充分利用好``Stream`的特性:

pub(crate) struct CompletionStream {response_stream: Pin<Box<dyn Stream<Item = Result<Bytes, reqwest::Error>> + Send>>,
}impl Stream for CompletionStream {type Item = reqwest::Result<String>;fn poll_next(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Option<Self::Item>> {match self.response_stream.as_mut().poll_next(cx) {Poll::Ready(Some(Ok(data))) => {....},}}}
}/// 调用实现这样的效果,这样就可以支持CLI和API代理
let stream = CompletionStream::new(reqwest::Client::new(), url, token);
while let Some(result) = stream.next().await {println!("{}", result.unwrap());
}

解析Web API的返回结果

ChatGPT的返回结果是一个SSE的流,从测试的情况来看,返回有3种情况:

  • data: {"message": .... } 表示返回的是聊天的结果
  • data: 2024-03-12 12:12:14.12 表示这个是一个心跳包
  • data: [DONE] 表示当前的聊天结束

根据这个特点,实现了一个Enum用来表示这三种情况:

enum ChatGPTResponse {Data(CompletionResponse),Done,Heartbeat,Text(String),
}

为了考虑后续的兼容性,当出现消息不能被CompletionResponse解析当时候,还能够返回原始的消息,多兼容了一个Text当类型:

CompletionResponse是根据ChatGPT返回的消息解析出来的结构体,不展开讨论

impl From<&BytesMut> for CompletionEvent {fn from(line: &BytesMut) -> CompletionEvent {...serde_json::from_str(line_str).map(CompletionEvent::Data).unwrap_or(CompletionEvent::Text(line_str.to_string()))}}
}

如何实现打字机的效果

根据OpenAI的OpenAPI文档,我们可以知道,ChatGPT的返回结果是一个Delta的结果,也就是说,每次返回的结果都是上一次的增量。

但是Web API并没有这个Delta的字段,每次返回都是完整的结果,所以我们需要自己实现这个效果。 这个实现也是比较简单,就是保留上一次的结果,然后和当前的结果进行比较,然后输出差异部分, 实际上用的是strip_prefix这个函数:

let mut textbuf = String::new();while let Some(message) = stream.next().await {match message {Ok(crate::fgpt::CompletionEvent::Data(message)) => {let text = message.message.content.parts.join("\n");let delta_chars = text.strip_prefix(textbuf.as_str()).unwrap_or(text.as_str());textbuf = text.clone();print!("{}", delta_chars);let _ = std::io::stdout().flush();}}....}

为了实现打字机的效果,print!(..)之后,需要flush一下,这样才能实现效果,否则会等到换行的时候才输出,不符合我们的预期。

总结

这个工具是昨天开始构思,下午吃完饭的时候开始写,晚上就写完第一个可以运行的版本,总共写了410行的Rust代码,明天会继续完善功能,实现更多的功能,比如支持文件输入、代码输入、交互式输入等。

可以加群学习
在这里插入图片描述

http://www.sczhlp.com/news/55133/

相关文章:

  • 网站后台框架模版网页设计心得体会600
  • 网络优化工程师工作内容网站运营之怎样做好seo优化
  • 网站平台多少钱白沙网站建设的基本情况
  • 学校网站php源码浙江可以做会计题目的网站
  • 联雅网站建设公司wordpress固定链接设置访问出错
  • 凝血酶适配体筛选新方法:PEG 水凝胶一步富集,无需阴性筛选
  • P1383 高级打字机
  • 加强检察院门户网站建设网站专题制作
  • php做各种网站类型得模板良品铺子网站规划和建设
  • 网站建设先进个人材料临河网站建设
  • 网站后台功能需求wordpress 本地文章
  • 制作网站需要wordpress蓝色网站欣赏
  • 有没有做网站的软件个体户做盈利网站
  • 做游戏网站主页的素材安徽省建设工程造价管理网站
  • 男女直接做的视频 视频网站go语言做的网站
  • 网页设计师联盟网站怎么.net电子商务网站开发
  • 网站租用 凡手机上自己设计房子软件
  • 免费网站模板在哪下载保险购买平台有哪些
  • 做薪酬调查有哪些网站网站搜索引擎推广
  • 网站制作换下面友情连接wordpress出现error
  • 文章类型的网站模版配置WordPress爬网规则
  • 能利用双股铜芯电话线做网站吗三站合一 网站建设
  • AI数学奥林匹克金牌级突破技术解析
  • 在AI技术唾手可得的时代,挖掘新需求成为核心竞争力——某知名PHP AI框架需求洞察
  • 网站开发有哪几个阶段公众号开发者绑定
  • 苏州门户网站建设公司网站推广技巧
  • 排名好的郑州网站建设php如何自学做网站
  • 毕业设计做网站有什么好处姑苏区网站建设
  • 杭州做产地证去哪个网站苏州行业网站建设费用
  • 北京网站建设制作哪家公司好WordPress装不上jetpack