Langchain.js你必须要知道的核心组件

news2025/1/12 12:22:25

关于Langchain.js

Langchain.js,在github上截止到今日已经有92k的start。之前一直偶有耳闻,但没有深入了解。今天看完后,真的是可以堪称大模型里的瑞士军刀。

LangChain由Harrison Chase于2022年10月作为开源软件项目推出,用于连接 OpenAI 的 GPT API(后续已扩展到更多模型)以生成人工智能文本。在创立LangChain之前,Harrison Chase在Robust Intelligence(一家专注于测试和验证机器学习模型的MLOps公司)领导ML团队,并在Kensho(一家金融科技初创公司)领导实体链接团队。他曾在哈佛大学学习统计和计算机科学。它最初是一个开源项目,后来在获得大量关注后转变为一家初创公司,并获得了融资。

更具体地说,它是论文《ReAct: Synergizing Reasoning and Acting in Language Models》的实现:该论文展示了一种提示技术,允许模型「推理」(通过思维链)和「行动」(通过能够使用预定义工具集中的工具,例如能够搜索互联网)。

论文链接:https://arxiv.org/pdf/2210.03629.pdf

事实证明,这种组合能够大幅提高输出文本的质量,并使大型语言模型具备正确解决问题的能力。而ChatGPT的API升级降价也助推了它的爆炸式增长。

基本定义

我们先来简单介绍一下Langchain.js中的一些核心概念:聊天消息(Chats)、模版(Templates)、工具(Tools)、调用链(Chains)。

聊天消息

支持定义不同的消息类型,主要有SystemChatMessage、HumanChatMessage、AIChatMessage。支持变量替换。

  1. HumanChatMessage:代表人类用户的输入,通常是问题、指令或请求。

  2. AIChatMessage:代表模型的输出或回复,用于回应 HumanChatMessage 的内容。

  3. SystemChatMessage:用于设定对话的背景或角色,告诉模型如何表现或在对话中扮演什么角色。

import { ChatOpenAI } from 'langchain/llms/openai';
import { HumanChatMessage, AIChatMessage, SystemChatMessage } from 'langchain/schema';

// 初始化 ChatOpenAI 模型
const chatModel = new ChatOpenAI({
  openAIApiKey: 'your-api-key',
});

// 定义对话消息
const messages = [
  new SystemChatMessage("你是一位量子物理教授,专业回答科学问题。"),
  new HumanChatMessage("什么是量子纠缠?"),
];

// 模型生成回复
const response = await chatModel.call(messages);

// 输出 AI 的回复
console.log(response);
模版(Templates)

PromptTemplate 是 LangChain 中的一个核心组件,它用于创建和管理与大型语言模型(LLMs)交互时的提示词(prompt)。PromptTemplate 帮助开发者构建动态和可复用的提示模板,将用户输入与预定义的模板内容结合,生成适合传递给语言模型的 prompt。

支持简单的变量和逻辑判断

import { PromptTemplate } from 'langchain/prompts';

// 定义更复杂的模板,包含条件逻辑
const template = `
你好,我叫 {name}{#if topic}
今天我想讨论的是 {topic}{#else}
我今天没有特定的讨论话题。
{#/if}
`;

// 使用 LangChain 内置的模板引擎支持
const prompt = new PromptTemplate({
  template: template,
  inputVariables: ["name", "topic"],
});

// 当提供了 topic 时,生成不同的 prompt
const finalPromptWithTopic = await prompt.format({ name: "安笛杨", topic: "量子计算" });
console.log(finalPromptWithTopic);

// 当未提供 topic 时,生成的 prompt 会有不同的结构
const finalPromptWithoutTopic = await prompt.format({ name: "安笛杨" });
console.log(finalPromptWithoutTopic);

支持流式处理::自动将每个步骤的输出作为下一步骤的输入,简化了多步骤任务的管理

import { PromptTemplate, PipelinePromptTemplate } from 'langchain/prompts';

// 定义多个 PromptTemplate
const titlePrompt = new PromptTemplate({
  template: "请为以下内容生成一个标题:\n{content}",
  inputVariables: ["content"],
});

const introPrompt = new PromptTemplate({
  template: "请为这个标题生成一个简短的介绍:\n{title}",
  inputVariables: ["title"],
});

const summaryPrompt = new PromptTemplate({
  template: "请为这个介绍生成一个总结:\n{introduction}",
  inputVariables: ["introduction"],
});

// 使用 PipelinePromptTemplate 将多个 PromptTemplate 串联起来
const pipeline = new PipelinePromptTemplate({
  pipelinePrompts: [
    { name: "title", promptTemplate: titlePrompt },
    { name: "introduction", promptTemplate: introPrompt },
    { name: "summary", promptTemplate: summaryPrompt },
  ],
});

// 提供初始输入,并生成最终提示词
const finalPrompt = await pipeline.format({
  content: "量子计算正在改变未来的计算方式。",
});

console.log(finalPrompt);
// 输出:生成的最终提示词,会包含基于内容的标题、介绍和总结
工具函数

工具函数(Tools) 是构建复杂工作流和智能应用的核心组件。工具函数用于执行特定的任务或操作,它们可以是函数、API 调用、数据库查询等。LangChain 中的工具函数提供了一种灵活的方式,将外部系统或服务与语言模型(如 OpenAI GPT 系列)进行集成,使得模型可以动态调用工具来解决复杂问题。

在 LangChain 中,工具函数的定义通常包括以下几个要素:

  • 名称(name):工具函数的名称,帮助模型识别和选择该工具。

  • 描述(description):工具函数的功能描述,向模型或用户传达工具的用途。

  • 调用逻辑(functionality):工具的实际逻辑,实现特定任务或操作。

import { OpenAI } from 'langchain/llms/openai';
import { Tool, AgentExecutor } from 'langchain/agents';

// 初始化 OpenAI 模型
const model = new OpenAI({
  openAIApiKey: 'your-api-key',
});

// 定义一个简单的工具函数,用于查询天气
const weatherTool = new Tool({
  name: 'getWeather',
  description: '根据城市名称查询当前天气',
  action: async (input) => {
    // 模拟天气查询逻辑
    const weatherData = {
      '北京': '晴天 25°C',
      '上海': '小雨 22°C',
    };
    return weatherData[input] || '无法获取该城市的天气数据';
  },
});

// 创建智能代理,允许模型根据输入动态选择工具
const executor = new AgentExecutor({
  tools: [weatherTool],
  llm: model,
});

// 通过模型输入选择工具
const input = "查询一下北京的天气";
const response = await executor.call({ input });
console.log(response);  // 输出:北京的天气是晴天 25°C
调用链(Chains)

调用链(Chain) 是 LangChain 中的核心概念之一,它用于将多个步骤串联在一起,形成一个工作流。每个链可以包含多个不同的模块(例如模型调用、工具函数、API 请求等),这些模块依次执行,完成从输入到输出的整个处理流程。通过调用链,开发者可以将复杂的任务分解为多个简单的步骤,并以逻辑顺序串联执行。

LangChain 的调用链特别适合构建复杂的应用,例如对话系统、信息检索增强生成(RAG)、多步骤文本处理等场景。通过调用链,开发者可以定义明确的数据流,确保每个步骤的输入、处理和输出都被合理处理。

LangChain 提供了多种不同类型的调用链,以支持各种任务的处理。常见的调用链类型包括:

  1. SimpleChain(简单链):SimpleChain 是最基本的调用链类型,它将输入传递给链中的第一个模块,并依次将每个模块的输出作为下一个模块的输入,直到返回最终结果。适合处理简单的线性任务。

  2. SequentialChain(顺序链):SequentialChain 是一个更复杂的链,支持多个模块按顺序执行,且每个步骤的输出可以作为下一个步骤的输入。适用于需要多步骤处理的任务。

  3. LLMChain(语言模型链):LLMChain 是 LangChain 中专门用于调用语言模型(如 OpenAI GPT 系列)的调用链。它通常与提示模板(PromptTemplate)结合使用,将用户输入和模板内容结合,生成适合传递给语言模型的提示词,并将生成的结果作为输出。

  4. RouterChain(路由链):RouterChain 是用于复杂的条件任务的链,允许根据输入的内容动态选择不同的链来执行。适用于需要根据用户输入决定执行不同逻辑的场景。

  5. TransformChain(转换链):TransformChain 是用于数据转换的链,适合在多个步骤之间对数据进行格式转换或处理。

import { OpenAI } from 'langchain/llms/openai';
import { PromptTemplate } from 'langchain/prompts';
import { SequentialChain } from 'langchain/chains';

// 初始化 OpenAI 模型
const model = new OpenAI({
  openAIApiKey: 'your-api-key',
});

// 定义生成标题的 PromptTemplate
const titlePrompt = new PromptTemplate({
  template: "请为以下内容生成一个标题:\n{content}",
  inputVariables: ["content"],
});

// 定义生成摘要的 PromptTemplate
const summaryPrompt = new PromptTemplate({
  template: "请基于这个标题生成一个简短的内容摘要:\n{title}",
  inputVariables: ["title"],
});

