首頁 >web前端 >js教程 >JavaScript中Langchain的完整指南

JavaScript中Langchain的完整指南

William Shakespeare
William Shakespeare原創
2025-02-08 10:24:13833瀏覽

LangChainJS:構建AI驅動的JavaScript語言模型和智能體的強大框架

A Complete Guide to LangChain in JavaScript

核心要點:

  • LangChainJS是一個功能強大的JavaScript框架,使開發人員能夠構建和試驗AI驅動的語言模型和智能體,並無縫集成到Web應用程序中。
  • 該框架允許創建能夠利用各種工具和數據源來執行複雜語言任務(例如互聯網搜索和數學計算)的智能體,從而提高響應的準確性和相關性。
  • LangChain支持各種模型,包括用於簡單文本輸出的語言模型、用於交互式對話的聊天模型以及用於將文本轉換為數值向量的嵌入模型,從而促進各種NLP應用程序的開發。
  • 通過可定制的分塊方法可以高效地管理和處理文本數據,確保在處理大型文本時獲得最佳性能和上下文相關性。
  • 除了使用OpenAI模型外,LangChain還兼容其他大型語言模型(LLM)和AI服務,為探索在其項目中集成不同AI的開發人員提供靈活性和擴展功能。

本指南將深入探討LangChain的關鍵組件,並演示如何在JavaScript中利用其強大功能。 LangChainJS是一個通用的JavaScript框架,使開發人員和研究人員能夠創建、試驗和分析語言模型和智能體。它為自然語言處理(NLP)愛好者提供了豐富的功能,從構建自定義模型到高效地操作文本數據。作為一個JavaScript框架,它還允許開發人員輕鬆地將他們的AI應用程序集成到Web應用程序中。

前提條件:

要學習本文,請創建一個新文件夾並安裝LangChain npm包:

<code class="language-bash">npm install -S langchain</code>

創建新文件夾後,使用.mjs後綴創建一個新的JS模塊文件(例如test1.mjs)。

智能體 (Agents):

在LangChain中,智能體是一個能夠理解和生成文本的實體。這些智能體可以配置特定的行為和數據源,並經過訓練以執行各種與語言相關的任務,使其成為各種應用的多功能工具。

創建LangChain智能體:

智能體可以配置為使用“工具”來收集所需的數據並製定良好的響應。請看下面的示例。它使用Serp API(一個互聯網搜索API)來搜索與問題或輸入相關的信息,並以此來做出響應。它還使用llm-math工具執行數學運算——例如,轉換單位或查找兩個值之間的百分比變化:

<code class="language-bash">npm install -S langchain</code>

在使用modelName: "gpt-3.5-turbo"temperature: 0創建模型變量後,我們創建了執行器,它將創建的模型與指定的工具(SerpAPI和Calculator)結合起來。在輸入中,我要求LLM搜索互聯網(使用SerpAPI),並找出自2010年以來哪個藝術家發行了更多專輯——Nas還是Boldy James——並顯示百分比差異(使用Calculator)。

在這個例子中,我必須明確地告訴LLM“通過搜索互聯網……”,讓它使用互聯網獲取直到今天的數據,而不是使用OpenAI默認的僅限於2021年的數據。

輸出如下所示:

<code class="language-javascript">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);</code>

模型 (Models):

LangChain中有三種類型的模型:LLM、聊天模型和文本嵌入模型。讓我們通過一些示例來探索每種類型的模型。

語言模型 (Language Model):

LangChain提供了一種在JavaScript中使用語言模型的方法,以根據文本輸入生成文本輸出。它不像聊天模型那樣複雜,最適合用於簡單的輸入-輸出語言任務。以下是一個使用OpenAI的示例:

<code>// 输出将取决于互联网搜索结果</code>

如你所見,它使用gpt-3.5-turbo模型列出所有紅色的漿果。在這個例子中,我將溫度設置為0,以使LLM具有事實上的準確性。

輸出:

<code class="language-javascript">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);</code>

聊天模型 (Chat Model):

如果你想要更複雜的答案和對話,你需要使用聊天模型。從技術上講,聊天模型與語言模型有何不同?用LangChain文檔中的話來說:

聊天模型是語言模型的一種變體。雖然聊天模型在後台使用語言模型,但它們使用的接口略有不同。它們不是使用“文本輸入,文本輸出”API,而是使用“聊天消息”作為輸入和輸出的接口。

