LangChain 开发LLM的框架

本文涉及的产品
阿里云百炼推荐规格 ADB PostgreSQL,4核16GB 100GB 1个月
简介: LangChain 开发LLM的框架

1、简介

LangChain是一个用于开发由语言模型提供支持的应用程序的框架。它支持以下应用程序:

  • 上下文感知:将语言模型连接到其他上下文源(提示说明、少量示例、响应内容)
  • 推理:依靠语言模型进行推理(关于如何根据提供的上下文回答,采取什么行动等)

2、LangChain 的主要价值

  1. 组件:用于处理语言模型的抽象,以及每个抽象的实现集合。无论您是否使用LangChain框架的其余部分,组件是模块化的并且易于使用。
  2. 现成链:用于完成特定更高级别任务的组件的结构化组装。现成的链使入门变得容易。对于更复杂的应用程序和细微差别的用例,组件可以轻松定制现有链或构建新链。

目前LangChain 支持的变成语言版本有两种:

  • 针对LangChainJS/TS包的版本
  • 针对LangChain Python的版本

3、模块

LangChain为以下模块提供标准的、可扩展的接口和外部集成,从简单到复杂依次列出

  • Model I/O : 语言模型的接口
  • Retrieval: application-specific数据接口
  • Chains: 构造调用序列
  • Agents: 让链选择使用给定高级指令的工具
  • Memory: 在链的运行之间保持应用程序状态
  • Callbacks: 记录和流式传输任何链的中间步骤

4、安装

4.1 python 版本安装

安装LangChain,请运行:

pip install langchain

这将安装LangChain的最低要求。 LangChain的很多价值来自于与各种模型提供者、数据存储等的集成。 默认情况下,不安装执行此操作所需的依赖项。 然而,还有两种安装LangChain的方法会带来这些依赖项。

要安装常见LLM提供程序所需的模块,请运行:

pip install langchain[llms]

要安装所有集成所需的所有模块,请运行:

pip install langchain[all]

请注意,如果您使用zsh,则在将它们作为参数传递给命令时需要将方括号引起来,例如:

pip install 'langchain[all]'

如果你想从源代码安装,你可以通过克隆repo来实现,并确保目录正在PATH/TO/REPO/langchain/libs/langchain运行:

pip install -e .

4.2 TypeScript 版本安装

LangChain是用TypeScript编写的,可用于:

  • Node. js(ESM和Common JS)-18.x、19.x、20.x
  • Cloudflare Workers
  • Vercel / Next.js (Browser, Serverless and Edge functions)
  • Supabase Edge Functions
  • Browser
  • Deno
  • Bun

请使用以下命令进行安装:

npm 安装

npm install -S langchain

yarn 安装

yarn add langchain

pnpm 安装

pnpm add langchain

加载库

LangChain提供了针对Node. js环境的ESM构建。您可以使用以下语法导入它:

import { OpenAI } from "langchain/llms/openai";

如果您在ESM项目中使用TypeScript,我们建议更新您的tsconfig.json以包含以下内容:

{
  "compilerOptions": {
    ...
    "target": "ES2020", // or higher
    "module": "nodenext",
  }
}

LangChain提供了针对Node. js环境的Common JS构建。您可以使用以下语法导入它:

const { OpenAI } = require("langchain/llms/openai");

如果您在0.0.52之前从LangChain版本进行更新,则需要更新导入以使用新的路径结构。

之前的写法是:

import { OpenAI } from "langchain/llms";

现在需要更新为:

import { OpenAI } from "langchain/llms/openai";

这适用于以下6个模块的所有导入,这些模块已被拆分为每个接入的子模块。组合模块已弃用,在Node. js之外不起作用,将在未来版本中删除。

  • 如果您使用的是langchain/llms,请参阅LLMs以获取更新的导入路径。
  • 如果您使用的是langchain/chat_models,请参阅 Chat Models 以获取更新的导入路径。
  • 如果您使用的是langchain/embeddings,请参阅Embeddings 以获取更新的导入路径。
  • 如果您使用的是langchain/vectorstores,请参阅Vector Stores 以获取更新的导入路径。
  • 如果您使用的是langchain/document_loaders,请参阅Document Loaders 以获取更新的导入路径。
  • 如果您使用的是langchain/retrievers,请参阅Retrievers以获取更新的导入路径。

