상세 컨텐츠

본문 제목

langchain.js - LangChain

ai

by 폴리프레임 2024. 6. 8. 00:58

본문

반응형

LangChain은 LLM(Large Language Model) 모델을 통해 다양한 작업을 수행할 수 있게 하는 라이브러리입니다. 주로 자연어 처리(NLP)와 인공지능(AI) 애플리케이션을 구축하는 데 사용됩니다. LangChain.js는 이러한 LangChain의 기능을 JavaScript 환경에서 사용할 수 있도록 하는 라이브러리입니다. 핵심 기능은 RAG ( Retrieval Augmented Generation) 이라고 할 수 있으며, 추후 자세히 이야기 해보겠습니다.

LangChain.js의 주요 구성 요소

  • Core: LangChain.js의 핵심 기능을 제공하며, 언어 모델과의 상호작용, 데이터 소스 통합, 체인 생성 등의 기능을 포함합니다.
  • Prompts: 다양한 작업을 수행하기 위해 사용자 입력을 받아 언어 모델에 전달할 수 있도록 돕는 유틸리티를 제공합니다.
  • Chains: 복잡한 작업을 체인 형태로 구성하고 실행할 수 있도록 하는 기능입니다. 이를 통해 여러 단계를 거쳐 결과를 도출할 수 있습니다.
  • Agents: 사용자와의 상호작용을 관리하고, 주어진 작업을 자동으로 수행할 수 있는 에이전트를 제공합니다.

설치

npm install langchain @langchain/openai
// @langchain/core

 

@langchain/core 는 langchain 의 dependency 이며, 동시에 @langchain/openai 의 dependency 입니다. 따라서 별도 설치가 필요하지 않으며, package.json의 "dependencies" 에도 명시되지 않습니다. npm ls @langchain/core로 디펜던시 구조를 들여다 보면, deduped 처리된 것을 볼 수 있습니다.( deduped는 특히 의존성 트리에서 중복된 패키지를 제거했음을 나타냅니다)

 

Output-Parser들을 이용한 예제 

// langchain doc 에 모든 properties 있음
import { ChatOpenAI } from "@langchain/openai";
import { ChatPromptTemplate } from "@langchain/core/prompts";

import {
  StringOutputParser,
  CommaSeparatedListOutputParser,
} from "@langchain/core/output_parsers";
import { StructuredOutputParser } from "langchain/output_parsers";

import { z } from "zod";

import * as dotenv from "dotenv";
dotenv.config();

// 모델 만들기
const model = new ChatOpenAI({
  modelName: "gpt-3.5-turbo",
  temperature: 0.7,
});

async function callStringOutputParser() {
  // prompt template 만들기
  const prompt = ChatPromptTemplate.fromMessages([
    ["system", "Generate a joke on a word provided by the user."],
    ["human", "{input}"],
  ]);
  // parser 만들기
  const parser = new StringOutputParser(); // 줄바꿈기호(\n)등 사라짐
  // chain 만들기
  const chain = prompt.pipe(model).pipe(parser);
  // chain 호출하기
  return await chain.invoke({
    input: "dog",
  });
}

async function callListOutputParser() {
  const prompt = ChatPromptTemplate.fromTemplate(`
        Provide 5 synonyms, seperated by commas, for the following word {word}
    `);
  const outputParser = new CommaSeparatedListOutputParser();
  const chain = prompt.pipe(model).pipe(outputParser); // .pipe(outputParser)없으면 콤머로 구분된 하나의 스트링으로 표기됨
  return await chain.invoke({
    word: "happy",
  });
}

async function callStructuredParser() {
  const prompt = ChatPromptTemplate.fromTemplate(`
        Extract information from the following phrase.
        Formatting Instruction: {format_instructions} 
        Phrase: {phrase}
    `);
  // new 안붙임, StructuredOutputParser.fromNamesAndDescriptions is not a constructor
  const structedOutputParser = StructuredOutputParser.fromNamesAndDescriptions({
    name: "the name of the person",
    age: "the age of the person",
  });
  const chain = prompt.pipe(model).pipe(structedOutputParser);

  return await chain.invoke({
    phrase: "John is 20 years old who lives in this town.",
    format_instructions: structedOutputParser.getFormatInstructions(),
  });
}

async function callZodOutputParser(){
    const prompt = ChatPromptTemplate.fromTemplate(`
    Extract information from the following phrase.
    Formatting Instruction: {format_instructions} 
    Phrase: {phrase}
    `)
    const structedOutputParser = StructuredOutputParser.fromZodSchema(
        z.object({
            recipe: z.string().describe("name of recipe"),
            ingredients: z.array(z.string()).describe("ingredients"),
        })
    );
    const chain = prompt.pipe(model).pipe(structedOutputParser);

    return await chain.invoke({
        phrase: " The incredients for a Spaghetti Bolognese recipe are tomatoes, minced beef, garlic, wine and herbs.",
        format_instructions: structedOutputParser.getFormatInstructions(),
    })
}

// const response = await callStringOutputParser(); //Why did the dog sit in the shade? Because he didn't want to be a hot dog!
// const response = await callListOutputParser(); //[ 'joyful', 'content', 'delighted', 'pleased', 'elated' ]
// const response = await callStructuredParser(); // { name: 'John', age: '20' } // object
const response = await callZodOutputParser(); 
//  {
//     recipe: 'Spaghetti Bolognese',
//     ingredients: [ 'tomatoes', 'minced beef', 'garlic', 'wine', 'herbs' ]
//  }
//  object

console.log(response);
console.log(typeof response); // object -자바스크립트 오브젝트

 

'ai' 카테고리의 다른 글

Models, Datasets, Spaces - Hugging Face  (0) 2024.07.03
.env - @ai-sdk/openai  (1) 2024.06.19
.env 과 인스턴스(model) 만들기 - langchain.js  (0) 2024.06.13
faiss-node  (0) 2024.06.13
Ai  (0) 2024.06.08

관련글 더보기