新概念英语学习助手之全拆解教程
  sSh3rBaiME5f 3天前 3 0

今天我们将实现一个学习英语的智能助手。回想一下大家小时候的英语学习经历,不知道你们都用过什么课外英语教材。对我来说,小时候在英语补习班上最常接触的就是《新概念英语》。

因此,我们决定直接利用《新概念英语》的教材,构建一个专属于你的英语学习小助手。这个助手将迅速帮助你巩固英语基础,特别是为小学和初中的学生们提供支持,助力他们在中考中取得优异成绩!

目标明确

好的,我们的助手目标非常明确,就是帮助学习英语的用户,尤其是那些基础较差或希望在短期内掌握英语基础的学习者。为此,我们将专注于《新概念英语》的第一册,因为它是学习英语的坚实基础。这一册内容涵盖了基本的语音、语调、语法、词法、句法及句型结构等知识,是打好英语基本功、迈入英语世界的关键。

需要注意的是,第一册的课程设计以奇数课为核心(例如1-001),而相应的偶数课(如1-002)则是对前一课内容的补充。因此,我们将主要围绕奇数课进行学习,以确保学习的系统性和连贯性。这将为学习者提供一个稳固的基础,助力他们在英语学习的旅程中更进一步。

开始搭建

直接进行提问时,模型可能会因为未经过特定数据的训练而无法给出准确的回答,如下图所示。因此,为了解决这个问题,我们需要将知识库或数据库与模型进行挂载,以便为用户提供更为精准和全面的答案。

在后续的讲解中,我们将详细介绍如何有效整合这些资源,以提升智能助手的回答能力和用户体验。

image

角色指令

为了避免信息的冗杂,我决定不分享中间的联调过程,而是直接向大家提供一个最终版本,以便于大家进行参考。希望这样能够更高效地传达核心内容。

# Role : 
你是一位新概念第一册英语学习教师,熟知第一册英语的知识点。你将使用中文问答测试用户的英语问答能力并提供详细的反馈。

## Background : 
新概念英语第一册是为英语学习者提供的基础入门课程。该课程特别适合英语基础薄弱、希望在短期内建立扎实英语基础的学习者。

## Goals :
1. 调用[data_sheet_agent]工具获取课程的英语知识点。
2. 通过四个问题帮助学习者掌握基本的英语知识。
3. 在四个问题提问结束后,生成个性化的复习资料和学习建议。

## Constrains :
1. 禁止提问偶数课程如第二课,必须提问奇数课程,如第一课,直接回复用户即可。
2. 必须至少安排4个练习问题,以确保得出更准确的学习效果评估。
3. 禁止提问超过当前课程的英语单词和短语范围。禁止提示用户答案
4. 禁止一次性提出四个问题,必须逐一提供四个问题
5. 提问必须以提问中英文结合。禁止提问翻译问题。

## Skills :
1. 精通英语语法和词汇知识。
2. 至少能够设计安排4个练习问题语言练习题。
3. 具备强大的逻辑思维能力。
4. 了解英语学习者的心理与需求。
5. 能够运用多样化的教学方法增强学习效果。

## Workflows:
0. 根据用户选择的课程,使用memory_variable_writer工具来更新course记忆变量的值,以便后续的问题和反馈能够针对这一课进行。
1. 调用[data_sheet_agent]工具参数为【新概念英语 - 第1册 - 第XXX课】查询选择课程的英语内容,确定关键知识点。XXX表示三位数字:001/005等。
2.介绍当前课程的学习目标及关键知识点。介绍示例:
《新概念英语》第一册第一课是 “Excuse me!”。这节课的学习目标是掌握一些基本的日常用语,关键知识点包括 “excuse me”“yes”“is this” 等表达的用法。
3.严格按照课程原文句子、短语、单词内容确定本次要提问的内容并开始第一轮问题,旨在检验学生对课程内容的基本理解。
4. 每次只提问一个问题并记录当前是第几道题目,
5. 用户必须通过写英语句子作答才可以进入下一个问题,必须逐一提供四个问题,禁止超过四道提问题目。
6. 必须在4个练习问题提问后使用GaiJinYiJianHeXueXiJianYi工具为用户生成荣誉证书。

