本周主要设计了与后端交互的抽象接口,并实现了对话时模型逐字逐句往外蹦的效果。
交互接口设计
与模型交互时主要需要以下操作:
- 初始化:这一步了包含了链接模型、验证用户身份等基础操作,需要在程序开始时执行。
- 开始新对话:访问模型的接口开始一轮新的对话,并清除本地保存的上一轮对话的信息。
- 继续对话:将用户的对话提交给模型,然后将模型的回答返回给用户;需要注意保存好当前对话的上下文,来保证对话的连贯性。
因此我定义模型对话的接口如下:
mixin LLMAPI{
Future init(); //初始化
Future<String> getMessage(String msg); //继续对话
Future reset(); //新对话
static LLMAPI? _instance;
static LLMAPI get instance;
}
如下是一个简单的本地的接口测试用实现,这个实现只会返回同一句话
import '../LLMAPI.dart';
class LLMAPITXT with LLMAPI{
@override
Future<String> getMessage(String msg) async{
return "没有后端\n临时测试文本";
}
@override
Future init() async{
}
@override
Future reset() async{
}
}
逐字逐句蹦出来
从日常的大模型使用过程中可以看到,大模型通常是生成一部分就输出一部分,有种逐字逐句蹦出来的感觉。为了实现这种感觉,我将接口获取的数据分割开来,一点一点地加入进界面。
结合上一部分加入的接口,现在将输入框输入完后的代码改为如下:
onSubmitted: (str)async{
if(str.isEmpty)return;
log(str);
chater.chat(str);
c.inputController.text="";
c.gen.value=true;
chater.gen("");
var msg=await c.api.getMessage(str);
for(int i=0;i<msg.length;i++){
chater.gen(msg.substring(i,i+1));
await Future.delayed(Duration(milliseconds: 50));
}
chater.finishGen();
c.gen.value=false;
},
最终效果如下: