reCAPTCHA WAF Session Token
Programming Languages

A Complete Guide to LangChain in JavaScript — SitePoint


In this comprehensive guide, we’ll dive deep into the essential components of LangChain and demonstrate how to harness its power in JavaScript.

LangChainJS is a versatile JavaScript framework that empowers developers and researchers to create, experiment with, and analyze language models and agents. It offers a rich set of features for natural language processing (NLP) enthusiasts, from building custom models to manipulating text data efficiently. As a JavaScript framework, it also allows developers to easily integrate their AI applications into web apps.

Table of Contents

Prerequisites

To follow along with this article, create a new folder and install the LangChain npm package:

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

After creating a new folder, create a new JS module file by using the .mjs suffix (such as test1.mjs).

Agents

In LangChain, an agent is an entity that can understand and generate text. These agents can be configured with specific behaviors and data sources and trained to perform various language-related tasks, making them versatile tools for a wide range of applications.

Creating a LangChain agent

Agents can be configured to use “tools” to gather the data they need and formulate a good response. Take a look at the example below. It uses Serp API (an internet search API) to search the Internet for information relevant to the question or input, and use that to make a response. It also uses the llm-math tool to perform mathematical operations — for example, to convert units or find percentage change between two values:

<code class="javascript language-javascript"><span class="token keyword module">import</span> <span class="token imports"><span class="token punctuation">{</span> initializeAgentExecutorWithOptions <span class="token punctuation">}</span></span> <span class="token keyword module">from</span> <span class="token string">"langchain/agents"</span><span class="token punctuation">;</span>
<span class="token keyword module">import</span> <span class="token imports"><span class="token punctuation">{</span> <span class="token maybe-class-name">ChatOpenAI</span> <span class="token punctuation">}</span></span> <span class="token keyword module">from</span> <span class="token string">"langchain/chat_models/openai"</span><span class="token punctuation">;</span>
<span class="token keyword module">import</span> <span class="token imports"><span class="token punctuation">{</span> <span class="token maybe-class-name">SerpAPI</span> <span class="token punctuation">}</span></span> <span class="token keyword module">from</span> <span class="token string">"langchain/tools"</span><span class="token punctuation">;</span>
<span class="token keyword module">import</span> <span class="token imports"><span class="token punctuation">{</span> <span class="token maybe-class-name">Calculator</span> <span class="token punctuation">}</span></span> <span class="token keyword module">from</span> <span class="token string">"langchain/tools/calculator"</span><span class="token punctuation">;</span>