在这里,我想详细阐述一下我们的调试思路。这个指令的最终目标是让大模型在首次从数据库中检索信息后,基于第一次的数据检索,依次进行四轮问答。在这四轮问答结束后,模型还会为大家生成一份总结和建议,以便更好地梳理和应用所学内容。

此外,为了激励学生们的积极性,我们特别设计了一张荣誉证书,以表彰他们的努力和成就。同时,我们也提供了一些相关的视频链接,供大家进一步学习和参考。希望这一系列的设计能对大家有所帮助!

变量

首先,让我们从变量的概念入手,逐步深入理解其重要性。之所以在这里引入变量,是因为在首次提问时必须设置好当前课程章节。如果这一环节没有处理好,那么在后续生成证书时,即使提示词中明确指出了需要传递哪些参数,也难以发挥作用。

因此,这个变量的主要目的是为了将相关信息记录下来,以便后续使用。在工作流的后续步骤中,我们可以调用这个变量,从而确保生成的证书内容准确无误。

image

默认值

当然,我为这个变量设置了我设置了一个默认值,主要用于工作流中的判断。这一机制可以有效防止用户在聊天窗口随意请求大模型调用工作流生成证书,从而避免功能的误用。

尽管我最初考虑在提示词中设定这些限制,但大模型并不总是遵循这些指令,因此依赖工作流的设计更为可靠。

单次会话

而且,这个机制是针对单次会话设计的,因为每次用户可能会对不同的课程提出疑问。通过这种方式,我们可以有效避免生成错误的证书。因此,我没有让变量一直生效,而是根据具体的业务需求进行调整。

挂载数据库

接下来,我们需要开始搜索相关的数据,以便将其挂接下来,我们需要开始搜索相关的数据,以便将其挂载。

网页插件

首先,我想说明的是,这里我没有使用网页插件或在工作流中设置网页节点进行直接访问网址,原因有几点。

首先,网站的稳定性往往不可预测,直接访问可能导致助手的功能失效,从而影响用户体验。

其次,我仔细查看了对方网站,并发现他们并没有明确的爬虫协议,贸然进行数据抓取可能会对网站造成负担,甚至导致崩溃。

为了保证系统的稳定性和对方网站的正常运行,我选择了更为稳妥的方式来处理数据。

数据清洗

接下来,我们将开始数据清洗的过程。网页上的数据往往包含大量的杂质和冗余信息,这些不必要的元素可能会对模型的回答质量产生负面影响。

我采用了一种相对简单且成本低廉的方法,通过借助第三方的Kimi网页工具来实现我的需求。我只需编写适当的提示语,便能获得所需的数据。这一过程大约耗费了我两小时的时间。当然,如果你有资金支持,可以考虑直接通过代码进行对接。这样,利用代码中的循环结构,可以更高效地将数据进行拼接,节省时间和精力。

image

创建数据库

在这里,我选择使用数据库而非知识库,可能会引发一些疑问。在大多数人的认知中,我们通常认为数据应该存储在知识库中,这是因为知识库常常被视为知识管理和信息检索的理想场所。然而,实际上,使用数据库的理由有几点值得深入探讨。

首先,命中率的问题并不容忽视。知识库在查询时可能会受到一定的限制,这可能导致信息检索的命中率相对较低。换句话说,我们可能会面临获取信息的困难。

其次,即便命中了所需的信息,知识库的查询过程往往会导致额外的token消耗。我们看下效果,如图所示:

image

我们之所以需要使用数据库进行精准匹配,是因为我们的提问指向某一特定课程,都是非常具体且针对性的。

至于为什么不使用记忆表,原因在于记忆表主要是针对对话过程中产生的数据,而这些数据的性质和结构与我们的需求并不完全匹配。

让我们进一步分析一下数据库的表现。首先,我们需要在本地创建数据库,并确保已经编写好相应的CSV文件。在进行导入之前,建议先打开这个CSV文件,仔细检查其格式和内容是否正确。这一步骤至关重要,因为如果文件格式不符合要求或内容出现问题,导入后可能会导致数据库中没有任何数据显示,如图所示:

image

加载完成后,我们将立即进行挂载操作。

image

接下来,我们将在对话中进行效果测试,以验证精准匹配的成功实现。这一过程不仅有效节省了token的消耗,还显著提高了回答的准确性。

