一、小哥作业+大模型
2022年OpenAI基于GPT推出了聊天机器人ChatGPT,带来了非常惊艳的语言理解、内容生成、知识推理等能力,能够准确理解人的语言、意图,并能够回答出清晰、完整的内容,让人很难分辨出沟通交流的是人类还是机器人。
大模型会尝试基于已有的内容,生成内容的延续。基于预训练阶段加入的海量文章、电子图书、网页内容等等,大模型给出最接近我们期望的内容。比如我们提供的内容是“北京是...”,大模型扫描海量内容进行排名,为了让内容更有创造力,大模型使用了巫术,一般采用基于可配置参数(top K, top P, Temperature) 的概率随机采样来选择单词,而不是总采用排名最高的单词。通过延续生成了“北京是一座充满活力的城市”。人类反馈强化学习(RLHF)即基于人类反馈对大语言模型进行强化学习,通过人工标注来构建奖惩网络,强化学习基于奖惩网络对模型进行迭代优化,改善生成内容的质量。
快递快运终端系统是快递小哥、快运司机、网点管理者日常使用的系统,是物流作业人员最多、作业流程最末端、服务形态最多元的系统。大模型带来了新的方法来解决小哥提出的问题、遇到的异常、需要的支持,并提供帮助网点管理者进行运营和经营管理的工具。
提升小哥作业效率,就需要了解小哥日常工作中有哪些作业动作,然后根据作业动作的特点,来分析大模型有什么样的机会来实现效率提升。通过调研和分析,小哥有143项作业动作,可分类为:揽收、派送、站内、辅助、客户服务五大类,其中22项动作是系统外的线下动作,其他动作中有69项被认为有大模型结合的机会。在69项中我们选取了小哥揽收信息录入、外呼、发短信、查询运单信息、聚合查询、知识问答、精准提示等场景,通过大模型与大数据、GIS、语音等技术的结合,为小哥提供高效、易用的作业工具。
二、智能操作
小哥日常作业中,会频繁给客户打电话、发短信。出于客户个人隐私安全的考虑,面单中隐藏了电话,所以外呼前需要小哥一次次在系统中查找电话,经常是扫单号、在详情页点击外呼按钮、拨打电话等一系列动作。通过小哥语音,大模型可以帮助我们分析小哥的意图,识别出拨打电话,就可以通过语音中提到的运单尾号、地址等特征完成外呼。
基于常规算法的解决方式是多个小模型组合成pipline,各小模型分别进行标注和训练,pipline存在误差传递问题。使用大模型后,不需要进行标记和训练,可以直接投入使用,减少了算法开发的难度和周期,提升研发交付效率。在接收到小哥语音输入后,语音识别(ASR)将语音转化为文字,文字通过大模型意图识别、信息抽取等方式生成指令,并调用系统API实现作业功能。
小哥智能助手中智能操作的实现方法如下:
在小哥发短信时,需要查找电话,在短信界面编辑文字,通过语音+大模型,识别小哥需要给客户发短信,并通过大模型对短信内容进行再加工,完成正式的短信编写。
在填写揽收信息时,小哥需要频繁切换电子称、卷尺、工业机来完成称重量方和信息录入等作业动作,同时揽收还需要填写托寄物、时效产品、增值服务等内容,如果通过语音+大模型,就可以减少工业机的多次输入,会直接识别语音,分析出小哥的输入意图和内容,将信息正确填写。
小哥查询信息,也可以通过语音输入,大模型识别意图,进行结果的反馈。如下是通过大模型实现的意图识别示例:
三、智能问答
业务快速发展的同时,也对小哥作业提出了非常高的要求,据不完全统计,仅终端相关文件就有915个,如货物处理规程、安全操作标准、KA客户服务要求等等。对于小哥来说,记忆并掌握这么多业务要求无疑是一项巨大的挑战,小哥对标准作业流程或规范了解不全面,会影响服务质量,也会影响一线作业效率,造成时间和成本浪费。
小哥不了解流程、规则或者遇到运营问题,目前通过问站长/站助/其他小哥、提报IT工单、联系终端小秘等方式解决,但是被咨询人也会因为对业务规则、流程了解不全面而无法给出正确的回答。大模型出现后能够更清晰的理解小哥的问题和意图,提供更加简洁的回答,提高回答的准确率,降低了小哥的理解成本。
通过Prompt+检索增强生成(RAG)实现了第一阶段的智能问答。之所以需要检索增强生成是因为大模型目前存在幻觉、知识过时等问题,RAG实现从外部知识库中检索相关信息进行回答,提高答案的准确性。
小哥智能助手中智能问答的实现方法如下:
【内容提取】业务文档格式多样,也包含各种内容元素,比如包含表格的文档,只进行文字提取,无法保证内容的结构性、可读性,输入给大模型后无法理解,导致回答不准确。所以我们对文件内容进行提取时,将文件中的表格转换为语义化的内容,保证知识的可读性。如下是业务文档中的表格内容:
【内容切分】大模型能够找到的相关知识的质量和数量决定了回答的正确性和完整性,但是由于大模型token的数量限制,我们必须将文档内容切分。最初我们设置300个字符为一个知识块进行切分,从回答的效果上看,有很多问题回答的内容不完整,因为单纯的按照字数切分会破坏内容的完整性,需要引入段落切分,保持段落完整性。
具体实现方法如下:
a. 内容提取
第一版采用了DocumentLoaderUtil直接提取文本,将文本信息存入txt文件,具体实现方式如下:
from src.document_loader.document_loader import DocumentLoaderUtil
processor = DocumentLoaderUtil(file_path=path_ori, pic_save_dir=dir_save_picture)texts = processor.load()
texts = json.dumps(texts, ensure_ascii=False, indent=4)with open(os.path.join(dir_save_text, f"{os.path.basename(path_ori)}.txt"), "w") as f:f.write(texts)
优化后处理DOCX文件:
# 提取word中的表格
def extract_tables_to_excel(docx_path, excel_result_path):doc = Document(docx_path)docx_name = os.path.splitext(os.path.basename(docx_path))[0]folder_path = os.path.join(excel_result_path, docx_name)if not os.path.exists(folder_path):os.makedirs(folder_path)table_count = 0for table in doc.tables:table_count += 1data = [[cell.text for cell in row.cells] for row in table.rows]df = pd.DataFrame(data)# 保存DataFrame到Excel文件excel_path = os.path