// 创建 SequentialChain,将两个步骤串联
const chain = new SequentialChain({
  chains: [
    new LLMChain({ llm: model, prompt: titlePrompt }),  // 第一步:生成标题
    new LLMChain({ llm: model, prompt: summaryPrompt }) // 第二步:生成摘要
  ],
  inputVariables: ["content"],  // 初始输入变量
  outputVariables: ["summary"],  // 最终输出变量
});

// 执行链
const response = await chain.call({
  content: "量子计算是一种利用量子力学原理进行计算的新型技术。",
});

console.log(response);  // 输出:基于标题生成的摘要

除此之外,Langchain还支持把内容转成向量数据用于关联查询、支持内存存储、状态记录等功能。

👉[CSDN大礼包🎁:全网最全《LLM大模型入门+进阶学习资源包》免费分享(安全链接,放心点击)]()👈

LangChain Execution Language (LCEL)

Langchain.js还有一个重要的概念:LangChain Execution Language,简称LCEL。

LCEL是Langchain.js的灵魂语言,一种专门为Langchain.js框架设计的执行语言。它允许开发者以更加简洁和直观的方式描述和执行各种操作。

通过 LCEL,开发者可以定义自定义的数据流和工作流,从而使模型调用、工具函数、API 请求等可以灵活组合并执行。LCEL 在 LangChain 中充当管道,将各个步骤的输入输出连接起来,最终实现自动化的复杂工作流。

LCEL 的核心功能

  1. 定义数据流:LCEL 允许你清晰地定义数据如何在不同模块之间流动。每个模块的输出可以通过 LCEL 指定,传递给下一个模块,形成明确的工作流。

  2. 灵活组合:LCEL 可以组合多个不同类型的模块,构建灵活的链式调用。无论是调用语言模型、工具函数,还是进行数据处理,都可以通过 LCEL 组合成一个整体。

  3. 条件逻辑:LCEL 支持在工作流中添加条件逻辑(if-else),让数据流根据不同的输入路径或结果动态调整。这使得 LCEL 非常适合复杂的决策流程。

  4. 模块化设计:LCEL 支持模块化构建,开发者可以轻松将单独的模块组合、重用,并构建更加复杂的应用。通过 LCEL,模块之间的连接非常灵活,可以根据需求进行调整。

LCEL 的核心是将多个可运行模块(runnables) 串联在一起。每个可运行模块代表一个具体的任务或操作,例如调用语言模型、查询数据库、调用 API、处理数据等。LCEL 的表达式描述了数据如何在这些模块之间流动。

LCEL 的基本结构是定义一个工作流,其中每个步骤可以是模型调用、工具函数等,并通过数据流进行连接。让我们来看一个例子:

假设你有一个文本处理任务,需要先生成一个摘要,然后根据摘要生成简短的介绍。我们可以通过 LCEL 来实现这个工作流。

import { OpenAI } from 'langchain/llms/openai';
import { PromptTemplate } from 'langchain/prompts';
import { RunnableSequence } from 'langchain/chains';

// 初始化 OpenAI 模型
const model = new OpenAI({
  openAIApiKey: 'your-api-key',
});

// 定义生成摘要的 PromptTemplate
const summaryPrompt = new PromptTemplate({
  template: "请为以下内容生成一个简短的摘要:\n{content}",
  inputVariables: ["content"],
});

// 定义生成介绍的 PromptTemplate
const introductionPrompt = new PromptTemplate({
  template: "请基于这个摘要生成一个简短的介绍:\n{summary}",
  inputVariables: ["summary"],
});

// 使用 LCEL 构建一个链式调用
const chain = RunnableSequence.from([
  summaryPrompt,  // 第一步:生成摘要
  model,  // 第二步:调用语言模型生成摘要
  introductionPrompt,  // 第三步:基于摘要生成介绍
  model,  // 第四步:调用模型生成介绍
]);

// 执行链式调用,传入初始内容
const response = await chain.call({ content: "量子计算是一种利用量子力学进行计算的技术。" });

console.log(response);  // 输出最终生成的介绍

还可以通过 LCEL 添加条件逻辑,根据不同的输入路径选择不同的处理流程。

import { OpenAI } from 'langchain/llms/openai';
import { RunnableSequence } from 'langchain/chains';

// 初始化 OpenAI 模型
const model = new OpenAI({
  openAIApiKey: 'your-api-key',
});

// 使用 LCEL 添加条件逻辑
const chain = RunnableSequence.from([
  async (input) => {
    if (input.includes("weather")) {
      return "天气预报";
    } else {
      return "普通文本处理";
    }
  },
  model,  // 基于条件选择不同的模型调用
]);