其他模块不受此更改的影响,您可以继续从同一路径导入它们。

此外,还需要一些突破性的更改来支持新环境:

  • import { Calculator } from "langchain/tools";现在移到
  • import { Calculator } from "langchain/tools/calculator";
  • import { loadLLM } from "langchain/llms";现在移到
  • import { loadLLM } from "langchain/llms/load";
  • import { loadAgent } from "langchain/agents";现在移到
  • import { loadAgent } from "langchain/agents/load";
  • import { loadPrompt } from "langchain/prompts";现在移到
  • import { loadPrompt } from "langchain/prompts/load";
  • import { loadChain } from "langchain/chains";现在移到
  • import { loadChain } from "langchain/chains/load";

5、环境设置

使用LangChain通常需要与一个或多个模型提供者、数据存储、API等集成。

访问他们的API需要一个API密钥,您可以通过创建一个帐户并在此标题获得该密钥。一旦我们有了密钥,我们希望通过运行以下命令将其设置为环境变量:

export OPENAI_API_KEY="..."

如果您不想设置环境变量,您可以在初始化OpenAI LLM类时通过openAIApiKey参数直接传递密钥:

import { OpenAI } from "langchain/llms/openai";
const llm = new OpenAI({
  openAIApiKey: "YOUR_KEY_HERE",
});

6、构建一个应用程序

现在我们可以开始构建我们的语言模型应用程序了,LangChain提供了许多可用于构建语言模型应用程序的模块,模块可以在简单的应用程序中作为独立的,也可以组合用于更复杂的用例。

LangChain帮助创建的最常见和最重要的链包含三件事:

  • LLM:语言模型是这里的核心推理引擎。为了使用LangChain,您需要了解不同类型的语言模型以及如何使用它们。
  • 提示模板:这为语言模型提供了指令,这控制了语言模型输出的内容,因此了解如何构造提示和不同的提示策略至关重要。
  • 输出解析器:它们将来自LLM的原始响应转换为更可行的格式,使其在输出目标端操作简单。

7、LLMs

有两种类型的语言模型,在LangChain中称为:

  • LLMs:这是一个语言模型,它接受一个字符串作为输入并返回一个字符串
  • ChatModels:这是一个语言模型,它将消息列表作为输入并返回消息

LLM的输入/输出简单易懂——一个字符串。但是ChatModels呢?输入是一个ChatMessage列表,输出是一个ChatMessageChatMessage有两个必需的组件:

  • content:这是消息的内容。
  • role:这是ChatMessage来自的实体的角色。

LangChain提供了几个对象来轻松区分不同的角色:

  • HumanMessage:来自人类/用户的ChatMessage
  • AIMessage:来自AI/助手的ChatMessage
  • SystemMessage:来自系统的ChatMessage
  • FunctionMessage:来自函数调用的ChatMessage

如果这些角色听起来都不对,还有一个ChatMessage类,您可以在其中手动指定角色。

LangChain为两者提供了一个标准接口,但是理解这种差异对于为给定的语言模型构建提示很有用。LangChain提供的标准接口有两种方法:

  • predict:接受一个字符串,返回一个字符串
  • predictMessages:接收消息列表,返回消息。

让我们看看如何使用这些不同类型的模型和这些不同类型的输入。首先,让我们导入LLM和ChatModel并调用predict

import { OpenAI } from "langchain/llms/openai";
import { ChatOpenAI } from "langchain/chat_models/openai";
const llm = new OpenAI({
  temperature: 0.9,
});
const chatModel = new ChatOpenAI();
const text = "What would be a good company name for a company that makes colorful socks?";
const llmResult = await llm.predict(text);
/*
  "Feetful of Fun"
*/
const chatModelResult = await chatModel.predict(text);
/*
  "Socks O'Color"
*/

