AI - 使用LangChain请求LLM结构化生成内容

AI - 使用LangChain请求LLM结构化生成内容

ai-langchain

基于深度学习的大型语言模型(LLM)不仅可以生成文本,还可以帮助我们完成许多复杂任务,如自动化客服、内容创作和数据分析。然而,如何从这些模型中结构化地获取输出,仍然是一个关键问题。在这篇文章中,我们将探索如何使用 JavaScript 和 LangChain 构建一个简单的 LLM结构化输出的应用程序。

场景

在构建 LLM 应用程序时,许多时候我们不仅仅需要模型生成文本,还需要它按照我们指定的格式输出结果。这样的需求在以下场景中非常常见:

  • 数据处理和分析:当我们需要对生成的数据进一步处理和分析时,结构化数据会更加便于处理。
  • 系统集成:在复杂系统中,各个组件的协作往往需要标准化的数据格式,以确保不同模块之间的兼容性和数据流的顺畅。
  • 用户界面展示:结构化的数据更容易在用户界面中展示,让用户可以直观地理解内容。

好处

一致性

结构化输出可以确保返回的数据格式一致。这对于解析和处理数据非常重要,尤其是在需要进一步操作或存储数据的情况下。

易于调试

标准化的数据格式使得调试过程更加容易。通过固定的结构,我们可以迅速识别并修复可能存在的格式或内容问题。

自动化

结构化数据更便于自动化处理。无论是将数据存储到数据库中,还是进行进一步的分析和可视化,结构化数据都能大大简化这些过程。

实现结构化内容生成的方式

在利用大型语言模型(LLM)生成结构化内容时,我们可以通过直接设置提示(prompting)或使用withStructuredOutput方法来达到目的。这两种方法都有其独特的优点和适用场合。以下是对这两种方法的比较:

通过提示(Prompting)

通过提示法实现结构化内容生成,主要依赖于构建一个明确的文本提示,指导模型生成所需格式的输出。

优点

  • 简单易行:不需要额外的工具或库,只需精心设计提示即可。
  • 灵活性高:可以自由地设计和修改提示内容,适应不同的需求。
  • 模型无关:适用于不同类型的语言模型(如GPT-3、BERT等),无论其内部细节如何。

缺点

  • 依赖人工设计质量:提示的设计质量直接影响输出的准确性和格式一致性。
  • 不易维护和扩展:复杂的提示容易变得冗长和难以管理,修改提示可能导致意料之外的问题。
  • 高变异性:模型可能因细微的提示变化生成不同的格式,缺乏一致性和稳定性。

使用withStructuredOutput

withStructuredOutput方法是LangChain库提供的一种方法,通过定义结构化输出的模式来指导模型生成特定格式的内容。

优点

  • 强一致性:通过预定义的数据模式确保输出的格式和内容一致。
  • 易于维护和扩展:更改结构化输出模式比更改提示更为简单和直观,不需要修改大量提示文本。
  • 自动化:减少了手动调试和格式化的麻烦,通过明确的模式定义确保输出的准确性。

缺点

  • 依赖工具库:需要学习和使用LangChain或类似工具库提供的API。
  • 灵活性较低:输出格式固定,适应特定需求相对简单,但面对复杂和变动频繁的需求时可能不灵活。

示例代码

示例代码来主体源于LangChain官网,有兴趣的小伙伴可以去官网查看。下面将通过多种方式提示 LLM 讲一个笑话,并要求返回包括笑话的开头(setup),笑点(punchline),笑话的搞笑程度(rating)以及为什么它很搞笑(reason)的结构化输出。

第一步:设置开发环境

首先,创建一个新目录并进入该目录:

mkdir langchain-structure-output-app
cd langchain-structure-output-app

初始化一个新的Node.js项目:

npm init -y

安装必要的依赖:

# 安装langchain
npm install langchain @langchain/core --save# 安装groq的langchain开发包
npm install @langchain/groq  --save# 安装环境变量配置库
npm install dotenv --save# 安装JSONSchema生成库
npm install zod --save

第二步:创建项目结构

创建项目所需的文件和目录结构:

langchain-structure-output-app
├── index.js
├── .env
└── package.json

第三步:配置环境变量

在项目目录中创建一个 .env 文件,并添加Groq API密钥:

