飞书文档携手 GPT,成就网课平台自动跟课 - 飞书官网
解决方案

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

飞书

2024-12-23

推荐理由​
一、关于我们----AGI学堂​
二、需求分析​
三、方案调研​
四、开发流程​
五、更多相关开发心得​
六、后继​
作者:葛云飞​
推荐理由​
用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. 惶恐: 太省心了,这工具提效会不会把自己给提没吖 :)​
​
预约飞书企业效能顾问 深度诊断企业痛点,定制专属 AI 办公方案

先进团队,先用飞书

欢迎联系我们,飞书效能顾问将为您提供全力支持
分享先进工作方式
输送行业最佳实践
全面协助组织提效
标题标题标题标题标题标题标题标题标题标题标题标题标题标题标题标题标题标题

字节跳动旗下 AI 工作平台

联系我们立即试用