基本上OpenAIChatOpenAI对象只是配置对象,您可以使用温度等参数初始化它们,并传递它们。

接下来,让我们使用predictMessages方法来运行消息列表。

import { HumanMessage } from "langchain/schema";
const text = "What would be a good company name for a company that makes colorful socks?";
const messages = [new HumanMessage({ content: text })];
const llmResult = await llm.predictMessages(messages);
/*
  AIMessage {
    content: "Feetful of Fun"
  }
*/
const chatModelResult = await chatModel.predictMessages(messages);
/*
  AIMessage {
    content: "Socks O'Color"  
  }
*/

对于这两种方法,您还可以传入参数作为关键字参数。例如,您可以传入temperature: 0来调整对象配置的temperature。在运行时传入的任何值都将始终覆盖对象配置的值。

temperature限制0-2,简而言之这个参数的效果就是越大,生成的结果越随机。

8、提示模板

大多数LLM应用程序不会将用户输入直接传递到LLM中。通常,它们会将用户输入添加到更大的文本中,称为提示模板,它为手头的特定任务提供了额外的上下文。

在前面的示例中,我们传递给模型的文本包含生成企业名称的指令。对于我们的应用程序,如果用户只需要提供公司/产品的描述,而不必给出模型指令,那就太好了。

PromptTemplate正是帮助了这一点!它们捆绑了从用户输入到完全格式化的提示的所有逻辑。这可以从非常简单的开始——例如,生成上述字符串的提示只需:

import { PromptTemplate } from "langchain/prompts";
const prompt = PromptTemplate.fromTemplate("What is a good name for a company that makes {product}?");
const formattedPrompt = await prompt.format({
  product: "colorful socks",
});
/*
  "What is a good name for a company that makes colorful socks?"
*/

与原始字符串格式相比,使用这些有几个优点。您可以“部分”输出变量——例如,您一次只能格式化一些变量。您可以将它们组合在一起,轻松地将不同的模板组合成一个提示。

提示模板也可以用来生成消息列表。在这种情况下,提示不仅包含有关内容的信息,还包含每个消息(它的角色,它在列表中的位置等)。在这里,最常见的是ChatPromptTemplate是ChatMessageTemplates列表。每个ChatMessageTemplate都包含如何格式化ChatMessage的说明——它的角色,然后还有它的内容。让我们看看下面这个:

import { ChatPromptTemplate } from "langchain/prompts";
const template = "You are a helpful assistant that translates {input_language} into {output_language}.";
const humanTemplate = "{text}";
const chatPrompt = ChatPromptTemplate.fromMessages([
  ["system", template],
  ["human", humanTemplate],
]);
const formattedChatPrompt = await chatPrompt.formatMessages({
  input_language: "English",
  output_language: "French",
  text: "I love programming.",
});
/*
  [
    SystemMessage {
      content: 'You are a helpful assistant that translates English into French.'
    },
    HumanMessage { content: 'I love programming.' }
  ]
*/

9、输出解析器

输出解析器将LLM的原始输出转换为目标端可以使用的格式。输出解析器的主要类型很少,包括:

  • 从LLM转换文本->结构化信息(例如JSON)
  • 将ChatMessage转换为字符串
  • 除了消息(如OpenAI函数调用)之外,将调用返回的额外信息转换为字符串。

在以下示例中,我们将编写自己的输出解析器-将逗号分隔的列表转换为列表的解析器。

import { BaseOutputParser } from "langchain/schema/output_parser";
/**
 * Parse the output of an LLM call to a comma-separated list.
 */
class CommaSeparatedListOutputParser extends BaseOutputParser<string[]> {
  async parse(text: string): Promise<string[]> {
    return text.split(",").map((item) => item.trim());
  }
}
const parser = new CommaSeparatedListOutputParser();
const result = await parser.parse("hi, bye");
/* 
  ['hi', 'bye']
*/

10、LLMs + 提示模板 + 输出解析器

我们现在可以将所有这些组合成一条链。这条链将获取输入变量,将这些变量传递给提示模板以创建提示,将提示传递给语言模型,然后将输出传递给(可选的)输出解析器。这是捆绑模块化逻辑的便捷方法。让我们看看它的实际效果!

import { ChatOpenAI } from "langchain/chat_models/openai";
import { ChatPromptTemplate } from "langchain/prompts";
import { BaseOutputParser } from "langchain/schema/output_parser";
/**
 * Parse the output of an LLM call to a comma-separated list.
 */
class CommaSeparatedListOutputParser extends BaseOutputParser<string[]> {
  async parse(text: string): Promise<string[]> {
    return text.split(",").map((item) => item.trim());
  }
}
const template = `You are a helpful assistant who generates comma separated lists.
A user will pass in a category, and you should generate 5 objects in that category in a comma separated list.
ONLY return a comma separated list, and nothing more.`;
const humanTemplate = "{text}";
/**
 * Chat prompt for generating comma-separated lists. It combines the system
 * template and the human template.
 */
const chatPrompt = ChatPromptTemplate.fromMessages(
  [
    ["system", template],
    ["human", humanTemplate],
  ]
);
const model = new ChatOpenAI({});
const parser = new CommaSeparatedListOutputParser();
const chain = chatPrompt.pipe(model).pipe(parser);
const result = await chain.invoke({
  text: "colors",
});
/*
  ["red", "blue", "green", "yellow", "orange"]
*/

请注意,我们正在使用.pipe()方法将这些组件连接在一起。这个.pipe()方法是LangChain表达式语言的一部分。


