LangChain.js 实战系列:入门介绍
📝 LangChain.js 是一个快速开发大模型应用的框架,它提供了一系列强大的功能和工具,使得开发者能够更加高效地构建复杂的应用程序。LangChain.js 实战系列文章将介绍在实际项目中使用 LangChain.js 时的一些方法和技巧。
LangChain.js 是一个快速构建 AI 应用的库,它提供了一系列的工具,可以帮助你快速构建一个 AI 应用。
LangChain.js 目前还在快速迭代中,这是由于 AI 技术自身也正在快速迭代中,所以很多功能可能很快就被废弃掉,比如 generate() 方法。
使用 LangChain.js 的好处有挺多,比如:
- 封装了大量的模型,比如 OpenAI、Azure OpenAI、Claude、文心一言等等,填入响应的 API Key 等参数即可调用
- 提供了大量方便的方法,比如链式调用、对话管理、回钩子等等
- 和 LangSmith 结合,对 AI 应用可以很好地进行调试开发
LangChain.js 的基本使用
调用模型
LangChain.js 新改版区分了两种调用方式,一种是LLM,一种是ChatModel,不过这两种调用方式本质都一样,最终都是调用模型,一般我们使用后者。
实例化 ChatModel :
import { ChatOpenAI } from "langchain/chat_models/openai";const chatModel = new ChatOpenAI({openAIApiKey: "...",
});
这里 openAIApiKey 可以在实例化的时候传入,也可以放置在环境变量 OPENAI_API_KEY 中,这样就不用每次都传入了,LangChain 会自动从 process.env 读取。如果是 Azure OpenAI,那对应的就是 AZURE_OPENAI_API_KEY、AZURE_OPENAI_API_INSTANCE_NAME、AZURE_OPENAI_API_DEPLOYMENT_NAME 等等。
接着就可以调用模型:
import { HumanMessage, SystemMessage } from "langchain/chat_models/messages";const messages = [new SystemMessage("你是一位语言模型专家"),new HumanMessage("模型正则化的目的是什么?"),
];
这里的 SystemMessage 和 HumanMessage 都是 LangChain.js 提供的消息类,分别表示系统消息和用户消息。用户消息好理解,系统消息的话可以看作是针对 AI 模型的一个高级指令(instruction),比如 SystemMessage("你是一位语言模型专家") 就是告诉 AI 模型,你是一位语言模型专家,这样 AI 模型就会以这个身份来回答你的问题,SystemMessage 是可选的。
await chatModel.invoke(messages);
这里的 invoke() 方法就是调用模型,它会返回一个 Promise,这个 Promise 的结果就是 AI 模型的回复,比如:
AIMessage { content: 'The purpose of model regularization is to prevent overfitting in machine learning models. Overfitting occurs when a model becomes too complex and starts to fit the noise in the training data, leading to poor generalization on unseen data. Regularization techniques introduce additional constraints or penalties to the model's objective function, discouraging it from becoming overly complex and promoting simpler and more generalizable models. Regularization helps to strike a balance between fitting the training data well and avoiding overfitting, leading to better performance on new, unseen data.' }
流式传输
流式传输是一个基本功能了,一开始 LangChain 仅支持使用回调函数的方式来实现,比如:
const chat = new ChatOpenAI({streaming: true,
});const response = await chat.call([new HumanMessage("讲个笑话")], {callbacks: [{handleLLMNewToken(token: string) {console.log({ token });},},],
});
这样每当模型返回的时候,都会触发 handleLLMNewToken 回调函数,新版 LangChain.js 更加灵活,使用 .stream() 方法可以实现同样的功能:
const stream = await chat.stream([new HumanMessage("讲个笑话")]);for await (const chunk of stream) {console.log(chunk);
}
这里的 stream 是一个 AsyncIterableIterator,可以使用 for await 来遍历,每当模型返回的时候,就会触发 for await 中的代码。
JSON Mode
JSON Mode 是 OpenAI 新版的能力,它可以让你更好地控制 AI 模型的输出,比如:
const jsonModeModel = new ChatOpenAI({modelName: "gpt-4-1106-preview",
}).bind({response_format: {type: "json_object",},
});
注意,目前仅 gpt-4-1106-preview 模型支持 JSON Mode,另外还有一个强制性的要求,就是 SystemMessage 必须包含 JSON 字眼:
const res = await jsonModeModel.invoke([["system", "Only return JSON"],["human", "Hi there!"],
]);
后续 GPT 迭代 JSON Mode 应该就会变成通用能力,之语 SystemMessage 的规则,不知道后续会不会改变。
函数调用
函数调用(Function Calling)是 OpenAI 的一个重点能力,也就是目前 AI 应用和程序的一个重要交互协议。函数调用其实很简单,就是先让 AI 去选择调用哪个函数,然后在程序中调用真正的函数。
最常见的场景就是联网回答,你提供了「联网搜索」的函数,当用户提问「今天的重点新闻是什么」的时候,AI 会先调用「联网搜索」函数,然后根据函数执行得到的信息,最终再回答用户的问题。
OpenAI 使用 JSON Schema 来定义函数调用的协议,比如定义一个提取字段的函数:
const extractionFunctionSchema = {// 定义函数的名字name: "extractor",// 定义函数的描述description: "Extracts fields from the input.",// 定义函数的入参有哪些parameters: {type: "object",properties: {tone: {type: "string",enum: ["positive", "negative"],description: "The overall tone of the input",},word_count: {type: "number",description: "The number of words in the input",},chat_response: {type: "string",description: "A response to the human's input",},},required: ["tone", "word_count", "chat_response"],},
};
也可以使用 zod 这个库,写起来更方便:
import { z } from "zod";
import { zodToJsonSchema } from "zod-to-json-schema";const extractionFunctionSchema = {name: "extractor",description: "Extracts fields from the input.",parameters: zodToJsonSchema(z.object({tone: z.enum(["positive", "negative"]).describe("The overall tone of the input"),entity: z.string().describe("The entity mentioned in the input"),word_count: z.number().describe("The number of words in the input"),chat_response: z.string().describe("A response to the human's input"),final_punctuation: z.optional(z.string()).describe("The final punctuation mark in the input, if any."),})),
};
调用函数:
const model = new ChatOpenAI({modelName: "gpt-4",
}).bind({functions: [extractionFunctionSchema],function_call: { name: "extractor" },
});
const result = await model.invoke([new HumanMessage("What a beautiful day!")]);
console.log(result);
/*
AIMessage {//...additional_kwargs: {function_call: {name: 'extractor',arguments: '{\n' +'"tone": "positive",\n' +'"entity": "day",\n' +'"word_count": 4,\n' +`"chat_response": "I'm glad you're enjoying the day!",\n` +'"final_punctuation": "!"\n' +'}'}}
}
*/
最后
推荐一些好用的资源
👉 StarFlow.tech ,一个集聊天、工作流和知识库的 AI 平台。在这里,你可以免费使用 ChatGPT3.5 和 3.5 16K,还有 GPT-4 Vision、DELL·E3、Midjourney 等多种模型可供选择。这个平台就像一个小型工作室,助力个人效率 Max!
👉 OpenAI 官方提示词指南 ,专门面向中文的提示词工程指南,该教程是 OpenAI 官方出版,主要包括了六大策略,轻松学习提示词技巧。
相关文章:
LangChain.js 实战系列:入门介绍
📝 LangChain.js 是一个快速开发大模型应用的框架,它提供了一系列强大的功能和工具,使得开发者能够更加高效地构建复杂的应用程序。LangChain.js 实战系列文章将介绍在实际项目中使用 LangChain.js 时的一些方法和技巧。 LangChain.js 是一个…...
pyCharm 打印控制台中文乱码解决办法
解决方法 在 "File" -> "Settings" 中的控制台设置: 在 "File" -> "Settings" 中,你可以找到 "Editor" -> "General" -> "Console"。在这里,你可能会找到…...
计算机基础--Linux详解
一概述 Linux是一种自由和开放源码的类UNIX操作系统。它是由林纳斯托瓦兹于1991年首次发布的,并从那时起在全球范围内得到了广泛的应用和开发。Linux具有强大的可定制性,可以运行在各种硬件平台上,包括x86、ARM、MIPS等。它不仅广泛应用于服…...
基于OpenAI的Whisper构建的高效语音识别模型:faster-whisper
1 faster-whisper介绍 faster-whisper是基于OpenAI的Whisper模型的高效实现,它利用CTranslate2,一个专为Transformer模型设计的快速推理引擎。这种实现不仅提高了语音识别的速度,还优化了内存使用效率。faster-whisper的核心优势在于其能够在…...
cfa一级考生复习经验分享系列(十六)
写在前面:并不鼓励大家在考前一个月才开始复习,不过,既然已经逼到了绝境,灰心丧气也没有用,不如放手一搏! 首先说一下我的背景,工作金融机构的it,和cfa基本没关系,本硕计…...
数模学习day05-插值算法
插值算法有什么作用呢? 答:数模比赛中,常常需要根据已知的函数点进行数据、模型的处理和分析,而有时候现有的数据是极少的,不足以支撑分析的进行,这时就需要使用一些数学的方法,“模拟产生”一些…...
hive中struct相关函数总结
目录 hive官方函数解释示例实战 hive官方函数解释 hive官网函数大全地址:添加链接描述 Return TypeNameDescriptionstructstruct(val1, val2, val3, …)Creates a struct with the given field values. Struct field names will be col1, col2, …structnamed_str…...
macos下转换.dmg文件为 .iso .cdr文件的简单方法
为了让镜像文件在mac 和windows平台通用, 所以需要将.dmg格式的镜像文件转换为.iso文件, 转换方法也非常简单, 一行命令即可 hdiutil convert /path/to/example.dmg -format UDTO -o /path/to/example.iso 转换完成后的文件名称默认是 example.iso.cdr 这里直接将.cdr后缀删…...
ALSA学习(5)——设备中的alsa
参考博客: https://blog.csdn.net/DroidPhone/article/details/7165482 (一下内容基本是原博主的博客转载) 文章目录 一、ASOC的由来二、硬件架构三、软件架构四、数据结构五、内核对ASoC的改进 一、ASOC的由来 ASoC–ALSA System on Chip …...
uniapp中组件库的丰富NumberBox 步进器的用法
目录 基本使用 #步长设置 #限制输入范围 #限制只能输入整数 #禁用 #固定小数位数 #异步变更 #自定义颜色和大小 #自定义 slot API #Props #Events #Slots 基本使用 通过v-model绑定value初始值,此值是双向绑定的,无需在回调中将返回的数值重…...
【Matlab】基于遗传算法优化BP神经网络 (GA-BP)的数据时序预测
资源下载: https://download.csdn.net/download/vvoennvv/88682033 一,概述 基于遗传算法优化BP神经网络 (GA-BP) 的数据时序预测是一种常用的机器学习方法,用于预测时间序列数据的趋势和未来值。 在使用这种方法之前,需要将时间序…...
计算机毕业设计 基于HTML5+CSS3的在线英语阅读分级平台的设计与实现 Java实战项目 附源码+文档+视频讲解
博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…...
云原生|kubernetes|kubernetes资源备份和集群迁移神器velero的部署和使用
前言: kubernetes集群需要灾备吗?kubernetes需要迁移吗? 答案肯定是需要的 那么,如何做kubernetes灾备和迁移呢?当然了,有很多的方法,例如,自己编写shell脚本,或者使用…...
【26.4K⭐】ShareX:一款开源免费、功能强大且丰富的截屏录屏软件
【26.4K⭐】ShareX:一款开源免费、功能强大且丰富的截屏录屏软件 在日常工作、学习和娱乐过程中,我们经常需要截取屏幕或者录制屏幕上特定区域中的内容并进行标记、编辑等操作。无论是为了记录重要的信息、分享有趣的内容,还是为了制作教程和…...
什么是ajax,为什么使用ajax?
概念:ajax是一种现有的技术集合,技术内容包括:HTML或XHTML,CSS,JavaScript,DOM,XML,XSLT,以及最重要的XMLHttpRequest。用于浏览器与服务器之间使用异步传输,做到局部请求以实现局部刷新。 作用…...
AI面板识别 - 华为OD统一考试
OD统一考试 (B卷) 分值: 100分 题解: Java / Python / C++ 题目描述 AI识别到面板上有N(1 ≤ N ≤ 100)个指示灯,灯大小一样,任意两个之间无重叠。 由于AI识别误差,每次别到的指示灯位置可能有差异,以4个坐标值描述AI识别的指示灯的大小和位置(左上角x1,y1,右下角x2…...
Linux之磁盘分区,挂载
Linux分区 分区介绍 对linux来说无论有几个分区,分给哪个目录使用,归根结底只有一个根目录,linux中每个分区都是用来组成整个文件系统的一部分。linux采用“载入"的处理方法,他的整个文件系统中包含一整套的文件和目录&…...
2核2G3M服务器上传速度多少?以阿里云和腾讯云为例
2核2G3M服务器上传速度多少?上传是按10M带宽算,上传速度是1280KB/秒,即1.25M/秒;下载速度按3M带宽计算,下载速度是384KB/秒。本文是以阿里云为例的,阿里云服务器当公网带宽小于10M及10M以下时,上…...
Cisco模拟器-OSPF路由协议
设计要求用两台双口路由器连接不同IP网段的计算机,并使用OSFP协议发现路由表使不同IP网段的计算机可以相互通信。 通过设计,可以连通IP地址网段不同的局域网,可应用在园区网的互连和互通的实现上。 主要配置步骤 路由器0: Router…...
SpEL 的使用
SpEL 的使用 SpEL的全称为 Spring Expression Language,具有再运行时构建复杂表达式、存取对象图属性、对象方法调用等功能 下面是一个简单样例 public class SpelTest { Test public void test1() { ExpressionParser parser new SpelExpressionParser(); …...
dfs:飞机降落
题目:P9241 [蓝桥杯 2023 省 B] 飞机降落 - 洛谷 做题目之前一定要先看数据范围。这道题的数据范围,T,N均<10,可以用暴力搜索。 这道题是排序,假设有3辆飞机。顺序可以是123,132,213,231&am…...
如何使用Rainmeter监控PCIe设备延迟:完整响应时间检测指南
如何使用Rainmeter监控PCIe设备延迟:完整响应时间检测指南 【免费下载链接】rainmeter Desktop customization tool for Windows 项目地址: https://gitcode.com/gh_mirrors/ra/rainmeter Rainmeter是一款强大的Windows桌面自定义工具,不仅能美化…...
SEO_从基础到精通,系统学习SEO的完整路径解析
<h2>SEO的基础:了解搜索引擎优化的核心概念</h2> <p>搜索引擎优化(SEO)是一个广泛且复杂的领域,它的核心在于提升网站在搜索引擎结果页面(SERP)中的自然排名。了解SEO的基础概念是每一个…...
OpenClaw进阶:利用GLM-4.7-Flash实现复杂任务链式执行
OpenClaw进阶:利用GLM-4.7-Flash实现复杂任务链式执行 1. 为什么需要链式任务执行 上周我在整理项目文档时,遇到了一个典型的多步骤任务:需要从十几个Markdown文件中提取关键数据,整理成Excel表格,然后根据内容生成分…...
【PyCon 2024核心议题首发】:CPython 3.13 asyncio重构内幕——原生任务取消语义、零拷贝Socket API与异步GC优化前瞻
第一章:PyCon 2024与CPython 3.13异步演进全景图PyCon 2024于五月在匹兹堡圆满落幕,其核心议题之一正是CPython 3.13的异步能力跃迁。作为首个将async/await语义深度融入解释器底层的Python版本,3.13引入了原生协程调度优化、零拷贝内存视图支…...
为什么顶尖量化团队已弃用Pandas清洗?Polars 2.0零拷贝字符串正则+Unicode归一化实战(附GitHub千星Benchmark)
第一章:Polars 2.0 大规模数据清洗技巧 2026 最新趋势 Polars 2.0 在 2026 年已全面支持零拷贝流式清洗、原生 Delta Lake 元数据感知与分布式列式校验,成为金融、遥感与实时日志场景中替代 Pandas 的首选引擎。其核心突破在于 LazyFrame 的智能物化策略…...
告别手动编译:用Conda在Ubuntu 20.04上一键安装与管理SUMO交通仿真环境
告别手动编译:用Conda在Ubuntu 20.04上一键安装与管理SUMO交通仿真环境 在交通工程和智能驾驶研究领域,SUMO(Simulation of Urban MObility)作为开源的微观交通仿真工具,正被越来越多的研究者和开发者采用。然而&#…...
医疗文本处理实战:用jieba分词器搞定妇科专业术语分词(附完整词典配置)
医疗文本处理实战:用jieba分词器精准解析妇科专业术语 在医疗信息化和自然语言处理领域,专业术语的准确识别一直是技术难点。特别是妇科临床文本中,"妇科凝胶"、"宫颈刮片"等复合型专业词汇的切割问题,直接影…...
计算机毕业设计springboot基于的游戏交易平台 基于SpringBoot的虚拟资产流通服务平台的设计与实现 基于SpringBoot架构的网络游戏账号及道具交易系统的设计与实现
计算机毕业设计springboot基于的游戏交易平台(配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。随着互联网技术的飞速发展和网络游戏产业的蓬勃兴起,虚拟资产交易已成为…...
League Akari:终极英雄联盟自动化工具集——提升90%游戏效率的完整指南
League Akari:终极英雄联盟自动化工具集——提升90%游戏效率的完整指南 【免费下载链接】League-Toolkit 兴趣使然的、简单易用的英雄联盟工具集。支持战绩查询、自动秒选等功能。基于 LCU API。 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit …...