GROQ_API_KEY=your_groq_api_key_here

第四步:编写主应用程序

index.js 中编写应用程序代码,配置LangChain并创建翻译功能。

// 引入LangChain开发包,ChatGroq是用于与Groq语言模型交互的类
import { ChatGroq } from "@langchain/groq";// 导入 dotenv,它是一个零依赖模块,能够从.env文件中加载环境变量到process.env中
import dotenv from "dotenv";// 导入zod用于TypeScript优先的模式验证,并带有静态类型推断功能
import { z } from "zod";// 加载 .env 文件中的环境变量GROQ_API_KEY
dotenv.config();// 配置Groq LLM(语言模型),设置模型名称和温度参数
const model = new ChatGroq({model: "mixtral-8x7b-32768", // 使用的模型名称temperature: 0, // 温度参数,决定输出的随机性
});

第五步:JsonSchema结构化输出

/*** 通过JsonSchema实现结构化输出* * @param {string} model LLM实例* @param {boolean} includeRaw 是否包含原始内容,默认不包含*/
async function tellJoke(model, includeRaw = false) {// 定义结构化的笑话对象模式const joke = z.object({setup: z.string().describe("The setup of the joke"), // 笑话的开场部分,为字符串类型rating: z.number().describe("How funny the joke is, from 1 to 10"), // 笑话的搞笑程度评分,1到10的数字类型punchline: z.string().describe("The punchline to the joke"), // 笑点部分,为字符串类型reason: z.string().describe("The reason why it is funny"), // 可笑的原因,为字符串类型});// 使用withStructuredOutput方法,将输出格式化为定义好的笑话模式// 设置输出格式名为“joke”const structuredLlm = model.withStructuredOutput(joke, {includeRaw: includeRaw,name: "joke",});// 通过invoke方法向模型询问一个关于狗的笑话并获取结构化的输出const answer = await structuredLlm.invoke("Tell me a joke about dogs");// 打印输出的笑话结果console.log(answer);
}
await tellJoke(model);

用以下命令或者npm start运行应用程序:

node index.js

输出结果是一个标准的JSON格式,如下所示:

bash-3.2$ npm start> langchain-structure-output-app@1.0.0 start
> node index{setup: 'Why did the scarecrow adopt a dog?',rating: 5,punchline: 'Because he needed a bark-ing buddy!',reason: "It's a play on words between 'bark' and 'scarecrow's job'"
}

然后并非所有的LLM都支持结构化内容输出,对于不支持的情况,可以考虑将tellJoke(model, includeRaw = false)的第二个参数includeRaw置成true,这样可以返回原始内容,如下所示,然后开发者可以进行自定义解析。

{raw: AIMessage {"content": "","additional_kwargs": {"tool_calls": [{"id": "call_sxtk","type": "function","function": "[Object]"}]},"response_metadata": {"tokenUsage": {"completionTokens": 158,"promptTokens": 1280,"totalTokens": 1438},"finish_reason": "tool_calls"},"tool_calls": [{"name": "joke","args": {"setup": "Why did the scarecrow adopt a dog?","rating": 5,"punchline": "Because he needed a bark-ing buddy!","reason": "It's a play on words between 'bark' and 'scarecrow's job'"},"type": "tool_call","id": "call_sxtk"}],"invalid_tool_calls": [],"usage_metadata": {"input_tokens": 1280,"output_tokens": 158,"total_tokens": 1438}},parsed: {setup: 'Why did the scarecrow adopt a dog?',rating: 5,punchline: 'Because he needed a bark-ing buddy!',reason: "It's a play on words between 'bark' and 'scarecrow's job'"}
}

第六步:OpenAI风格结构化输出

// 通过OpenAI-style JSON schema 实现结构化输出
async function tellJoke2(model) {// 定义结构化的笑话对象模式const structuredLlm = model.withStructuredOutput({name: "joke",description: "Joke to tell user.",parameters: {title: "Joke",type: "object",properties: {setup: { type: "string", description: "The setup for the joke" },rating: { type: "number", description: "How funny the joke is, from 1 to 10" },punchline: { type: "string", description: "The punchline to the joke" },reason: { type: "string", description: "The reason why it is funny" }},required: ["setup", "punchline", "rating", "reason"],},});// 通过invoke方法向模型询问一个关于老鼠的笑话并获取结构化的输出// 设置输出格式名为“joke”const answer = await structuredLlm.invoke("Tell me a joke about mouse", { name: "joke" });// 打印输出的笑话结果console.log(answer);
}
await tellJoke2(model);