相关实践学习
AnalyticDB PostgreSQL 企业智能数据中台:一站式管理数据服务资产
企业在数据仓库之上可构建丰富的数据服务用以支持数据应用及业务场景;ADB PG推出全新企业智能数据平台,用以帮助用户一站式的管理企业数据服务资产,包括创建, 管理,探索, 监控等; 助力企业在现有平台之上快速构建起数据服务资产体系
相关文章
|
8月前
|
数据采集 算法 数据挖掘
CLIMB自举框架:基于语义聚类的迭代数据混合优化及其在LLM预训练中的应用
英伟达提出的CLIMB框架,是一种自动化优化大型语言模型(LLM)预训练数据混合的创新方法。通过语义嵌入与聚类技术,CLIMB能系统地发现、评估并优化数据混合策略,无需人工干预。该框架包含数据预处理、迭代自举及最优权重确定三大阶段,结合小型代理模型与性能预测器,高效搜索最佳数据比例。实验表明,基于CLIMB优化的数据混合训练的模型,在多项推理任务中显著超越现有方法,展现出卓越性能。此外,研究还构建了高质量的ClimbMix数据集,进一步验证了框架的有效性。
371 0
CLIMB自举框架:基于语义聚类的迭代数据混合优化及其在LLM预训练中的应用
|
9月前
|
人工智能 数据可视化 API
36.7K star!拖拽构建AI流程,这个开源LLM应用框架绝了!
`Flowise` 是一款革命性的低代码LLM应用构建工具,开发者通过可视化拖拽界面,就能快速搭建基于大语言模型的智能工作流。该项目在GitHub上线不到1年就斩获**36.7K星标**,被开发者誉为"AI时代的乐高积木"。
549 8
|
8月前
|
人工智能 自然语言处理 数据可视化
两大 智能体框架 Dify vs Langchain 的全面分析,该怎么选?资深架构师 做一个彻底的解密
两大 智能体框架 Dify vs Langchain 的全面分析,该怎么选?资深架构师 做一个彻底的解密
两大 智能体框架 Dify vs Langchain 的全面分析,该怎么选?资深架构师 做一个彻底的解密
|
12月前
|
机器学习/深度学习 人工智能 算法
LLM超越人类时该如何对齐?谷歌用新RLHF框架解决了这个问题
谷歌提出了一种名为Evolving Alignment via Asymmetric Self-Play(eva)的新RLHF框架,通过创造者和解决者交替优化,生成具有挑战性的提示,提高模型泛化能力、样本效率和对齐鲁棒性。实验结果显示,eva在多个基准上显著提升性能,展示了其创新性和有效性。然而,eva的实现较为复杂,且实际应用中的长期效果仍待验证。
184 5
|
10月前
|
机器学习/深度学习 存储 人工智能
MNN-LLM App:在手机上离线运行大模型,阿里巴巴开源基于 MNN-LLM 框架开发的手机 AI 助手应用
MNN-LLM App 是阿里巴巴基于 MNN-LLM 框架开发的 Android 应用,支持多模态交互、多种主流模型选择、离线运行及性能优化。
7744 80
MNN-LLM App:在手机上离线运行大模型,阿里巴巴开源基于 MNN-LLM 框架开发的手机 AI 助手应用
|
8月前
|
机器学习/深度学习 人工智能 算法
RAGEN:RL训练LLM推理新范式!开源强化学习框架让Agent学会多轮决策
RAGEN是一个基于StarPO框架的开源强化学习系统,通过马尔可夫决策过程形式化Agent与环境的交互,支持PPO、GRPO等多种优化算法,显著提升多轮推理训练的稳定性。
949 5
RAGEN:RL训练LLM推理新范式!开源强化学习框架让Agent学会多轮决策
|
9月前
|
机器学习/深度学习 人工智能 算法
SWEET-RL:基于训练时信息的多轮LLM代理强化学习框架
SWEET-RL是一种基于训练时信息的逐步评估算法,显著提升了多轮大型语言模型(LLM)代理在强化学习中的成功率。相比现有方法,SWEET-RL将成功率提高6%,使小型开源模型如Llama-3.1-8B达到甚至超越GPT-4O等大型专有模型性能。通过非对称Actor-Critic结构、创新优势函数参数化及两阶段训练流程,SWEET-RL优化了信用分配机制与泛化能力,降低了计算成本。ColBench基准测试显示,SWEET-RL在后端编程和前端设计任务中表现卓越,为AI代理训练技术带来突破性进展。
328 2
SWEET-RL:基于训练时信息的多轮LLM代理强化学习框架
|
8月前
|
存储 人工智能 监控
通过Milvus和Langchain快速构建基于百炼大模型的LLM问答系统
阿里云向量检索服务Milvus版是一款全托管向量检索引擎,并确保与开源Milvus的完全兼容性,支持无缝迁移。它在开源版本的基础上增强了可扩展性,能提供大规模AI向量数据的相似性检索服务。凭借其开箱即用的特性、灵活的扩展能力和全链路监控告警,Milvus云服务成为多样化AI应用场景的理想选择,包括多模态搜索、检索增强生成(RAG)、搜索推荐、内容风险识别等。您还可以利用开源的Attu工具进行可视化操作,进一步促进应用的快速开发和部署。
|
11月前
|
人工智能 知识图谱 Docker
KAG:增强 LLM 的专业能力!蚂蚁集团推出专业领域知识增强框架,支持逻辑推理和多跳问答
KAG 是蚂蚁集团推出的专业领域知识服务框架,通过知识增强提升大型语言模型在特定领域的问答性能,支持逻辑推理和多跳事实问答,显著提升推理和问答的准确性和效率。
3255 46
KAG:增强 LLM 的专业能力!蚂蚁集团推出专业领域知识增强框架,支持逻辑推理和多跳问答
|
10月前
|
人工智能 自然语言处理 架构师
Praison AI:LangChain危险了!这个低代码框架让AI智能体「自主协作」,1行代码搞定任务编排
Praison AI 是一个开源的多智能体框架,支持低代码创建和管理AI代理,提供多种流程类型和集成选项,适用于企业流程自动化、智能客服等场景。
446 18

热门文章

最新文章