LangChainJS:构建AI驱动的JavaScript语言模型和智能体的强大框架
核心要点:
本指南将深入探讨LangChain的关键组件,并演示如何在JavaScript中利用其强大功能。LangChainJS是一个通用的JavaScript框架,使开发人员和研究人员能够创建、试验和分析语言模型和智能体。它为自然语言处理(NLP)爱好者提供了丰富的功能,从构建自定义模型到高效地操作文本数据。作为一个JavaScript框架,它还允许开发人员轻松地将他们的AI应用程序集成到Web应用程序中。
前提条件:
要学习本文,请创建一个新文件夹并安装LangChain npm包:
npm install -S langchain
创建新文件夹后,使用.mjs
后缀创建一个新的JS模块文件(例如test1.mjs
)。
智能体 (Agents):
在LangChain中,智能体是一个能够理解和生成文本的实体。这些智能体可以配置特定的行为和数据源,并经过训练以执行各种与语言相关的任务,使其成为各种应用的多功能工具。
创建LangChain智能体:
智能体可以配置为使用“工具”来收集所需的数据并制定良好的响应。请看下面的示例。它使用Serp API(一个互联网搜索API)来搜索与问题或输入相关的信息,并以此来做出响应。它还使用llm-math
工具执行数学运算——例如,转换单位或查找两个值之间的百分比变化:
npm install -S langchain
在使用modelName: "gpt-3.5-turbo"
和temperature: 0
创建模型变量后,我们创建了执行器,它将创建的模型与指定的工具(SerpAPI和Calculator)结合起来。在输入中,我要求LLM搜索互联网(使用SerpAPI),并找出自2010年以来哪个艺术家发行了更多专辑——Nas还是Boldy James——并显示百分比差异(使用Calculator)。
在这个例子中,我必须明确地告诉LLM“通过搜索互联网……”,让它使用互联网获取直到今天的数据,而不是使用OpenAI默认的仅限于2021年的数据。
输出如下所示:
import { initializeAgentExecutorWithOptions } from "langchain/agents"; import { ChatOpenAI } from "langchain/chat_models/openai"; import { SerpAPI } from "langchain/tools"; import { Calculator } from "langchain/tools/calculator"; process.env["OPENAI_API_KEY"] = "YOUR_OPENAI_KEY" process.env["SERPAPI_API_KEY"] = "YOUR_SERPAPI_KEY" const tools = [new Calculator(), new SerpAPI()]; const model = new ChatOpenAI({ modelName: "gpt-3.5-turbo", temperature: 0 }); const executor = await initializeAgentExecutorWithOptions(tools, model, { agentType: "openai-functions", verbose: false, }); const result = await executor.run("通过搜索互联网,查找Boldy James自2010年以来发行了多少张专辑,以及Nas自2010年以来发行了多少张专辑?找出谁发行了更多专辑,并显示百分比差异。"); console.log(result);
模型 (Models):
LangChain中有三种类型的模型:LLM、聊天模型和文本嵌入模型。让我们通过一些示例来探索每种类型的模型。
语言模型 (Language Model):
LangChain提供了一种在JavaScript中使用语言模型的方法,以根据文本输入生成文本输出。它不像聊天模型那样复杂,最适合用于简单的输入-输出语言任务。以下是一个使用OpenAI的示例:
<code>// 输出将取决于互联网搜索结果</code>
如你所见,它使用gpt-3.5-turbo
模型列出所有红色的浆果。在这个例子中,我将温度设置为0,以使LLM具有事实上的准确性。
输出:
import { OpenAI } from "langchain/llms/openai"; const llm = new OpenAI({ openAIApiKey: "YOUR_OPENAI_KEY", model: "gpt-3.5-turbo", temperature: 0 }); const res = await llm.call("列出所有红色的浆果"); console.log(res);
聊天模型 (Chat Model):
如果你想要更复杂的答案和对话,你需要使用聊天模型。从技术上讲,聊天模型与语言模型有何不同?用LangChain文档中的话来说:
聊天模型是语言模型的一种变体。虽然聊天模型在后台使用语言模型,但它们使用的接口略有不同。它们不是使用“文本输入,文本输出”API,而是使用“聊天消息”作为输入和输出的接口。
这是一个简单的(相当无用但有趣的)JavaScript聊天模型脚本:
<code>// 输出将列出红色的浆果</code>
如你所见,代码首先发送系统消息,并告诉聊天机器人成为一个总是用押韵回答的诗意助手,之后它发送一条人类消息,告诉聊天机器人告诉我谁是更好的网球运动员:德约科维奇、费德勒还是纳达尔。如果你运行这个聊天机器人模型,你会看到类似这样的内容:
import { ChatOpenAI } from "langchain/chat_models/openai"; import { PromptTemplate } from "langchain/prompts"; const chat = new ChatOpenAI({ openAIApiKey: "YOUR_OPENAI_KEY", model: "gpt-3.5-turbo", temperature: 0 }); const prompt = PromptTemplate.fromTemplate(`你是一个诗意的助手,总是用押韵来回答:{question}`); const runnable = prompt.pipe(chat); const response = await runnable.invoke({ question: "谁更好,德约科维奇、费德勒还是纳达尔?" }); console.log(response);
嵌入 (Embeddings):
嵌入模型提供了一种将文本中的单词和数字转换为向量的方法,然后可以将这些向量与其他单词或数字关联起来。这听起来可能很抽象,所以让我们来看一个例子:
<code>// 输出将是一个用押韵回答的问题</code>
这将返回一个很长的浮点数列表:
import { OpenAIEmbeddings } from "langchain/embeddings/openai"; process.env["OPENAI_API_KEY"] = "YOUR_OPENAI_KEY" const embeddings = new OpenAIEmbeddings(); const res = await embeddings.embedQuery("谁创造了万维网?"); console.log(res)
这就是嵌入的样子。仅仅六个单词就有这么多的浮点数!
然后可以使用此嵌入将输入文本与潜在答案、相关文本、名称等关联起来。
现在让我们来看一个嵌入模型的用例……
现在,这是一个脚本,它将使用嵌入来获取问题“最重的动物是什么?”并从提供的可能的答案列表中找到正确的答案:
npm install -S langchain
分块 (Chunks):
LangChain模型无法处理大型文本并使用它们来生成响应。这就是分块和文本分割发挥作用的地方。让我向你展示两种在将文本数据馈送到LangChain之前将其分割成块的简单方法。
按字符分割分块:
为了避免分块中的突然中断,你可以通过在换行符的每次出现处分割文本,按段落分割文本:
import { initializeAgentExecutorWithOptions } from "langchain/agents"; import { ChatOpenAI } from "langchain/chat_models/openai"; import { SerpAPI } from "langchain/tools"; import { Calculator } from "langchain/tools/calculator"; process.env["OPENAI_API_KEY"] = "YOUR_OPENAI_KEY" process.env["SERPAPI_API_KEY"] = "YOUR_SERPAPI_KEY" const tools = [new Calculator(), new SerpAPI()]; const model = new ChatOpenAI({ modelName: "gpt-3.5-turbo", temperature: 0 }); const executor = await initializeAgentExecutorWithOptions(tools, model, { agentType: "openai-functions", verbose: false, }); const result = await executor.run("通过搜索互联网,查找Boldy James自2010年以来发行了多少张专辑,以及Nas自2010年以来发行了多少张专辑?找出谁发行了更多专辑,并显示百分比差异。"); console.log(result);
这是分割文本的一种有用方法。但是,你可以使用任何字符作为分块分隔符,而不仅仅是n
。
递归分割分块:
如果你想严格地按一定长度的字符分割文本,可以使用RecursiveCharacterTextSplitter
:
<code>// 输出将取决于互联网搜索结果</code>
在这个例子中,文本每100个字符分割一次,分块重叠为15个字符。
分块大小和重叠:
通过查看这些示例,你可能已经开始想知道分块大小和重叠参数的确切含义以及它们对性能的影响。好吧,让我简单地说明两点。
链 (Chains):
链基本上是多个LLM功能链接在一起以执行更复杂的任务,否则无法通过简单的LLM输入->输出方式完成。让我们来看一个很酷的例子:
import { OpenAI } from "langchain/llms/openai"; const llm = new OpenAI({ openAIApiKey: "YOUR_OPENAI_KEY", model: "gpt-3.5-turbo", temperature: 0 }); const res = await llm.call("列出所有红色的浆果"); console.log(res);
超越OpenAI:
即使我一直使用OpenAI模型作为LangChain不同功能的示例,它也不限于OpenAI模型。你可以将LangChain与众多其他LLM和AI服务一起使用。你可以在他们的文档中找到LangChain和JavaScript可集成LLM的完整列表。
例如,你可以将Cohere与LangChain一起使用。安装Cohere后,使用npm install cohere-ai
,你可以使用LangChain和Cohere创建一个简单的问答代码,如下所示:
<code>// 输出将列出红色的浆果</code>
输出:
import { ChatOpenAI } from "langchain/chat_models/openai"; import { PromptTemplate } from "langchain/prompts"; const chat = new ChatOpenAI({ openAIApiKey: "YOUR_OPENAI_KEY", model: "gpt-3.5-turbo", temperature: 0 }); const prompt = PromptTemplate.fromTemplate(`你是一个诗意的助手,总是用押韵来回答:{question}`); const runnable = prompt.pipe(chat); const response = await runnable.invoke({ question: "谁更好,德约科维奇、费德勒还是纳达尔?" }); console.log(response);
结论:
在本指南中,你已经看到了LangChain在JavaScript中的不同方面和功能。你可以使用LangChain在JavaScript中轻松开发AI驱动的Web应用程序并试验LLM。请务必参考LangChainJS文档以了解有关特定功能的更多详细信息。
祝你使用LangChain在JavaScript中进行快乐的编码和实验!如果你喜欢这篇文章,你可能还想阅读有关使用LangChain与Python的文章。
以上是JavaScript中Langchain的完整指南的详细内容。更多信息请关注PHP中文网其他相关文章!