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中文網其他相關文章!