image

在调试过程中,我注意到某些内容并不是必需的,例如原文翻译。为了进一步提高数据的质量和有效性,我进行了第二次数据清洗。这一过程让我能够筛选出与项目目标更加相关的信息,从而确保最终数据集的精确性和实用性。

经过这一轮的清洗,最终得到的数据如下:

image

经过一系列测试后,我发现系统的表现已经接近我所期望的效果,尤其是在正常问题问答方面,已经相当出色。此外,当我遇到不确定的情况时,系统也能及时提供相应的提示,帮助我更好地构建回答。

image

工作流组件

在这个阶段,我们对工作流的目的有了明确的认识,因为待完成的任务相对繁杂,单靠提示词和思考无法有效地实现所有目标。因此,创建一个功能齐全的工作流显得尤为必要。接下来,让我们仔细分析一下工作流需要具备哪些核心功能:

  1. 证书生成:该功能旨在鼓励学生养成良好的学习习惯,通过生成证书来认可他们的努力与成就,从而激励他们继续前进。
  2. 效果总结与建议:工作流需要能够总结当前用户在测试问答中的表现,并提供合理的反馈和改进建议。这一功能将帮助学生识别自身的优缺点,从而更有针对性地进行学习。
  3. 视频链接推荐:为配合当前学习章节,工作流还应提供相关的视频链接,供学生自主选择观看。这不仅丰富了学习资源,也增加了学习的灵活性和互动性。
  4. 请求限制:为了确保系统的合理使用,工作流需禁止用户在未经测试的情况下直接请求生成证书。这一限制能够促使学生认真参与学习过程,而不是依赖于证书的快速获取。

其他功能的实现相对简单,例如,建议和总结的部分将通过一个大型模型节点来完成,它能够综合分析用户的表现并生成具有针对性的反馈。至于视频链接的提供,将由百度视频节点负责生成。

这里需要特别注意:为了防止视频链接瞎生成,我的变量设置中包含了详细的格式要求。这种格式必须为“新概念英语 - 第1册 - 第×××课”。如果仅仅使用“第一课”或只是课程名称,可能会导致搜索到与之无关的视频链接。

在这里,我详细讲一下证书生成的过程。

生成证书

在这里,我使用了一个第三方API,其中涉及到了一些其他云厂商的内容,因此我就不深入讲解这部分了。简而言之,这个荣誉证书的生成过程实际上结合了一个云厂商的边缘计算功能和CDN服务,并进行了图片处理,从而实现了动态生成的效果。关于对接的代码,大家可以参考我分享的内容,我在其中去掉了秘钥信息,以确保隐私和安全。

# 定义一个 main 函数,传入 params 参数。params 中包含了节点配置的输入变量。
# 需要定义一个字典作为输出变量
# 引用节点定义的变量:params['变量名']
# 运行环境 Python3;预置 Package:NumPy
import json
import hashlib 
from datetime import datetime
import re


def encode_chinese_in_url(url):
    encoded_url = ""
    
    for char in url:
        if char == ' ':
            encoded_url += '%20'  # 将空格编码为 %20
        elif '\u4e00' <= char <= '\u9fff':  # 中文字符的 Unicode 范围
            encoded_char = char.encode('utf-8')
            encoded_url += ''.join(['%' + format(b, '02X') for b in encoded_char])
        else:
            encoded_url += char  # 其他字符保持不变
            
    return encoded_url

def get_final_url(template_id,params):
    # URL 前缀
    url_prefix = ''
    # 模板中设置的图片格式
    format = 'png'
    # 用户 Id
    user_id = ''
    # 模板 Id
    # template_id = template_id
    # 生成签名的 API Key
    api_key = ''
    # 在这里填入要修改的模板参数
    # params = {}
    
    # 对参数 key 进行排序
    sorted_keys = sorted(params.keys())
    # 对参数进行拼接
    search_params = '&'.join(f'{key}={params[key]}' for key in sorted_keys)
    
    # 待签名的数据
    sign_data = json.dumps({
        'apiKey': api_key,
        'searchParams': search_params,
    }, ensure_ascii=False,separators=(",", ":"))
    # return sign_data
    # 调用 md5 生成签名
    sign = generate_md5(sign_data)

    # 拼接成最后的路径
    final_url = f"{url_prefix}/{sign}/{user_id}/{template_id}.{format}?{search_params}"

    encoded_path = encode_chinese_in_url(final_url)
    return encoded_path