process<span class="token punctuation">.</span><span class="token property-access">env</span><span class="token punctuation">[</span><span class="token string">"OPENAI_API_KEY"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token string">"YOUR_OPENAI_KEY"</span>
process<span class="token punctuation">.</span><span class="token property-access">env</span><span class="token punctuation">[</span><span class="token string">"SERPAPI_API_KEY"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token string">"YOUR_SERPAPI_KEY"</span>

<span class="token keyword">const</span> tools <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token keyword">new</span> <span class="token class-name">Calculator</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token class-name">SerpAPI</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
<span class="token keyword">const</span> model <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ChatOpenAI</span><span class="token punctuation">(</span><span class="token punctuation">{</span> modelName<span class="token operator">:</span> <span class="token string">"gpt-3.5-turbo"</span><span class="token punctuation">,</span> temperature<span class="token operator">:</span> <span class="token number">0</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token keyword">const</span> executor <span class="token operator">=</span> <span class="token keyword control-flow">await</span> <span class="token function">initializeAgentExecutorWithOptions</span><span class="token punctuation">(</span>tools<span class="token punctuation">,</span> model<span class="token punctuation">,</span> <span class="token punctuation">{</span>
  agentType<span class="token operator">:</span> <span class="token string">"openai-functions"</span><span class="token punctuation">,</span>
  verbose<span class="token operator">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token keyword">const</span> result <span class="token operator">=</span> <span class="token keyword control-flow">await</span> executor<span class="token punctuation">.</span><span class="token method function property-access">run</span><span class="token punctuation">(</span><span class="token string">"By searching the Internet, find how many albums has Boldy James dropped since 2010 and how many albums has Nas dropped since 2010? Find who dropped more albums and show the difference in percent."</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token console class-name">console</span><span class="token punctuation">.</span><span class="token method function property-access">log</span><span class="token punctuation">(</span>result<span class="token punctuation">)</span><span class="token punctuation">;</span>
</code>

After creating the model variable using modelName: "gpt-3.5-turbo" and temperature: 0, we create the executor that combines the created model with the specified tools (SerpAPI and Calculator). In the input, I’ve asked the LLM to search the Internet (using SerpAPI) and find which artist dropped more albums since 2010 — Nas or Boldy James — and show the percentage difference (using Calculator).

In this example, I had to explicitly tell the LLM “By searching the Internet…” to have it get data up until present day using the Internet instead of using OpenAI’s default data limited to 2021.

Here’s what the output looks like:

<code class="bash language-bash"><span class="token operator">></span> node test1.mjs
Boldy James has released <span class="token number">4</span> albums since <span class="token number">2010</span>. Nas has released <span class="token number">17</span> studio albums since <span class="token number">2010</span>. 

Therefore, Nas has released <span class="token function">more</span> albums than Boldy James. The difference <span class="token keyword">in</span> the number of albums is <span class="token number">13</span>.

To calculate the difference <span class="token keyword">in</span> percent, we can use the formula: <span class="token punctuation">(</span>Difference / Total<span class="token punctuation">)</span> * <span class="token number">100</span>.

In this case, the difference is <span class="token number">13</span> and the total is <span class="token number">17</span>.

The difference <span class="token keyword">in</span> percent is: <span class="token punctuation">(</span><span class="token number">13</span> / <span class="token number">17</span><span class="token punctuation">)</span> * <span class="token number">100</span> <span class="token operator">=</span> <span class="token number">76.47</span>%.

So, Nas has released <span class="token number">76.47</span>% <span class="token function">more</span> albums than Boldy James since <span class="token number">2010</span>.
</code>

Models

There are three types of models in LangChain: LLMs, chat models, and text embedding models. Let’s explore every type of model with some examples.

Language model

LangChain provides a way to use language models in JavaScript to produce a text output based on a text input. It’s not as complex as a chat model, and it’s used best with simple input–output language tasks. Here’s an example using OpenAI:

<code class="javascript language-javascript"><span class="token keyword module">import</span> <span class="token imports"><span class="token punctuation">{</span> <span class="token maybe-class-name">OpenAI</span> <span class="token punctuation">}</span></span> <span class="token keyword module">from</span> <span class="token string">"langchain/llms/openai"</span><span class="token punctuation">;</span>

<span class="token keyword">const</span> llm <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">OpenAI</span><span class="token punctuation">(</span><span class="token punctuation">{</span>
  openAIApiKey<span class="token operator">:</span> <span class="token string">"YOUR_OPENAI_KEY"</span><span class="token punctuation">,</span>
  model<span class="token operator">:</span> <span class="token string">"gpt-3.5-turbo"</span><span class="token punctuation">,</span>
  temperature<span class="token operator">:</span> <span class="token number">0</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token keyword">const</span> res <span class="token operator">=</span> <span class="token keyword control-flow">await</span> llm<span class="token punctuation">.</span><span class="token method function property-access">call</span><span class="token punctuation">(</span><span class="token string">"List all red berries"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token console class-name">console</span><span class="token punctuation">.</span><span class="token method function property-access">log</span><span class="token punctuation">(</span>res<span class="token punctuation">)</span><span class="token punctuation">;</span>
</code>

As you can see, it uses the gpt-3.5-turbo model to list all red berries. In this example, I set the temperature to 0 to make the LLM factually accurate. Output:

<code class="bash language-bash"><span class="token number">1</span>. Strawberries
<span class="token number">2</span>. Cranberries
<span class="token number">3</span>. Raspberries
<span class="token number">4</span>. Redcurrants
<span class="token number">5</span>. Red Gooseberries
<span class="token number">6</span>. Red Elderberries
<span class="token number">7</span>. Red Huckleberries
<span class="token number">8</span>. Red Mulberries
</code>

Chat model

If you want more sophisticated answers and conversations, you need to use chat models. How are chat models technically different from language models? Well, in the words of the LangChain documentation:

Chat models are a variation on language models. While chat models use language models under the hood, the interface they use is a bit different. Rather than using a “text in, text out” API, they use an interface where “chat messages” are the inputs and outputs.

Here’s a simple (pretty useless but fun) JavaScript chat model script:

<code class="javascript language-javascript"><span class="token keyword module">import</span> <span class="token imports"><span class="token punctuation">{</span> <span class="token maybe-class-name">ChatOpenAI</span> <span class="token punctuation">}</span></span> <span class="token keyword module">from</span> <span class="token string">"langchain/chat_models/openai"</span><span class="token punctuation">;</span>
<span class="token keyword module">import</span> <span class="token imports"><span class="token punctuation">{</span> <span class="token maybe-class-name">PromptTemplate</span> <span class="token punctuation">}</span></span> <span class="token keyword module">from</span> <span class="token string">"langchain/prompts"</span><span class="token punctuation">;</span>

<span class="token keyword">const</span> chat <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ChatOpenAI</span><span class="token punctuation">(</span><span class="token punctuation">{</span>
  openAIApiKey<span class="token operator">:</span> <span class="token string">"YOUR_OPENAI_KEY"</span><span class="token punctuation">,</span>
  model<span class="token operator">:</span> <span class="token string">"gpt-3.5-turbo"</span><span class="token punctuation">,</span>
  temperature<span class="token operator">:</span> <span class="token number">0</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">const</span> prompt <span class="token operator">=</span> <span class="token maybe-class-name">PromptTemplate</span><span class="token punctuation">.</span><span class="token method function property-access">fromTemplate</span><span class="token punctuation">(</span><span class="token template-string"><span class="token template-punctuation string">`</span><span class="token string">You are a poetic assistant that always answers in rhymes: {question}</span><span class="token template-punctuation string">`</span></span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">const</span> runnable <span class="token operator">=</span> prompt<span class="token punctuation">.</span><span class="token method function property-access">pipe</span><span class="token punctuation">(</span>chat<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">const</span> response <span class="token operator">=</span> <span class="token keyword control-flow">await</span> runnable<span class="token punctuation">.</span><span class="token method function property-access">invoke</span><span class="token punctuation">(</span><span class="token punctuation">{</span> question<span class="token operator">:</span> <span class="token string">"Who is better, Djokovic, Federer or Nadal?"</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token console class-name">console</span><span class="token punctuation">.</span><span class="token method function property-access">log</span><span class="token punctuation">(</span>response<span class="token punctuation">)</span><span class="token punctuation">;</span>
</code>

As you can see, the code first sends a system message and tells the chatbot to be a poetic assistant that always answers in rhymes, and afterwards it sends a human message telling the chatbot to tell me who’s the better tennis player: Djokovic, Federer or Nadal. If you run this chatbot model, you’ll see something like this:

<code class="bash language-bash">AIMessage.content:
<span class="token string">'In the realm of tennis, they all shine bright,<span class="token entity" title="\n">\n</span>'</span> +
<span class="token string">'Djokovic, Federer, and Nadal, a glorious sight.<span class="token entity" title="\n">\n</span>'</span> +
<span class="token string">'Each with their unique style and skill,<span class="token entity" title="\n">\n</span>'</span> +
<span class="token string">'Choosing the best is a difficult thrill.<span class="token entity" title="\n">\n</span>'</span> +
<span class="token string">'<span class="token entity" title="\n">\n</span>'</span> +
<span class="token string">'Djokovic, the Serb, a master of precision,<span class="token entity" title="\n">\n</span>'</span> +
<span class="token string">'With agility and focus, he plays with decision.<span class="token entity" title="\n">\n</span>'</span> +
<span class="token string">'His powerful strokes and relentless drive,<span class="token entity" title="\n">\n</span>'</span> +
<span class="token string">"Make him a force that's hard to survive.<span class="token entity" title="\n">\n</span>"</span> +
<span class="token string">'<span class="token entity" title="\n">\n</span>'</span> +
<span class="token string">'Federer, the Swiss maestro, a true artist,<span class="token entity" title="\n">\n</span>'</span> +
<span class="token string">'Graceful and elegant, his game is the smartest.<span class="token entity" title="\n">\n</span>'</span> +
<span class="token string">'His smooth technique and magical touch,<span class="token entity" title="\n">\n</span>'</span> +
<span class="token string">'Leave spectators in awe, oh so much.<span class="token entity" title="\n">\n</span>'</span> +
<span class="token string">'<span class="token entity" title="\n">\n</span>'</span> +
<span class="token string">'Nadal, the Spaniard, a warrior on clay,<span class="token entity" title="\n">\n</span>'</span> +
<span class="token string">'His fierce determination keeps opponents at bay.<span class="token entity" title="\n">\n</span>'</span> +
<span class="token string">'With his relentless power and never-ending fight,<span class="token entity" title="\n">\n</span>'</span> +
<span class="token string">'He conquers the court, with all his might.<span class="token entity" title="\n">\n</span>'</span> +
<span class="token string">'<span class="token entity" title="\n">\n</span>'</span> +
<span class="token string">"So, who is better? It's a question of taste,<span class="token entity" title="\n">\n</span>"</span> +
<span class="token string">"Each player's greatness cannot be erased.<span class="token entity" title="\n">\n</span>"</span> +
<span class="token string">"In the end, it's the love for the game we share,<span class="token entity" title="\n">\n</span>"</span> +
<span class="token string">'That makes them all champions, beyond compare.'</span>
</code>

Pretty cool!

Embeddings

Embeddings models provide a way to turn words and numbers in a text into vectors, that can then be associated with other words or numbers. This may sound abstract, so let’s look at an example:

<code class="javascript language-javascript"><span class="token keyword module">import</span> <span class="token imports"><span class="token punctuation">{</span> <span class="token maybe-class-name">OpenAIEmbeddings</span> <span class="token punctuation">}</span></span> <span class="token keyword module">from</span> <span class="token string">"langchain/embeddings/openai"</span><span class="token punctuation">;</span>

process<span class="token punctuation">.</span><span class="token property-access">env</span><span class="token punctuation">[</span><span class="token string">"OPENAI_API_KEY"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token string">"YOUR_OPENAI_KEY"</span>

<span class="token keyword">const</span> embeddings <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">OpenAIEmbeddings</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">const</span> res <span class="token operator">=</span> <span class="token keyword control-flow">await</span> embeddings<span class="token punctuation">.</span><span class="token method function property-access">embedQuery</span><span class="token punctuation">(</span><span class="token string">"Who created the world wide web?"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token console class-name">console</span><span class="token punctuation">.</span><span class="token method function property-access">log</span><span class="token punctuation">(</span>res<span class="token punctuation">)</span>
</code>

This will return a long list of floats:

<code class="javascript language-javascript"><span class="token punctuation">[</span>
  <span class="token number">0.02274114</span><span class="token punctuation">,</span>  <span class="token operator">-</span><span class="token number">0.012759142</span><span class="token punctuation">,</span>   <span class="token number">0.004794503</span><span class="token punctuation">,</span>  <span class="token operator">-</span><span class="token number">0.009431809</span><span class="token punctuation">,</span>    <span class="token number">0.01085313</span><span class="token punctuation">,</span>
  <span class="token number">0.0019698727</span><span class="token punctuation">,</span>  <span class="token operator">-</span><span class="token number">0.013649924</span><span class="token punctuation">,</span>   <span class="token number">0.014933698</span><span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">0.0038185727</span><span class="token punctuation">,</span>  <span class="token operator">-</span><span class="token number">0.025400387</span><span class="token punctuation">,</span>
  <span class="token number">0.010794181</span><span class="token punctuation">,</span>   <span class="token number">0.018680222</span><span class="token punctuation">,</span>   <span class="token number">0.020042595</span><span class="token punctuation">,</span>   <span class="token number">0.004303263</span><span class="token punctuation">,</span>   <span class="token number">0.019937797</span><span class="token punctuation">,</span>
  <span class="token number">0.011226473</span><span class="token punctuation">,</span>   <span class="token number">0.009268062</span><span class="token punctuation">,</span>   <span class="token number">0.016125774</span><span class="token punctuation">,</span>  <span class="token number">0.0116391145</span><span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">0.0061765253</span><span class="token punctuation">,</span>
  <span class="token operator">-</span><span class="token number">0.0073358514</span><span class="token punctuation">,</span> <span class="token number">0.00021696436</span><span class="token punctuation">,</span>   <span class="token number">0.004896026</span><span class="token punctuation">,</span>  <span class="token number">0.0034026562</span><span class="token punctuation">,</span>  <span class="token operator">-</span><span class="token number">0.018365828</span><span class="token punctuation">,</span>
  <span class="token spread operator">...</span> <span class="token number">1501</span> more items
<span class="token punctuation">]</span>
</code>

This is what an embedding looks like. All of those floats for just six words!

This embedding can then be used to associate the input text with potential answers, related texts, names and more.

Now let’s look at a use case of embedding models…

Now here’s a script that will take the question “What is the heaviest animal?” and find the right answer in the provided list of possible answers by using embeddings:

<code class="javascript language-javascript"><span class="token keyword module">import</span> <span class="token imports"><span class="token punctuation">{</span> <span class="token maybe-class-name">OpenAIEmbeddings</span> <span class="token punctuation">}</span></span> <span class="token keyword module">from</span> <span class="token string">"langchain/embeddings/openai"</span><span class="token punctuation">;</span>

process<span class="token punctuation">.</span><span class="token property-access">env</span><span class="token punctuation">[</span><span class="token string">"OPENAI_API_KEY"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token string">"YOUR_OPENAI_KEY"</span>

<span class="token keyword">const</span> embeddings <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">OpenAIEmbeddings</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">function</span> <span class="token function">cosinesim</span><span class="token punctuation">(</span><span class="token parameter"><span class="token constant">A</span><span class="token punctuation">,</span> <span class="token constant">B</span></span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token keyword">var</span> dotproduct <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
    <span class="token keyword">var</span> mA <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
    <span class="token keyword">var</span> mB <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>

    <span class="token keyword control-flow">for</span><span class="token punctuation">(</span><span class="token keyword">var</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator"><</span> <span class="token constant">A</span><span class="token punctuation">.</span><span class="token property-access">length</span><span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
        dotproduct <span class="token operator">+=</span> <span class="token constant">A</span><span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">*</span> <span class="token constant">B</span><span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">;</span>
        mA <span class="token operator">+=</span> <span class="token constant">A</span><span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">*</span> <span class="token constant">A</span><span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">;</span>
        mB <span class="token operator">+=</span> <span class="token constant">B</span><span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">*</span> <span class="token constant">B</span><span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>

    mA <span class="token operator">=</span> <span class="token known-class-name class-name">Math</span><span class="token punctuation">.</span><span class="token method function property-access">sqrt</span><span class="token punctuation">(</span>mA<span class="token punctuation">)</span><span class="token punctuation">;</span>
    mB <span class="token operator">=</span> <span class="token known-class-name class-name">Math</span><span class="token punctuation">.</span><span class="token method function property-access">sqrt</span><span class="token punctuation">(</span>mB<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">var</span> similarity <span class="token operator">=</span> dotproduct <span class="token operator">/</span> <span class="token punctuation">(</span>mA <span class="token operator">*</span> mB<span class="token punctuation">)</span><span class="token punctuation">;</span>

    <span class="token keyword control-flow">return</span> similarity<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">const</span> res1 <span class="token operator">=</span> <span class="token keyword control-flow">await</span> embeddings<span class="token punctuation">.</span><span class="token method function property-access">embedQuery</span><span class="token punctuation">(</span><span class="token string">"The Blue Whale is the heaviest animal in the world"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">const</span> res2 <span class="token operator">=</span> <span class="token keyword control-flow">await</span> embeddings<span class="token punctuation">.</span><span class="token method function property-access">embedQuery</span><span class="token punctuation">(</span><span class="token string">"George Orwell wrote 1984"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">const</span> res3 <span class="token operator">=</span> <span class="token keyword control-flow">await</span> embeddings<span class="token punctuation">.</span><span class="token method function property-access">embedQuery</span><span class="token punctuation">(</span><span class="token string">"Random stuff"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token keyword">const</span> text_arr <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token string">"The Blue Whale is the heaviest animal in the world"</span><span class="token punctuation">,</span> <span class="token string">"George Orwell wrote 1984"</span><span class="token punctuation">,</span> <span class="token string">"Random stuff"</span><span class="token punctuation">]</span>
<span class="token keyword">const</span> res_arr <span class="token operator">=</span> <span class="token punctuation">[</span>res1<span class="token punctuation">,</span> res2<span class="token punctuation">,</span> res3<span class="token punctuation">]</span>

<span class="token keyword">const</span> question <span class="token operator">=</span> <span class="token keyword control-flow">await</span> embeddings<span class="token punctuation">.</span><span class="token method function property-access">embedQuery</span><span class="token punctuation">(</span><span class="token string">"What is the heaviest animal?"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token keyword">const</span> sims <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span>
<span class="token keyword control-flow">for</span> <span class="token punctuation">(</span><span class="token keyword">var</span> i<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">;</span>i<span class="token operator"><</span>res_arr<span class="token punctuation">.</span><span class="token property-access">length</span><span class="token punctuation">;</span>i<span class="token operator">++</span><span class="token punctuation">)</span><span class="token punctuation">{</span>
    sims<span class="token punctuation">.</span><span class="token method function property-access">push</span><span class="token punctuation">(</span><span class="token function">cosinesim</span><span class="token punctuation">(</span>question<span class="token punctuation">,</span> res_arr<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token punctuation">}</span>

<span class="token class-name">Array</span><span class="token punctuation">.</span><span class="token property-access">prototype</span><span class="token punctuation">.</span><span class="token method-variable function-variable method function property-access">max</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token keyword control-flow">return</span> <span class="token known-class-name class-name">Math</span><span class="token punctuation">.</span><span class="token method function property-access">max</span><span class="token punctuation">.</span><span class="token method function property-access">apply</span><span class="token punctuation">(</span><span class="token keyword null nil">null</span><span class="token punctuation">,</span> <span class="token keyword">this</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token console class-name">console</span><span class="token punctuation">.</span><span class="token method function property-access">log</span><span class="token punctuation">(</span>text_arr<span class="token punctuation">[</span>sims<span class="token punctuation">.</span><span class="token method function property-access">indexOf</span><span class="token punctuation">(</span>sims<span class="token punctuation">.</span><span class="token method function property-access">max</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">]</span><span class="token punctuation">)</span>
</code>

This code uses the cosinesim(A, B) function to find the relatedness of each answer to the question. By finding the list of embeddings most related to the question using the Array.prototype.max function by finding the maximum value in the array of relatedness indexes that were generated using cosinesim, the code is then able to find the right answer by finding which text from text_arr belongs to the most related answer: text_arr[sims.indexOf(sims.max())].

Output:

<code class="bash language-bash">The Blue Whale is the heaviest animal <span class="token keyword">in</span> the world
</code>

Chunks

LangChain models can’t handle large texts and use them to make responses. This is where chunks and text splitting come in. Let me show you two simple methods to split your text data into chunks before feeding it into LangChain.

Splitting chunks by character

To avoid abrupt breaks in chunks, you can split your texts by paragraph by splitting them at every occurrence of a newline:

<code class="javascript language-javascript"><span class="token keyword module">import</span> <span class="token imports"><span class="token punctuation">{</span> <span class="token maybe-class-name">Document</span> <span class="token punctuation">}</span></span> <span class="token keyword module">from</span> <span class="token string">"langchain/document"</span><span class="token punctuation">;</span>
<span class="token keyword module">import</span> <span class="token imports"><span class="token punctuation">{</span> <span class="token maybe-class-name">CharacterTextSplitter</span> <span class="token punctuation">}</span></span> <span class="token keyword module">from</span> <span class="token string">"langchain/text_splitter"</span><span class="token punctuation">;</span>

<span class="token keyword">const</span> splitter <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">CharacterTextSplitter</span><span class="token punctuation">(</span><span class="token punctuation">{</span>
  separator<span class="token operator">:</span> <span class="token string">"\n"</span><span class="token punctuation">,</span>
  chunkSize<span class="token operator">:</span> <span class="token number">7</span><span class="token punctuation">,</span>
  chunkOverlap<span class="token operator">:</span> <span class="token number">3</span><span class="token punctuation">,</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">const</span> output <span class="token operator">=</span> <span class="token keyword control-flow">await</span> splitter<span class="token punctuation">.</span><span class="token method function property-access">createDocuments</span><span class="token punctuation">(</span><span class="token punctuation">[</span>your_text<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code>

This is one useful way of splitting a text. However, you can use any character as a chunk separator, not just \n.

Recursively splitting chunks

If you want to strictly split your text by a certain length of characters, you can do so using RecursiveCharacterTextSplitter:

<code class="javascript language-javascript"><span class="token keyword module">import</span> <span class="token imports"><span class="token punctuation">{</span> <span class="token maybe-class-name">RecursiveCharacterTextSplitter</span> <span class="token punctuation">}</span></span> <span class="token keyword module">from</span> <span class="token string">"langchain/text_splitter"</span><span class="token punctuation">;</span>
<span class="token keyword">const</span> splitter <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">RecursiveCharacterTextSplitter</span><span class="token punctuation">(</span><span class="token punctuation">{</span>
  chunkSize<span class="token operator">:</span> <span class="token number">100</span><span class="token punctuation">,</span>
  chunkOverlap<span class="token operator">:</span> <span class="token number">15</span><span class="token punctuation">,</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token keyword">const</span> output <span class="token operator">=</span> <span class="token keyword control-flow">await</span> splitter<span class="token punctuation">.</span><span class="token method function property-access">createDocuments</span><span class="token punctuation">(</span><span class="token punctuation">[</span>your_text<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code>

In this example, the text gets split every 100 characters, with a chunk overlap of 15 characters.

Chunk size and overlap

By looking at those examples, you’ve probably started wondering exactly what the chunk size and overlap parameters mean, and what implications they have on performance. Well, let me explain it simply in two points.

  • Chunk size decides the amount of characters that will be in each chunk. The bigger the chunk size, the more data is in the chunk, the more time it will take LangChain to process it and to produce an output, and vice versa.

  • Chunk overlap is what shares information between chunks so that they share some context. The higher the chunk overlap, the more redundant your chunks will be; the lower the chunk overlap, the less context will be shared between the chunks. Generally, a good chunk overlap is between 10% and 20% of the chunk size, although the ideal chunk overlap varies across different text types and use cases.

Chains

Chains are basically multiple LLM functionalities linked together to perform more complex tasks that couldn’t otherwise be done with simple LLM input-->output fashion. Let’s look at a cool example:

<code class="javascript language-javascript"><span class="token keyword module">import</span> <span class="token imports"><span class="token punctuation">{</span> <span class="token maybe-class-name">ChatPromptTemplate</span> <span class="token punctuation">}</span></span> <span class="token keyword module">from</span> <span class="token string">"langchain/prompts"</span><span class="token punctuation">;</span>
<span class="token keyword module">import</span> <span class="token imports"><span class="token punctuation">{</span> <span class="token maybe-class-name">LLMChain</span> <span class="token punctuation">}</span></span> <span class="token keyword module">from</span> <span class="token string">"langchain/chains"</span><span class="token punctuation">;</span>
<span class="token keyword module">import</span> <span class="token imports"><span class="token punctuation">{</span> <span class="token maybe-class-name">ChatOpenAI</span> <span class="token punctuation">}</span></span> <span class="token keyword module">from</span> <span class="token string">"langchain/chat_models/openai"</span><span class="token punctuation">;</span>

process<span class="token punctuation">.</span><span class="token property-access">env</span><span class="token punctuation">[</span><span class="token string">"OPENAI_API_KEY"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token string">"YOUR_OPENAI_KEY"</span>

<span class="token keyword">const</span> wiki_text <span class="token operator">=</span> <span class="token template-string"><span class="token template-punctuation string">`</span><span class="token string">
Alexander Stanislavovich 'Sasha' Bublik (Александр Станиславович Бублик; born 17 June 1997) is a Kazakhstani professional tennis player. 
He has been ranked as high as world No. 25 in singles by the Association of Tennis Professionals (ATP), which he achieved in July 2023, and is the current Kazakhstani No. 1 player...

Alexander Stanislavovich Bublik was born on 17 June 1997 in Gatchina, Russia and began playing tennis at the age of four. He was coached by his father, Stanislav. On the junior tour, Bublik reached a career-high ranking of No. 19 and won eleven titles (six singles and five doubles) on the International Tennis Federation (ITF) junior circuit.[4][5]...
</span><span class="token template-punctuation string">`</span></span>

<span class="token keyword">const</span> chat <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ChatOpenAI</span><span class="token punctuation">(</span><span class="token punctuation">{</span> temperature<span class="token operator">:</span> <span class="token number">0</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">const</span> chatPrompt <span class="token operator">=</span> <span class="token maybe-class-name">ChatPromptTemplate</span><span class="token punctuation">.</span><span class="token method function property-access">fromMessages</span><span class="token punctuation">(</span><span class="token punctuation">[</span>
  <span class="token punctuation">[</span>
    <span class="token string">"system"</span><span class="token punctuation">,</span>
    <span class="token string">"You are a helpful assistant that {action} the provided text"</span><span class="token punctuation">,</span>
  <span class="token punctuation">]</span><span class="token punctuation">,</span>
  <span class="token punctuation">[</span><span class="token string">"human"</span><span class="token punctuation">,</span> <span class="token string">"{text}"</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">const</span> chainB <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">LLMChain</span><span class="token punctuation">(</span><span class="token punctuation">{</span>
  prompt<span class="token operator">:</span> chatPrompt<span class="token punctuation">,</span>
  llm<span class="token operator">:</span> chat<span class="token punctuation">,</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token keyword">const</span> resB <span class="token operator">=</span> <span class="token keyword control-flow">await</span> chainB<span class="token punctuation">.</span><span class="token method function property-access">call</span><span class="token punctuation">(</span><span class="token punctuation">{</span>
  action<span class="token operator">:</span> <span class="token string">"lists all important numbers from"</span><span class="token punctuation">,</span>
  text<span class="token operator">:</span> wiki_text<span class="token punctuation">,</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token console class-name">console</span><span class="token punctuation">.</span><span class="token method function property-access">log</span><span class="token punctuation">(</span><span class="token punctuation">{</span> resB <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code>

This code takes a variable into its prompt, and formulates a factually correct answer (temperature: 0). In this example, I asked the LLM to list all important numbers from a short Wiki bio of my favorite tennis player.

Here’s the output of this code:

<code class="bash language-bash"><span class="token punctuation">{</span>
  resB: <span class="token punctuation">{</span>
    text: <span class="token string">'Important numbers from the provided text:<span class="token entity" title="\n">\n</span>'</span> +
      <span class="token string">'<span class="token entity" title="\n">\n</span>'</span> +
      <span class="token string">"- Alexander Stanislavovich 'Sasha' Bublik's date of birth: 17 June 1997<span class="token entity" title="\n">\n</span>"</span> +
      <span class="token string">"- Bublik's highest singles ranking: world No. 25<span class="token entity" title="\n">\n</span>"</span> +
      <span class="token string">"- Bublik's highest doubles ranking: world No. 47<span class="token entity" title="\n">\n</span>"</span> +
      <span class="token string">"- Bublik's career ATP Tour singles titles: 3<span class="token entity" title="\n">\n</span>"</span> +
      <span class="token string">"- Bublik's career ATP Tour singles runner-up finishes: 6<span class="token entity" title="\n">\n</span>"</span> +
      <span class="token string">"- Bublik's height: 1.96 m (6 ft 5 in)<span class="token entity" title="\n">\n</span>"</span> +
      <span class="token string">"- Bublik's number of aces served in the 2021 ATP Tour season: unknown<span class="token entity" title="\n">\n</span>"</span> +
      <span class="token string">"- Bublik's junior tour ranking: No. 19<span class="token entity" title="\n">\n</span>"</span> +
      <span class="token string">"- Bublik's junior tour titles: 11 (6 singles and 5 doubles)<span class="token entity" title="\n">\n</span>"</span> +
      <span class="token string">"- Bublik's previous citizenship: Russia<span class="token entity" title="\n">\n</span>"</span> +
      <span class="token string">"- Bublik's current citizenship: Kazakhstan<span class="token entity" title="\n">\n</span>"</span> +
      <span class="token string">"- Bublik's role in the Levitov Chess Wizards team: reserve member"</span>
  <span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code>

Pretty cool, but this doesn’t really show the full power of chains. Let’s take a look at a more practical example:

<code class="javascript language-javascript"><span class="token keyword module">import</span> <span class="token imports"><span class="token punctuation">{</span> z <span class="token punctuation">}</span></span> <span class="token keyword module">from</span> <span class="token string">"zod"</span><span class="token punctuation">;</span>
<span class="token keyword module">import</span> <span class="token imports"><span class="token punctuation">{</span> zodToJsonSchema <span class="token punctuation">}</span></span> <span class="token keyword module">from</span> <span class="token string">"zod-to-json-schema"</span><span class="token punctuation">;</span>
<span class="token keyword module">import</span> <span class="token imports"><span class="token punctuation">{</span> <span class="token maybe-class-name">ChatOpenAI</span> <span class="token punctuation">}</span></span> <span class="token keyword module">from</span> <span class="token string">"langchain/chat_models/openai"</span><span class="token punctuation">;</span>
<span class="token keyword module">import</span> <span class="token imports"><span class="token punctuation">{</span>
  <span class="token maybe-class-name">ChatPromptTemplate</span><span class="token punctuation">,</span>
  <span class="token maybe-class-name">SystemMessagePromptTemplate</span><span class="token punctuation">,</span>
  <span class="token maybe-class-name">HumanMessagePromptTemplate</span><span class="token punctuation">,</span>
<span class="token punctuation">}</span></span> <span class="token keyword module">from</span> <span class="token string">"langchain/prompts"</span><span class="token punctuation">;</span>
<span class="token keyword module">import</span> <span class="token imports"><span class="token punctuation">{</span> <span class="token maybe-class-name">JsonOutputFunctionsParser</span> <span class="token punctuation">}</span></span> <span class="token keyword module">from</span> <span class="token string">"langchain/output_parsers"</span><span class="token punctuation">;</span>

process<span class="token punctuation">.</span><span class="token property-access">env</span><span class="token punctuation">[</span><span class="token string">"OPENAI_API_KEY"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token string">"YOUR_OPENAI_KEY"</span>

<span class="token keyword">const</span> zodSchema <span class="token operator">=</span> z<span class="token punctuation">.</span><span class="token method function property-access">object</span><span class="token punctuation">(</span><span class="token punctuation">{</span>
  albums<span class="token operator">:</span> z
    <span class="token punctuation">.</span><span class="token method function property-access">array</span><span class="token punctuation">(</span>
      z<span class="token punctuation">.</span><span class="token method function property-access">object</span><span class="token punctuation">(</span><span class="token punctuation">{</span>
        name<span class="token operator">:</span> z<span class="token punctuation">.</span><span class="token method function property-access">string</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token method function property-access">describe</span><span class="token punctuation">(</span><span class="token string">"The name of the album"</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
        artist<span class="token operator">:</span> z<span class="token punctuation">.</span><span class="token method function property-access">string</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token method function property-access">describe</span><span class="token punctuation">(</span><span class="token string">"The artist(s) that made the album"</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
        length<span class="token operator">:</span> z<span class="token punctuation">.</span><span class="token method function property-access">number</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token method function property-access">describe</span><span class="token punctuation">(</span><span class="token string">"The length of the album in minutes"</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
        genre<span class="token operator">:</span> z<span class="token punctuation">.</span><span class="token method function property-access">string</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token method function property-access">optional</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token method function property-access">describe</span><span class="token punctuation">(</span><span class="token string">"The genre of the album"</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
      <span class="token punctuation">}</span><span class="token punctuation">)</span>
    <span class="token punctuation">)</span>
    <span class="token punctuation">.</span><span class="token method function property-access">describe</span><span class="token punctuation">(</span><span class="token string">"An array of music albums mentioned in the text"</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">const</span> prompt <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ChatPromptTemplate</span><span class="token punctuation">(</span><span class="token punctuation">{</span>
  promptMessages<span class="token operator">:</span> <span class="token punctuation">[</span>
    <span class="token maybe-class-name">SystemMessagePromptTemplate</span><span class="token punctuation">.</span><span class="token method function property-access">fromTemplate</span><span class="token punctuation">(</span>
      <span class="token string">"List all music albums mentioned in the following text."</span>
    <span class="token punctuation">)</span><span class="token punctuation">,</span>
    <span class="token maybe-class-name">HumanMessagePromptTemplate</span><span class="token punctuation">.</span><span class="token method function property-access">fromTemplate</span><span class="token punctuation">(</span><span class="token string">"{inputText}"</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
  <span class="token punctuation">]</span><span class="token punctuation">,</span>
  inputVariables<span class="token operator">:</span> <span class="token punctuation">[</span><span class="token string">"inputText"</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">const</span> llm <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ChatOpenAI</span><span class="token punctuation">(</span><span class="token punctuation">{</span> modelName<span class="token operator">:</span> <span class="token string">"gpt-3.5-turbo"</span><span class="token punctuation">,</span> temperature<span class="token operator">:</span> <span class="token number">0</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">const</span> functionCallingModel <span class="token operator">=</span> llm<span class="token punctuation">.</span><span class="token method function property-access">bind</span><span class="token punctuation">(</span><span class="token punctuation">{</span>
  functions<span class="token operator">:</span> <span class="token punctuation">[</span>
    <span class="token punctuation">{</span>
      name<span class="token operator">:</span> <span class="token string">"output_formatter"</span><span class="token punctuation">,</span>
      description<span class="token operator">:</span> <span class="token string">"Should always be used to properly format output"</span><span class="token punctuation">,</span>
      parameters<span class="token operator">:</span> <span class="token function">zodToJsonSchema</span><span class="token punctuation">(</span>zodSchema<span class="token punctuation">)</span><span class="token punctuation">,</span>
    <span class="token punctuation">}</span><span class="token punctuation">,</span>
  <span class="token punctuation">]</span><span class="token punctuation">,</span>
  function_call<span class="token operator">:</span> <span class="token punctuation">{</span> name<span class="token operator">:</span> <span class="token string">"output_formatter"</span> <span class="token punctuation">}</span><span class="token punctuation">,</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token keyword">const</span> outputParser <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">JsonOutputFunctionsParser</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">const</span> chain <span class="token operator">=</span> prompt<span class="token punctuation">.</span><span class="token method function property-access">pipe</span><span class="token punctuation">(</span>functionCallingModel<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token method function property-access">pipe</span><span class="token punctuation">(</span>outputParser<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">const</span> response <span class="token operator">=</span> <span class="token keyword control-flow">await</span> chain<span class="token punctuation">.</span><span class="token method function property-access">invoke</span><span class="token punctuation">(</span><span class="token punctuation">{</span>
  inputText<span class="token operator">:</span> <span class="token string">"My favorite albums are: 2001, To Pimp a Butterfly and Led Zeppelin IV"</span><span class="token punctuation">,</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token console class-name">console</span><span class="token punctuation">.</span><span class="token method function property-access">log</span><span class="token punctuation">(</span><span class="token known-class-name class-name">JSON</span><span class="token punctuation">.</span><span class="token method function property-access">stringify</span><span class="token punctuation">(</span>response<span class="token punctuation">,</span> <span class="token keyword null nil">null</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code>

This code reads an input text, identifies all mentioned music albums, identifies each album’s name, artist, length and genre, and finally puts all the data into JSON format. Here’s the output given the input “My favorite albums are: 2001, To Pimp a Butterfly and Led Zeppelin IV”:

<code class="javascript language-javascript"><span class="token punctuation">{</span>
  <span class="token string">"albums"</span><span class="token operator">:</span> <span class="token punctuation">[</span>
    <span class="token punctuation">{</span>
      <span class="token string">"name"</span><span class="token operator">:</span> <span class="token string">"2001"</span><span class="token punctuation">,</span>
      <span class="token string">"artist"</span><span class="token operator">:</span> <span class="token string">"Dr. Dre"</span><span class="token punctuation">,</span>
      <span class="token string">"length"</span><span class="token operator">:</span> <span class="token number">68</span><span class="token punctuation">,</span>
      <span class="token string">"genre"</span><span class="token operator">:</span> <span class="token string">"Hip Hop"</span>
    <span class="token punctuation">}</span><span class="token punctuation">,</span>
    <span class="token punctuation">{</span>
      <span class="token string">"name"</span><span class="token operator">:</span> <span class="token string">"To Pimp a Butterfly"</span><span class="token punctuation">,</span>
      <span class="token string">"artist"</span><span class="token operator">:</span> <span class="token string">"Kendrick Lamar"</span><span class="token punctuation">,</span>
      <span class="token string">"length"</span><span class="token operator">:</span> <span class="token number">79</span><span class="token punctuation">,</span>
      <span class="token string">"genre"</span><span class="token operator">:</span> <span class="token string">"Hip Hop"</span>
    <span class="token punctuation">}</span><span class="token punctuation">,</span>
    <span class="token punctuation">{</span>
      <span class="token string">"name"</span><span class="token operator">:</span> <span class="token string">"Led Zeppelin IV"</span><span class="token punctuation">,</span>
      <span class="token string">"artist"</span><span class="token operator">:</span> <span class="token string">"Led Zeppelin"</span><span class="token punctuation">,</span>
      <span class="token string">"length"</span><span class="token operator">:</span> <span class="token number">42</span><span class="token punctuation">,</span>
      <span class="token string">"genre"</span><span class="token operator">:</span> <span class="token string">"Rock"</span>
    <span class="token punctuation">}</span>
  <span class="token punctuation">]</span>
<span class="token punctuation">}</span>
</code>

This is just a fun example, but this technique can be used to structure unstructured text data for countless other applications.

Going Beyond OpenAI

Even though I keep using OpenAI models as examples of the different functionalities of LangChain, it isn’t limited to OpenAI models. You can use LangChain with a multitude of other LLMs and AI services. You can find the full list of LangChain and JavaScript integratable LLMs in their documentation.

For example, you can use Cohere with LangChain. After installing Cohere, using npm install cohere-ai, you can make a simple question-->answer code using LangChain and Cohere like this:

<code class="javascript language-javascript"><span class="token keyword module">import</span> <span class="token imports"><span class="token punctuation">{</span> <span class="token maybe-class-name">Cohere</span> <span class="token punctuation">}</span></span> <span class="token keyword module">from</span> <span class="token string">"langchain/llms/cohere"</span><span class="token punctuation">;</span>

<span class="token keyword">const</span> model <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Cohere</span><span class="token punctuation">(</span><span class="token punctuation">{</span>
  maxTokens<span class="token operator">:</span> <span class="token number">50</span><span class="token punctuation">,</span>
  apiKey<span class="token operator">:</span> <span class="token string">"YOUR_COHERE_KEY"</span><span class="token punctuation">,</span> 
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">const</span> res <span class="token operator">=</span> <span class="token keyword control-flow">await</span> model<span class="token punctuation">.</span><span class="token method function property-access">call</span><span class="token punctuation">(</span>
  <span class="token string">"Come up with a name for a new Nas album"</span>
<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token console class-name">console</span><span class="token punctuation">.</span><span class="token method function property-access">log</span><span class="token punctuation">(</span><span class="token punctuation">{</span> res <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code>

Output:

<code class="javascript language-javascript"><span class="token punctuation">{</span>
  res<span class="token operator">:</span> <span class="token string">' Here are a few possible names for a new Nas album:\n'</span> <span class="token operator">+</span>
    <span class="token string">'\n'</span> <span class="token operator">+</span>
    <span class="token string">"- King's Landing\n"</span> <span class="token operator">+</span>
    <span class="token string">"- God's Son: The Sequel\n"</span> <span class="token operator">+</span>
    <span class="token string">"- Street's Disciple\n"</span> <span class="token operator">+</span>
    <span class="token string">'- Izzy Free\n'</span> <span class="token operator">+</span>
    <span class="token string">'- Nas and the Illmatic Flow\n'</span> <span class="token operator">+</span>
    <span class="token string">'\n'</span> <span class="token operator">+</span>
    <span class="token string">'Do any'</span>
<span class="token punctuation">}</span>
</code>

Conclusion

In this guide, you’ve seen the different aspects and functionalities of LangChain in JavaScript. You can use LangChain in JavaScript to easily develop AI-powered web apps and experiment with LLMs. Be sure to refer to the LangChainJS documentation for more details on specific functionalities.

Happy coding and experimenting with LangChain in JavaScript! If you enjoyed this article, you might also like to read about using LangChain with Python.



Leave a Reply

Your email address will not be published. Required fields are marked *

Back to top button
WP Twitter Auto Publish Powered By : XYZScripts.com
SiteLock