用以下命令或者npm start运行应用程序:

node index.js

输出结果是一个标准的JSON格式,如下所示:

bash-3.2$ npm start> langchain-structure-output-app@1.0.0 start
> node index{setup: "Why don't mice use spell check?",punchline: "Because they're afraid of making a misspell-mouse!",rating: 5,reason: "It's a play on words related to the question."
}

总结

ai-quotes-1

在本文中,我们使用LangChain和JavaScript创建了一个简单的格式化输出应用程序,通过配置Groq API并使用LangChain框架,在利用大型语言模型(LLM)生成结构化内容时,我们可以通过直接设置提示(prompting)或使用withStructuredOutput方法来达到目的。在这个基础上,您可以扩展该应用程序,以支持更多的功能和更复杂的应用场景。希望本教程对您有所帮助!

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用GPT-SoVITS训练语音模型

1.项目演示 阅读单句话 1725352713141 读古诗 1725353700203 2.项目环境 开发环境:linux 机器配置如下:实际使用率百分之二十几, 3.开发步骤 1.首先是准备数据集,要求是wav格式,一到两个小时即可, 2.…

UML的另一个主角——用例图

顺序图和类图已经出过单集,本贴要分享的是用例图。 类图https://blog.csdn.net/jsl123x/article/details/143526286?spm1001.2014.3001.5501顺序图https://jslhyh32.blog.csdn.net/article/details/134350587 目录 一.系统 二.参与者 1.主要参与者 2.次要参与…

set和map的使用

目录 1.关联式容器 2.键值对 3.set 3.1set的模版参数列表 3.2对set的修改 3.2.1insert 3.2.2 erase 3.2.3clear 3.2.4swap 3.2.5 find 3.3set的迭代器 3.4set的容量 4.map 4.1对map的修改 4.1.1insert 4.1.2erase 4.1.3swap 4.1.4clear 4.2map的迭代器 4.3opera…

【5.10】指针算法-快慢指针将有序链表转二叉搜索树

