飞书文档携手GPT,成就网课平台自动跟课

飞书文档携手GPT,成就网课平台自动跟课

开发者广场内容精选NaN-NaN-NaN
解决方案
作者:葛云飞
推荐理由
用AI为自己提效,省时,省心,省力!!!
一、关于我们---- AGI学堂
关于我:
  1. 老拐瘦&拐爷 朋友们都叫我老拐
  1. 毕业于哈尔滨工业大学,17年工作经验,工作中使用过C#/Java/Golang/Node/Openresty/Python/JS
  1. 公众号IT老拐瘦主理
  1. 某智能家居企业AIGC产研经理
  1. 某大模型课程助教团成员之一
关于我们
  1. 全网最火的大模型课程
  1. 每天都在更新的课程大纲
  1. 狂卷的主讲老师和教研团队
  1. 为了避免广告问题,此处略去5000字介绍 :)
二、需求分析
作为助教团的一员,我们工作主要有以下几项:
  1. 教研工作,追踪网上最新的大模型技术发展动态,协助老师更新课程内容;
  1. 群内答疑,对学员的问题及时跟踪反馈;
  1. 跟课辅助,在直播期间跟踪直播间内同学的发言互动,收集相关问题,并将问题整理成飞书文档,供老师在课程结束前进行进集中答疑。
其中1,2 的工作时间相对自由,但是第3项呢,就特别卡时间,而且随着滚动开班,跟课工作量越来越大,几千人在线,一分钟上百条的留言,助教跟下来真可谓心力交瘁。
那么,这个工作有没有可能自动完成
咱可是程序员,这么重复规律的工作,只用人工真是太麻烦了。
三、方案调研
说干就干,先解析一下主要的工作量:
  1. 需要系统可以对接飞书文档,即可以自动创建,编辑飞书文档,查了一下最新的飞书开放平台的API,嘿嘿,分分钟钟:
  1. 系统有没有可能拿到用户的聊天信息呢?
  1. 在跟课的过程中,打开平台,发现有一些调用来自一个叫bokecc.com的域名
  1. 打开这个网站,好家伙,原来是一个提供直播技术平台的第三方公司
  1. 顺藤摸瓜,找到了他们的直播SDK直 播 SDK API · GitBook相关api_3
  1. 在一次跟课的过程中,迅速实现了一个前端Demo ,不错,成功取到直播画面和用户聊天信息
到此为止,所有的技术上需要确认的点都已经完成和走通,下面可以开始实际的开发了。
四、开发流程
咱不玩虚的,直接上代码 :)
前端收集消息的部分
// 直播间初始化
DWLive.init({
userid: USERID,
roomid: room_id,
viewername: "值班助教-"+userInfo.name,
viewertoken: TOKEN,
pcH5Live: true,
viewercustominfo: '{"exportInfos": [ {"key": "城市", "value": "北京"}, {"key": "姓名", "value": "哈哈"}]}',
});
// other codes
// 接收并转发聊天消息到服务端
DWLive.onPublicChatMessage=(data: any) => {
console.log(data);
data = JSON.parse(data);
const msg = new Message(data.username, data.msg,data.chatId,data.time);
// 本地判断是否重复
if (messages.some(p=>p.msg_id===msg.msg_id)===false){
// 发送到服务端
postChatMsg(msg.username,msg.msg,room_id,msg.time,msg.msg_id,store_type).then((res:any)=>{
if (res.data) {
// 更新UI
setMessages((messages) => [...messages, res.data]);
}
})
}
};
后端对消息的处理
后端接到消息以后,逻辑其实很简单,即:
  1. 判断是否是一个和课程相关的问题(问AI哦)
  1. 判断类似的问题是否还没有收集到文档里(也要问AI哦)
  1. 如果1,2都满足,更新到飞书文档中
飞书文档的建立是在后台配置课程时建立的
关键代码
## 1. 判断是否是大纲相关的提问
prompt = prompt_info.prompt.format(outlines=outlines,question_list =question_list,user_input=user_msg)
trace_out = ""
# app.logger.info("prompt:{}".format(prompt))
if user_msg.isdigit() or store_type == 0:
# store_type == 0 只保存消息,不做任何处理
response = "N"
trace_out="未选中"
else:
response = invokeChat(app,MODEL,prompt,trace,"teacher-assistant-outline")
status = 0
## 2. 如果是大纲相关的提问,判断是否是已有提问列表中有相似问题
if parse(response) == "Y":
if store_type == 1:
# store_type == 1 不做去重处理,直接保存
response = "N"
trace_out="课程相关问题"
else:
# 去重处理
prompt = PROMPT.format(question_list =question_list,user_input=user_msg)
response = invokeChat(app,"gpt-3.5-turbo-1106",prompt,trace,"teacher-assistant-question")
if response== "N":
span = trace.span(name='add_to_document',metadata={"document_url":DOCUMENT_BASE+lesson.document_id})
add_start = datetime.datetime.now()
doc_res = add_text_element(app,lesson.document_id,user_name,user_msg)
doc_id = doc_res['data']['children'][0]['block_id']
app.logger.info("doc_id:{}".format(doc_id))
span.event(name='add_to_document',start_time=add_start,output=doc_res,metadata={"document_url":DOCUMENT_BASE+lesson.document_id})
span.end()
status = 1
trace_out="进入答疑清单"
else:
trace_out="重复问题"
else:
trace_out="未选中"
trace.update(output=trace_out,input=user_msg,metadata={"user_id":user_name,"room_id":room_id})
room_msg = RoomMsg(room_id,user_name,user_msg,status,msg_id,doc_id)
db.session.add(room_msg)
db.session.commit()
五、更多相关开发心得
关于创建文档的权限问题:
在申请好文档相关的API以后,反复折腾,发现也不能在相关目录下自动创建文档,后来问了飞书的客服,需要在应用下建立一个机器人,将有文档的权限的人员和机器人拉到一个群就可以了。
六、后继
  1. 老板非常喜欢这个工具,喜欢的不得了
  1. 原来累死银的跟课工作现在变成了喝茶看报轻松完成
  1. 惶恐: 太省心了,这工具提效会不会把自己给提没吖 :)
先进生产力和业务协同平台
联系我们立即试用
更多人气推荐
查看更多

先进团队,先用飞书

欢迎联系我们,飞书效能顾问将为您提供全力支持
分享先进工作方式
输送行业最佳实践
全面协助组织提效
反馈给飞书 CEO:ceo@feishu.cn