// 执行链式调用
const response = await chain.call("Tell me the weather in New York.");
console.log(response);  // 根据输入选择不同的模型处理

LangChain Expression Language (LCEL) 提供了一种灵活、模块化的方式来管理复杂任务的工作流。通过 LCEL,开发者可以定义多步骤任务的数据流动、组合模型调用和工具函数,以及动态调整任务执行路径。LCEL 在文本处理、信息检索、智能代理等场景中具有广泛的应用,是 LangChain 中实现复杂工作流自动化的关键工具。

LangChain还可以实现RAG,后面在介绍。RAG是对大模型的一种增强处理。也是目前AI落地的一个大方向。要在公司内落地,就得把公司的数据通过RAG喂给大模型。有真实业务数据的加持,才可以让AI的回答更准确。

总结

Langchain对于开发AI应用的确是一个不可多得的工具。其对大模型调用的拆解和封装值得我们借鉴和学习。

读者福利:如果大家对大模型感兴趣,这套大模型学习资料一定对你有用

对于0基础小白入门:

如果你是零基础小白,想快速入门大模型是可以考虑的。

一方面是学习时间相对较短,学习内容更全面更集中。
二方面是可以根据这些资料规划好学习计划和方向。

包括:大模型学习线路汇总、学习阶段,大模型实战案例,大模型学习视频,人工智能、机器学习、大模型书籍PDF。带你从零基础系统性的学好大模型!

😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓
在这里插入图片描述

👉AI大模型学习路线汇总👈

大模型学习路线图,整体分为7个大的阶段:(全套教程文末领取哈)

第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;

第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;

第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;

第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;

第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;

第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;

第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。

👉大模型实战案例👈

光学理论是没用的,要学会跟着一起做,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

在这里插入图片描述

👉大模型视频和PDF合集👈

观看零基础学习书籍和视频,看书籍和视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
在这里插入图片描述
在这里插入图片描述

👉学会后的收获:👈

• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;

• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;

• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;

• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。

👉获取方式:

😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2131166.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

抗菌肽;Parasin I;KGRGKQGGKVRAKAKTRSS;CAS号:219552-69-9

【Parasin I 简介】 Parasin I是一种抗菌肽,由19个氨基酸组成,最初从鲶鱼的皮肤粘液中分离得到。它具有广谱的抗菌活性,能够有效对抗革兰氏阳性菌和革兰氏阴性菌,包括一些对传统抗生素具有耐药性的菌株。 【中文名称】抗菌肽 Par…

C语言 11 字符串

前面学习了数组,而对于字符类型的数组,比较特殊,它实际上可以作为一个字符串(String)表示,字符串就是一个或多个字符的序列,比如在一开始认识的"Hello World",像这样的多个…

如何编写智能合约——基于长安链的Go语言的合约开发

场景设计:文件存证系统 在数字化时代,文件存证和版本追踪变得越来越重要。设想一个场景:在一个法律事务管理系统中,用户需要提交和管理各种文件的版本记录,以确保每个文件在不同时间点的状态可以被准确追踪。文件可能经…

抖音生活服务是干什么的?很多人都不知道的入局途径曝光!

近年来,作为国内两大头部短视频平台之一的抖音一直在大力布局其生活服务业务,壮大自身实力的同时,也让不少人开始好奇抖音生活服务的概念,以抖音生活服务是干什么的和如何做抖音生活服务为代表多个相关话题因此成为了多个互联网社…

客户端负载均衡Ribbon实例

文章目录 一,概述二,实现过程三,项目源码1. 源码放送:2. 部署方式 四,功能演示五,其他 一,概述 一般来说,提到负载均衡,大家一般很容易想到浏览器 -> NGINX -> 反…

记一次 FastDFS 存储节点迁移:基于 scp 的实践与经验分享

一、背景 某某项目,机房到期,需要迁移至其他机房; 此项目已经运行了3年多,fastdfs累计数据大概在250G 左右,现需要把旧的fastdfs数据迁移到新的fastdfs上; 采用scp物理迁移数据的方式,停机迁移…

技术分享 | RK3568修改eMMC分区大小

我司IAC-RK3568-CM根据eMMC大小的不同,有着不同规格的产品,不论eMMC大小如何改变,其分区的配置大同小异,除了eMMC厂商所使用的区域无法变更外,留给用户的区域可自由写入。 我司产品默认eMMC启动,所以eMMC用…

【AI-18】Adam和SGD优化算法比较

Adam(Adaptive Moment Estimation)和 SGD(Stochastic Gradient Descent,随机梯度下降)是两种常见的优化算法,它们在不同方面有各自的特点。 一、算法原理 SGD: 通过计算损失函数关于每个样本的…