一、题目 给定一个单链表,其中的 元素按升序排序 ,将其转换为 高度平衡的二叉搜索树 。 本题中,一个高度平衡二叉树是指一个二叉树每个节点的左右两个子树的高度差的绝对值不超过 1。 示例: 给定的有序链表: [ -10 , -3 , 0 , …

dns服务器配置

主服务器 1.挂载点 mount /dev/sr0 /mnt 2.防火墙关闭 systemctl stop firewalld setenforce 0 3.下载bind软件 dnf install bind -y 4.进行正向解析配置 vim /etc/named.conf options { listen-on port 53 { 192.168.92.128; }; directo…

stable diffusion图生图

本节内容,给大家带来的是stable diffusion的图生图课程,我们在midjourney的课程中有学习过midjourney的图生图功能,即使用垫图的方式来引导AI绘制图片。图生图是AI绘图程序一个非常重要的功能,stable diffusion同样提供了类似的功…

论文阅读笔记:DRCT: Saving Image Super-Resolution away from Information Bottleneck

论文阅读笔记:DRCT: Saving Image Super-Resolution away from Information Bottleneck 1 背景1.1 问题1.2 本文提出的方法 2 创新点3 方法4 模块4.1 问题描述4.2 深度特征提取模块4.3 同任务渐进式训练策略 5 效果5.1 和SOTA方法对比 论文:https://arxi…

一周内从0到1开发一款 AR眼镜 相机应用?

目录 1. 📂 前言 2. 💠 任务拆分 2.1 产品需求拆分 2.2 开发工作拆分 3. 🔱 开发实现 3.1 代码目录截图 3.2 app 模块 3.3 middleware 模块 3.4 portal 模块 4. ⚛️ 拍照与录像 4.1 前滑后滑统一处理 4.2 初始化 View 以及 Came…

【论文精读】LPT: Long-tailed prompt tuning for image classification

🌈 个人主页:十二月的猫-CSDN博客 🔥 系列专栏: 🏀论文精读_十二月的猫的博客-CSDN博客 💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 目录 1. 摘要 2. …

《重学Java设计模式》之 建造者模式

建造者模式所完成的内容就是通过将多个简单对象通过一步步的组装构建出一个复杂对象的过程 模拟装修公司对于设计出一些套餐装修服务的场景。 很多装修公司都会给出自家的套餐服务,一般有;豪华、轻奢、简约等,这些套餐的后面是不同的商品的…

Android Framework AMS(12)广播组件分析-3(广播发送流程解读)

该系列文章总纲链接:专题总纲目录 Android Framework 总纲 本章关键点总结 & 说明: 说明:本章节主要解读广播组件的广播发送过程。关注思维导图中左上侧部分即可。 有了前面广播组件 注册和注销程分析的基础,基于此&#xff…

MongoDB笔记02-MongoDB基本常用命令

文章目录 一、前言二、数据库操作2.1 选择和创建数据库2.2 数据库的删除 3 集合操作3.1 集合的显式创建3.2 集合的隐式创建3.3 集合的删除 四、文档基本CRUD4.1 文档的插入4.1.1 单个文档插入4.1.2 批量插入 4.2 文档的基本查询4.2.1 查询所有4.2.2 投影查询(Projec…

MySQL基础-单表查询

语法 select [distinct] 列名1,列名2 as 别名... from数据表名 where组前筛选 group by分组字段 having组后筛选 order by排序的列 [asc | desc] limit 起始索引,数据条数 测试数据 # 建测试表 create table products (id int primary key a…

【pycharm jupyter】远程开发 启动报错

报错信息 upyter server process exited with code 1 ServerApp] A _jupyter_server_extension_points function was not found in jupyter_lsp. Instead, a _jupyter_server_extension_paths function was found and will be used for now. This function name will be depre…

CPU Study - Instructions Fetch

参考来源:《超标量处理器设计》—— 姚永斌 N-Way CPU 取指问题 如果CPU可以在每个周期内同时解码N条指令,则此类CPU为N-Way超标量处理器。 N-Way超标量处理器需要每个周期从I-Cache中至少取得N条指令,这N条指令成为一组Fetch Group。 为了…

掌握 PyQt5:从零开始的桌面应用开发

PyQT5——图形化界面 文章目录 PyQT5——图形化界面集成化图形界面工具为什么使用 \$ProjectFileDir$?示例场景其他 Varaiablespyuic参数解释整体含义示例使用PyQt5和pyuic 创建pyqt5的程序创建一个窗口app.exec\_()和sys.exit(app.exec_())的区别1. app.exec_()2. sys.exit(a…

论文阅读笔记:Image Processing GNN: Breaking Rigidity in Super-Resolution

论文阅读笔记:Image Processing GNN: Breaking Rigidity in Super-Resolution 1 背景2 创新点3 方法4 模块4.1 以往SR模型的刚性4.2 图构建4.2.1 度灵活性4.2.2 像素节点灵活性4.2.3 空间灵活性 4.3 图聚合4.4 多尺度图聚合模块MGB4.5 图聚合层GAL 5 效果5.1 和SOTA…

PMP–一、二、三模、冲刺–分类–7.成本管理–技巧–挣值分析

文章目录 技巧一模7.成本管理--4.控制成本--数据分析--挣值分析--进度绩效指数(SPI)是测量进度效率的一种指标,表示为挣值与计划价值之比,反映了项目团队完成工作的效率。 当 SPI小于 1.0 时,说明已完成的工作量未达到…

保姆级教程!!教你通过【Pycharm远程】连接服务器运行项目代码

小罗碎碎念 这篇文章主要解决一个问题——我有服务器,但是不知道怎么拿来写代码,跑深度学习项目。确实,玩深度学习的成本比较高,无论是前期的学习成本,还是你需要具备的硬件成本,都是拦路虎。小罗没有办法…

成绩管理系统软件体系结构设计

成绩管理系统软件体系结构设计 文档简介 1.1 目的 1.2 范围 1.3 定义、首字母缩写词和缩略语 1.4参考资料 1.5 概述体系结构表示方式软件体系结构的目标和约束 3.1 结构清晰 3.2 支持外包开发 3.3 可扩展性 3.4 系统安全性 3.5 可移植性 4体系结构模式逻辑视图进程视图…