知识总结:MarsCode AI 的底层原理(三)| 豆包MarsCode AI刷题

74 阅读5分钟

一、输出解析

class OutputParser:
    def __init__(self):
        pass

    def get_format_instructions(self):
        # 返回一个字符串,指导如何格式化模型的输出
        pass

    def parse(self, model_output):
        # 解析模型的输出,转换为某种数据结构或格式
        pass

    def parse_with_prompt(self, model_output, prompt):
        # 基于原始提示解析模型的输出,转换为某种数据结构或格式
        pass

在LangChain中,开发者针对不同的使用场景和目标,设计了各种输出解析器,这些解析器包括:

  1. 列表解析器(List Parser):将输出解析为列表形式,方便用户进行迭代处理
  2. 日期时间解析器(Datetime Parser):将输出解析为合适的日期时间格式,适用于需要时间数据处理的场景
  3. 枚举解析器(Enum Parser):确保输出在预定义的值之中,适用于有限选项的情况
  4. 结构化输出解析器(Structured Output Parser):用于处理复杂的、结构化的输出,适用于需要模型生成具有特定结构的复杂回答的应用
  5. Pydantic(JSON)解析器:允许指定任意的Pydantic模型并查询LLM以获得符合该架构的输出
  6. 自动修复解析器(Auto-Fixing Parser):在模型的初次输出不符合预期时,尝试修复或重新生成新的输出
  7. 重试解析器(RetryWithErrorOutputParser):在输出解析器失败时,调用另一个LLM来修复任何错误。

在豆包MarsCode中,输出解析器的作用尤为重要,因为它们能够根据不同的使用场景和目标,将API调用的结果解析成适合用户进一步处理的格式。由于MarsCode支持自然语言问答和IDE嵌入两种使用方式,因此在调用相同API的情况下,不同的输出解析器可以提供更加定制化的结果。解析器的多样性和灵活性有助于MarsCode适应不同的编程和学习需求,提升用户体验。

批注:JSON 解析器

Pydantic 是一个 Python 数据验证和设置管理库,主要基于 Python 类型提示。尽管它不是专为 JSON 设计的,但由于 JSON 是现代 Web 应用和 API 交互中的常见数据格式,Pydantic 在处理和验证 JSON 数据时特别有用。

二、链

(一)链的类型及其作用

image.png

链可以用于链接LangChain的各个组件和功能,简化了复杂应用程序的实现,使其更加模块化。对于 MarsCode AI刷题来说,多种组件的相互链接🔗可以创建出单一的、连贯的刷题助手工具,让调试、维护和应用改进更加简易,且方便实现新功能的增加。

链的实现原理也相对简单,LangChain通过设计好的接口先实现一个具体链的功能,再通过将多个链组合在一起,或者将链与其他组件进行组合来构建出更加复杂的类。事实上,链可以被视作 LangChain 的一个基本功能。

在 MarsCode 的实际实践中,开发者的开发思路有可能是这样的:

模板 A:假设大模型是一个面试官,让他针对用户的代码进行初步的评价,并且提示用户修改代码,但并不会直接给出答案

模板 B:假设大模型是数据结构与算法的教授,让他针对用户的代码进行知识点的讲解与纠正思路

如果处理的是面试场景,就需要使用模板 A,如果处理的是教学场景,就需要使用模板 B,并且 A 和 B 的场景甚至有可能会出现重复的情况。

因此,开发者可以构建 2 — 3 的目标链,从而引导大模型选择不同的模板来解决问题。

三、记忆

MarsCode AI之所以能够记得你之前写过的一系列代码和提出的问题,正是因为这一个大模型使用了记忆(Memory)机制,记录了之前的对话上下文,并且把这个上下文作为提示的一部分,在最新的调用中传递给了模型。在聊天机器人的构建中,记忆机制非常重要。常用的记忆机制有以下四种:

  1. 缓冲记忆:直接把用户的聊天记录复制粘贴
  2. 缓冲窗口记忆:只选取用户最近 N 条的聊天记录,N 就是窗口大小
  3. 对话总结记忆:定时将用户的聊天记录进行“省流总结”
  4. 混合记忆:结合缓冲窗口记忆和对话总结记忆进行灵活调整

以下是四种记忆机制的总结:

这一张表格表示了交互次数和 token/call 的消耗比例,开发者应当结合自己应用的实际情况,选择合理的交互方法处理记忆机制,提高 token 的使用效率。

四、代理

大模型无法主动更新自己的知识,容易出现事实幻觉。如果问的问题超过了训练时间范围,大模型要么坦白,要么就会胡编乱造。如何解决大模型的“事实幻觉”问题呢?开发者的回答是:使用外部工具✅

大模型应用开发的核心理念:操作的序列并非硬编码在代码中,而是使用语言模型来选择执行的操作序列。