def generate_md5(sign_data):
    # 创建 MD5 哈希对象
    md5_hash = hashlib.md5()
    # 更新哈希对象
    md5_hash.update(sign_data.encode(encoding='UTF-8'))
    # 获取十六进制的哈希值
    return md5_hash.hexdigest()

def main(params):
    curse = params['curse']
    # 获取当前日期
    current_date = datetime.now()

    # 格式化日期
    formatted_date = current_date.strftime('%Y-%m-%d')
    template_id = 'ep-vna6OlJNvSwu'
    params = {
        "name": f"{curse}",
        "title": f"恭喜小伙伴完成了英语学习,积极向上!为鼓励你继续努力,我们特发此证,以资鼓励",
        "date": f"{formatted_date}",
        "award": f"新概念英语学习助手"
        }
    final_url = get_final_url(template_id,params)    
    # 创建一个字典作为输出变量
    output_object ={
    
        # 引用节点定义的 city 变量
        "link": final_url,
    }
    
    # 返回输出字典类型变量 output_object,包含代码节点所需的输出数据
    return output_object

最终效果非常出色,具体情况可以参考下图所示:

image

整体布局

让我们一起来仔细看看整体布局的设计和结构吧。

image

请注意,在结束节点之前有一个关键的代码节点。这个节点负责判断应该输出哪些内容。查看下面的代码片段会让你更清晰地理解这一逻辑,也能帮助你更好地融入整个流程。

image

在这里,我们直接将输出内容进行拼接,这样可以确保外层的大模型不会对输出进行润色或修改。这一做法有助于保持原始信息的完整性。关于这个问题,我们在之前的讨论中已经提到过,因此这里就不再详细赘述。

image

整体效果

编排效果

先查看一下编排效果。除了我之前提到的内容之外,这里并没有配置过多不必要的组件。

image

问答效果

整体问答有时会出现判断错误,导致无法准确识别已经完成的回答轮次。因此,偶尔可能会出现少了一轮问答的情况。不过,这并不影响整体流程的正常运作。系统仍然能够顺利进行,不会出现严重的问题。

image

希望此次构建流程能够为大家提供实质性的帮助和启发~

总结

在今天的分享中,我们共同探讨了如何构建一个智能英语学习助手,利用《新概念英语》的第一册为基础,帮助学生们在英语学习中打下坚实的基础。回顾我们的目标,尤其是针对小学和初中学生,这个助手的设计旨在快速而有效地提升他们的英语水平,特别是在中考这样的重要考试中,帮助他们取得优异成绩。

我们明确了学习助手的核心目标:通过系统化的学习和互动,尤其聚焦于奇数课的知识点,使学习者能够逐步掌握基础英语。这种针对性的学习方式,既能让学生们在短时间内建立信心,又能有效避免学习中的冗杂与困惑。通过逐一提问和反馈,学生能够更好地理解和应用所学内容,增强其语言运用能力。

接下来,我们详细阐述了如何通过整合知识库和数据库,优化模型的回答能力。通过精确匹配课程内容,学习助手能够实时提供准确的答案和学习建议,从而提升用户体验。同时,证书生成和个性化反馈的设计,旨在激励学生不断进步,培养他们的学习热情。

项目不仅关注学习过程的科学性和系统性,更重视学习者的体验与感受。在调试和优化过程中,不断反思与改进,确保最终的学习助手能够满足广大学生的需求。通过这样的探索与实践,期待每位学生在英语学习的旅程中,能够获得更好的支持与指导。


我是努力的小雨,一名 Java 服务端码农,潜心研究着 AI 技术的奥秘。我热爱技术交流与分享,对开源社区充满热情。同时也是一位腾讯云创作之星、阿里云专家博主、华为云云享专家、掘金优秀作者。

💡 我将不吝分享我在技术道路上的个人探索与经验,希望能为你的学习与成长带来一些启发与帮助。

🌟 欢迎关注努力的小雨!🌟

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 3天前 0

暂无评论