這是一個簡單的(相當無用但有趣的)JavaScript聊天模型腳本:

<code>// 输出将列出红色的浆果</code>

如你所見,代碼首先發送系統消息,並告訴聊天機器人成為一個總是用押韻回答的詩意助手,之後它發送一條人類消息,告訴聊天機器人告訴我誰是更好的網球運動員:德約科維奇、費德勒還是納達爾。如果你運行這個聊天機器人模型,你會看到類似這樣的內容:

<code class="language-javascript">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);</code>

嵌入 (Embeddings):

嵌入模型提供了一種將文本中的單詞和數字轉換為向量的方法,然後可以將這些向量與其他單詞或數字關聯起來。這聽起來可能很抽象,所以讓我們來看一個例子:

<code>// 输出将是一个用押韵回答的问题</code>

這將返回一個很長的浮點數列表:

<code class="language-javascript">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)</code>

這就是嵌入的樣子。僅僅六個單詞就有這麼多的浮點數!

然後可以使用此嵌入將輸入文本與潛在答案、相關文本、名稱等關聯起來。

現在讓我們來看一個嵌入模型的用例……

現在,這是一個腳本,它將使用嵌入來獲取問題“最重的動物是什麼?”並從提供的可能的答案列表中找到正確的答案:

<code class="language-bash">npm install -S langchain</code>

分塊 (Chunks):

LangChain模型無法處理大型文本並使用它們來生成響應。這就是分塊和文本分割發揮作用的地方。讓我向你展示兩種在將文本數據饋送到LangChain之前將其分割成塊的簡單方法。

按字符分割分塊:

為了避免分塊中的突然中斷,你可以通過在換行符的每次出現處分割文本,按段落分割文本:

<code class="language-javascript">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);</code>

這是分割文本的一種有用方法。但是,你可以使用任何字符作為分塊分隔符,而不僅僅是n

遞歸分割分塊:

如果你想嚴格地按一定長度的字符分割文本,可以使用RecursiveCharacterTextSplitter

<code>// 输出将取决于互联网搜索结果</code>

在這個例子中,文本每100個字符分割一次,分塊重疊為15個字符。

分塊大小和重疊:

通過查看這些示例,你可能已經開始想知道分塊大小和重疊參數的確切含義以及它們對性能的影響。好吧,讓我簡單地說明兩點。

  • 分塊大小決定每個分塊中的字符數量。分塊大小越大,分塊中的數據越多,LangChain處理它並生成輸出所需的時間就越長,反之亦然。
  • 分塊重疊是共享分塊之間信息的內容,以便它們共享一些上下文。分塊重疊越高,你的分塊就越冗餘;分塊重疊越低,分塊之間共享的上下文就越少。通常,良好的分塊重疊約為分塊大小的10%到20%,儘管理想的分塊重疊因不同的文本類型和用例而異。

鏈 (Chains):

鏈基本上是多個LLM功能鏈接在一起以執行更複雜的任務,否則無法通過簡單的LLM輸入->輸出方式完成。讓我們來看一個很酷的例子:

<code class="language-javascript">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);</code>

超越OpenAI:

即使我一直使用OpenAI模型作為LangChain不同功能的示例,它也不限於OpenAI模型。你可以將LangChain與眾多其他LLM和AI服務一起使用。你可以在他們的文檔中找到LangChain和JavaScript可集成LLM的完整列表。

例如,你可以將Cohere與LangChain一起使用。安裝Cohere後,使用npm install cohere-ai,你可以使用LangChain和Cohere創建一個簡單的問答代碼,如下所示:

<code>// 输出将列出红色的浆果</code>

輸出:

<code class="language-javascript">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);</code>

結論:

在本指南中,你已經看到了LangChain在JavaScript中的不同方面和功能。你可以使用LangChain在JavaScript中輕鬆開發AI驅動的Web應用程序並試驗LLM。請務必參考LangChainJS文檔以了解有關特定功能的更多詳細信息。

祝你使用LangChain在JavaScript中進行快樂的編碼和實驗!如果你喜歡這篇文章,你可能還想閱讀有關使用LangChain與Python的文章。

以上是JavaScript中Langchain的完整指南的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn