5分钟学会LLM开发系列教程(一) Chain的一切都是Runnable

114 阅读4分钟

Prompt

对于 Prompt Template,在 LangChain 中,又涵盖了多个子组件,例如:角色提示模板、消息占位符、文本提示模板、聊天消息提示模板、提示、消息等

  • 不同 Prompt 组件功能的简介:

    • PromptTemplate:用于创建文本消息提示模板,用于用于与大语言模型/文本生成模型进行交互。
    • ChatPromptTemplate:用于创建聊天消息提示模板,一般用于与聊天模型进行交互。
    • MessagePlaceholder:消息占位符,在聊天模型中对不确定是否需要的消息进行占位。
    • SystemMessagePromptTemplate:用于创建系统消息提示模板,角色为系统。
    • HumanMessagePromptTemplate:用于创建人类消息提示模板,角色为人类。
    • AIMessagePromptTemplate:用于创建AI消息提示模板,角色为AI。
    • PipelinePromptTemplate:用于创建管道消息,管道消息可以将提示模板作为变量进行快速复用。
  • Prompt 不同方法的功能简介:

    • partial:用于格式化提示模板中的部分变量。
    • format:传递变量数据,格式化提示模板为文本消息。
    • invoke:传递变量谁,格式化提示模板为提示。
    • to_string:将提示/消息提示列表转换成字符串。
    • to_messages:用于将消息提示列表转换成字符串

invoke 的结果也就是 prompt_value ,可以直接传递给大模型,所以用invoke的频率比 format 多,invoke的结果,也可以 toString变成文本 py版本,Prompt的模板可以相加当做拼接,js版本不行

Model

  1. LangChain 为两种类型的模型提供接口和集成
  • LLM:使用纯文本作为输入和输出的大语言模型。

  • Chat Model:使用聊天消息列表作为输入并返回聊天消息的聊天模型。

  • 调用大模型最常用的方法为

    • invoke:传递对应的文本提示/消息提示,大语言模型生成对应的内容。
    • batch:invoke 的批量版本,可以一次性生成多个内容。
    • stream:invoke 的流式输出版本,大语言模型每生成一个字符就返回一个字符。

Message组件

  • Modal调用 invoke 的结果就是 Message组件
  • 在 LangChain 中,Message 是消息组件,并且所有消息都具有 type(类型) 、 content(内容) 、 response_metadata(响应元数据)

OutputParser 输出解析器

  • 简单拆解: 输出解析器 = 预设提示 + 解析功能
  • 如果使用的模型支持 Function Calling 或者 Tool Calling,可以不使用解析器,而是直接定义一个函数, 规定它的函数参数为对应要解析的格式,并强制模型调用这个函数,模型就可以精准无误地按照特定的 约束输出。

RunnableParallel 并行运行

  • RunnableParallel 可以让我们同时执行多条 Chain,然后以字典的形式返回各个 Chain 的结果
  • 除了并行执行,RunnableParallel 还可以用于操作 Runnable 的输出,用于产生符合下一个 Runnable 组件的数据。

    // 这个返回的是一个 runnable_map
  const map_chain = RunnableParallel.from({
      a: () => '222',
      b: () => '333',
    });

    console.log('=>res', await map_chain.pipe(chain).invoke({}));

RunnableLambda

  • 用于将js的一个函数包装成 runnable 函数

RunnableAssign

  • 给后面加参数

// 加了一个  a:666
  const mapper = RunnableParallel.from({
      a: RunnableLambda.from(() => 666),
    });

  const runnableAssign = new RunnableAssign({ mapper })
  
  await runnableAssign.pipe(chain).invoke({ b: 222 })

Callbacks 回调

  • 实现 BaseCallbackHandler 抽象方法

import { BaseCallbackHandler } from '@langchain/core/callbacks/base';

class LLMOpsCallbackHandler extends BaseCallbackHandler {
  name = 'LLMOps';

  async handleLLMStart(llm: any, prompts: any, _: any, __: any, ___: any) {
    console.log('LLMOps handleLLMStart', llm, prompts);
  }

  async handleLLMEnd(output: any) {
    console.log('LLMOps handleLLMEnd', output);
  }

  async handleLLMError(err: any) {
    console.log('LLMOps handleLLMError', err);
  }
}
  • 在构建 chain 的时候,加上 callbacks

// 不推荐
const llm = new ChatOpenAI({
      modelName: 'gpt-3.5-turbo-16k',
      configuration: {
        baseURL: this.configService.get('OPENAI_API_BASE_URL'),
      },
      // callbacks: [new LLMOpsCallbackHandler()], // 不推荐在这里配置
    });
    
    
// 推荐
const chain = prompt
      .pipe(llm)
      .pipe(parser)
      .withConfig({ callbacks: [new LLMOpsCallbackHandler()] });

相关系列文章

ps:如果大家有疑惑的地方,可以私信咨询我哦~旨在帮助开发者入门生产级别的AI编程