干货分享 | 激光测风雷达中准确监测温度、湿度和气压的重要性

前言 风场信息的测量是气象或空气动力学领域的重要工作内容之一,其测量的精确性对于气象研究尤为重要。 激光测风雷达作为新型测风技术,利用多普勒(Doppler)原理获取风向、风速信息,具有能够探测晴空风场、测风范围广…

element select + tree

element select tree的使用 <template slot"action1" slot-scope"text, record, index"><el-select v-model"record.tagValue" multiple placeholder"请选择":filter-method"(e) > filterTree(e, index)" filt…

5分钟配置Nginx?(二)

前言: 此文章分为两个部分。 5分钟搞懂什么是Nginx?(一)-CSDN博客文章浏览阅读82次。2.、那么此时入口的安全性则格外重要,同时因为加强了入口的安全性,后端的web server的安全则可以不用做额外安全工作。因为入口如果破防,后端web server一定破防,如果不…

支付宝开放平台-开发者社区——AI 日报「9 月 13 日」

1 OpenAl推出了一个新的大语言模型一 OpenAl o1 前沿技术瞭望官&#xff5c;阅读原文 新的模型主要体现在下面几个方面&#xff0c;思维链&#xff1a;o1在回答问题前会产生一个内部的思维链&#xff0c;这使得它能够进行更深入的推理。强化学习&#xff1a;通过大规模强化学…

Linux操作系统入门(一)

Linux操作系统是开源的类Unix操作系统内核&#xff0c;由林纳斯托瓦兹在1991年创建。 Linux操作系统以其强大的性能、稳定性和开放性&#xff0c;赢得了全球用户的广泛认可&#xff0c;从服务器到个人电脑&#xff0c;从超级计算机到嵌入式设备&#xff0c;都有它的身影。作为…

停止向供应商提供您的数据

组织管理其数据基础设施的方式正在发生重大转变。越来越多的公司认识到存储和计算分离的优势&#xff0c;从而获得更好的性能、成本节约和可扩展性。这一趋势是由 AI 和 ML 工作负载日益复杂所推动的&#xff0c;这些工作负载需要灵活、高性能的系统。Databricks 首席执行官 Al…

自定义Spring-start学习笔记

Spring Boot Start的创建和使用 start的工作原理(网图) 1. 设置Maven项目&#xff1a; 创建一个新的Maven或Gradle项目&#xff0c;并在项目的pom.xml文件中添加必要的Spring Boot依赖项和插件。下面以maven项目为例&#xff1a; 创建Spring Boot项目 &#xff0c;并在项目的…

私域流量的价值探索:开源链动 2+1 模式、AI 智能名片与 S2B2C 商城小程序的助力

摘要&#xff1a;本文从渠道视角深入剖析私域流量的特殊价值&#xff0c;探讨其作为一种新的销售渠道所具有的重要意义。同时引入开源链动 21 模式、AI 智能名片和 S2B2C 商城小程序等创新元素&#xff0c;阐述它们如何为私域流量的发展提供新的动力和机遇&#xff0c;进一步提…

UE5安卓项目打包安装

Android studio安装 参考&#xff1a;https://docs.unrealengine.com/5.2/zh-CN/how-to-set-up-android-sdk-and-ndk-for-your-unreal-engine-development-environment/ 打开android studio的官网&#xff1a;Download Android Studio & App Tools - Android Developers …

浅谈电动汽车火灾特点及扑救对策研究

0引言 电动汽车火灾事件增多&#xff0c;其特点包括电池高能量密度、快速热释放和烟雾毒性。本文提出应对策略&#xff1a;加强火灾预防&#xff0c;完善电池管理系统&#xff0c;提高电池安全性能&#xff1b;使用干粉灭火器、气溶胶灭火系统等灭火剂&#xff1b;对严重火灾采…

力扣13.罗马数字转整数

4.定义一个哈希存字符和对应的数字 16.定义ans存最终数字 17.定义n存字符串长度 18.开始循环 19.设置value存第一个字符的值 20.如果第一个字符的值小于下一个字符的值&#xff0c;比如IV那么值就是V-I 反之则正常&#xff0b; 最后返回

【实证分析】中国工业经济-数实产业技术融合与企业全要素生产率(2008-2022)

数据简介&#xff1a;本数据参考黄先海和高亚兴老师&#xff08;2023&#xff09;的研究方法&#xff0c;对原文数据进行了年份扩充&#xff0c;更新到了2008-2022年。并按照原文的处理方法对样本进行了清洗和筛选。 数据范围&#xff1a;上市企业层面时间跨度&#xff1a;200…