Bakka's Blog
  • LLM 大语言模型

  • LLM本身只能针对文字进下词元预测,即原始能力只有续写,所有衍生能力都是对续写的封装

  • 人为的为文字区分角色,即把一段字当做提问者,大语言当做解答者,让续写可以被封装成问答

  • 提问者使用场景下,输入的文字往往分为两个部分

    • context:上下文,也就是背景信息
    • prompt:提示词,也就是指令
  • 由于本质是续写,那么就只能做单次问答,无法实现追问,为了解决这个问题,可以把之前的对话内容也当做上下文,隐式的加入到下一次的提问中

    • 自动整理的对话内容,作为新的上下文,称之为 memory
    • context 的概念,上下文也得到扩展,除了你给出的背景信息还有自动整理的 memory
  • 大语言模型本身的只能基于训练数据做预测续写,那么对于时效性和数据里没有提前准备好的部分,就无法保证内容质量

    • 想要得到期望的内容,最有效的方法就是给大语言模型他缺少的信息,但是人为的收集,再给大语言就本末倒置了,为什么自己去找了,还要再问大语言呢
    • 希望搜索,补充信息的过程自动化,这可以通过 coding 解决,调用 Google 的 API,然后补充信息,再生成回复
    • 在用户眼里就只有右侧的一问一答,于是又是一个成功的封装
    • 早期也就是简单的加一段 prompt ,根据大语言的回复做一些字符串判断是否调用 API
  • 因为这个中间的 layer 似乎有了智能,可以自己查询自己需要的内容,还能调用自己需要的工具(如这里的 web searching),所以将这个中间层取名为 智能体Agent

    • 既然Agent能联网搜索,那应该也能调用本地的外部文档数据,只不过不是用传统的数据库来做,而是使用向量 数据库,做语义化的检索
    • 这种通过向量检索做语义匹配,并加入上下文的技术,叫做 RAG 检索增强生成
    • RAG 和 web search都可以被称为 search,即获取模型参数外信息的能力
  • 现在的架构如下

    • 前文提到 agent 使用字符串匹配,来判断工具的调用,但是大语言不确定的回答格式,显然会为这个规则带来困难
    • 为了解决这个困难,可以显式prompt 规定大模型回复 agent 的格式,比如 JSON
    • 就类似于前后端的 API 规定
  • 这种按照约定调用工具的方式,叫做 function calling

  • 前文的架构工具写在 Agent 内部的,而如果工具作为外部的服务,如何进行通信呢,于是就又规定了一套协议,用于规定通讯格式,也就是 MCP

  • Agent 就像是一个传话筒,四处收集信息回答给我们

  • 底层是肯定是文字,但是交互上可以有各种形式衍生

  • 对于一些重复使用的可以编程固定的流程,每次让 Agent 发挥不仅不稳定,还效率低下,那为什么不把他们抽象出来呢,实现这个东西的方式,一种是 langchain,更低代码拖拽的形式就是 workflow

  • 假设不是这种单一的场景,输入可能是各种格式,而输出又有可能是各种格式,那么写 if else 来判断显然不能是规模化的,不可能为所有的情况都写一套 workflow

  • 而解决方案是,把这一系列工具放在一个文件夹里,再写一个类似说明书的文档,让大模型去读取,按需生成回复,调用需要的工具,就可以实现上述无法实现的复杂判断了

  • 而这又带来了优化空间,可以规定其放在指定的位置里,这样不用每次都主动让 Agent 读取这个文件的一句废话,再把它隐式的加入prompt 中,而这就是 skill

  • 而现在导致上下文膨胀,显然会影响质量和成本

  • 于是又发明了subAgent,对上下文进行隔离子 Agent 的上下文不会再 Agent 里保存