Как извлекать и генерировать данные JSON с помощью GPT, LangChain и Node.js

Как извлекать и генерировать данные JSON с помощью GPT, LangChain и Node.js

22 августа 2023 г.

В этой записи блога я расскажу, как использовать LangChain, гибкую платформу для создания приложений на основе ИИ, для извлечения и создания структурированных данных JSON с помощью GPT и Node.js. Я предоставлю фрагменты кода и краткие инструкции, которые помогут вам настроить и запустить проект.

О LangChain

LangChain – это инновационная и универсальная платформа, предназначенная для упрощения разработки приложений на основе ИИ.

Благодаря своей модульной архитектуре он предоставляет полный набор компонентов для создания шаблонов подсказок, подключения к различным источникам данных и беспрепятственного взаимодействия с различными инструментами.

Упрощая оперативное проектирование, интеграцию источников данных и взаимодействие с инструментами, LangChain позволяет разработчикам сосредоточиться на основной логике приложения, ускоряя процесс разработки.

Доступный как в API-интерфейсах Python, так и в JavaScript, LangChain легко адаптируется, позволяя разработчикам использовать возможности обработки естественного языка и искусственного интеллекта на различных платформах и в различных сценариях использования.

LangChain содержит инструменты, которые позволяют получать структурированный (как в формате JSON) вывод из LLM. Давайте использовать их в наших интересах.

Установка и настройка

Я предполагаю, что у вас установлена ​​одна из последних версий NodeJS. Я использовал узел 18. Посетите веб-сайт LangChain, если вам нужна дополнительная информация.

Сначала создайте новый проект узла, т. е.:

  1. Создайте новый каталог для своего проекта и перейдите к нему в терминале.

2. Запустите npm init, чтобы инициализировать новый проект Node.js.

3. Создайте файл index.js.

Затем давайте установим LangChain и настроим ключи API. Другие зависимости включены.

npm i langchain
# configure credentials (easiest)
export OPENAI_API_KEY=XXX
export SERPAPI_API_KEY=XXX

Это просто для демонстративного использования. Я предпочитаю не экспортировать переменные; Вместо этого я использую популярную библиотеку dotenv npm.

Давайте импортируем необходимые зависимости поверх нашего JS-файла.

import { z } from "zod";
import { OpenAI } from "langchain/llms/openai";
import { PromptTemplate } from "langchain/prompts";
import {
  StructuredOutputParser,
  OutputFixingParser,
} from "langchain/output_parsers";

Создание данных

Давайте начнем с создания поддельных данных, чтобы увидеть возможности их анализа.

Определение выходной схемы

Во-первых, нам нужно сообщить библиотеке, что мы хотим получить. LangChain поддерживает определение ожидаемой схемы с помощью популярной библиотеки Zod:

const parser = StructuredOutputParser.fromZodSchema(
 z.object({
   name: z.string().describe("Human name"),
   surname: z.string().describe("Human surname"),
   age: z.number().describe("Human age"),
   appearance: z.string().describe("Human appearance description"),
   shortBio: z.string().describe("Short bio secription"),
   university: z.string().optional().describe("University name if attended"),
   gender: z.string().describe("Gender of the human"),
   interests: z
     .array(z.string())
     .describe("json array of strings human interests"),
 })
);

Шаблон подсказки

Чтобы использовать этот шаблон, нам нужно создать конструкцию LangChain с именем PromptTemplate. Он будет содержать инструкции по форматированию от парсера:

const formatInstructions = parser.getFormatInstructions();

const prompt = new PromptTemplate({
 template:
   `Generate details of a hypothetical person.n{format_instructions}
    Person description: {description}`,
 inputVariables: ["description"],
 partialVariables: { format_instructions: formatInstructions },
});

Попробуйте

Чтобы выполнить структурированный вывод, вызовите модель OpenAI с вводом:

const model = new OpenAI({ temperature: 0.5, model: "gpt-3.5-turbo" });

const input = await prompt.format({
 description: "A man, living in Poland",
});
const response = await model.call(input);

Вот что будет отправлено модели ИИ. Это, скорее всего, изменится в будущих версиях LangChain.

Generate details of a hypothetical person.
You must format your output as a JSON value that adheres to a given "JSON Schema" instance.

"JSON Schema" is a declarative language that allows you to annotate and validate JSON documents.

For example, the example "JSON Schema" instance {{"properties": {{"foo": {{"description": "a list of test words", "type": "array", "items": {{"type": "string"}}}}}}, "required": ["foo"]}}}}
would match an object with one required property, "foo". The "type" property specifies "foo" must be an "array", and the "description" property semantically describes it as "a list of test words". The items within "foo" must be strings.
Thus, the object {{"foo": ["bar", "baz"]}} is a well-formatted instance of this example "JSON Schema". The object {{"properties": {{"foo": ["bar", "baz"]}}}} is not well-formatted.

Your output will be parsed and type-checked according to the provided schema instance, so make sure all fields in your output match exactly!

Here is the JSON Schema instance your output must adhere to:
'''json
{"type":"object","properties":{"name":{"type":"string","description":"Human name"},"surname":{"type":"string","description":"Human surname"},"age":{"type":"number","description":"Human age"},"appearance":{"type":"string","description":"Human appearance description"},"shortBio":{"type":"string","description":"Short bio secription"},"university":{"type":"string","description":"University name if attended"},"gender":{"type":"string","description":"Gender of the human"},"interests":{"type":"array","items":{"type":"string"},"description":"json array of strings human interests"}},"required":["name","surname","age","appearance","shortBio","gender","interests"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}
'''

Person description: A man, living in Poland.

Вывод модели будет выглядеть следующим образом:

{
   "name": "Adam",
   "surname": "Kowalski",
   "age": 21,
   "appearance": "Adam is a tall and slim man with short dark hair and blue eyes.",
   "shortBio": "Adam is a 21 year old man from Poland. He is currently studying computer science at the University of Warsaw.",
   "university": "University of Warsaw",
   "gender": "Male",
   "interests": ["Computer Science", "Cooking", "Photography"]
}

Как видите, мы получили именно то, что нам было нужно. Мы можем создавать целые личности со сложными описаниями, соответствующими другим частям личности. Если бы нам нужно было обогатить наш фиктивный набор данных, мы могли бы попросить другую модель ИИ создать фотографию на основе внешнего вида.

Обработка ошибок

Вы можете задаться вопросом, безопасно ли использование LLM в рабочем приложении. К счастью, LangChain ориентирован именно на такие проблемы. Если выходные данные нуждаются в исправлении, используйте метод OutputFixingParser. Он попытается исправить ошибки, если ваш LLM выведет что-то, не соответствующее вашим требованиям.

try {

 console.log(await parser.parse(response));

} catch (e) {

 console.error("Failed to parse bad output: ", e);

 const fixParser = OutputFixingParser.fromLLM(
   new OpenAI({ temperature: 0, model: "gpt-3.5-turbo" }),
   parser
 );
 const output = await fixParser.parse(response);
 console.log("Fixed output: ", output);

}

Извлечение данных из файлов

Чтобы загрузить и извлечь данные из файлов с помощью LangChain, выполните следующие действия. В этом примере мы собираемся загрузить файл PDF. Удобно, что в LangChain есть утилиты именно для этой цели. Нам нужна еще одна зависимость.

npm install pdf-parse

Мы собираемся загрузить краткую биографию Илона Маска и извлечь информацию, которую мы ранее сгенерировали. Загрузите файл PDF здесь: диск Google.

Во-первых, давайте создадим новый файл, например, structured-pdf.js. Начнем с загрузки PDF.

import { PDFLoader } from "langchain/document_loaders/fs/pdf";

const loader = new PDFLoader("./elon.pdf");
const docs = await loader.load();

console.log(docs);

Нам нужно изменить шаблон подсказки, чтобы указать извлечение, а не создание. Мне также пришлось изменить подсказку, чтобы исправить проблему с рендерингом JSON, так как результаты временами были несовместимы.

const prompt = new PromptTemplate({
  template:
    "Extract information from the person description.n{format_instructions}nThe response should be presented in a markdown JSON codeblock.nPerson description: {inputText}",
  inputVariables: ["inputText"],
  partialVariables: { format_instructions: formatInstructions },
});

Наконец, нам нужно увеличить допустимую длину вывода (это немного больше данных, чем в сгенерированном случае), так как по умолчанию это 256 токенов. Нам также нужно вызвать модель, используя наш загруженный документ, а не предопределенное описание человека.

const model = new OpenAI({ temperature: 0.5, model: "gpt-3.5-turbo", maxTokens: 2000 });

const input = await prompt.format({
  inputText: docs[0].pageContent,
});

Благодаря этим изменениям мы получаем следующий результат:

{
  name: 'Elon',
  surname: 'Musk',
  age: 51,
  appearance: 'normal build, short-cropped hair, and a trimmed beard',
  // truncated by me
  shortBio: "Elon Musk, a 51-year-old male entrepreneur, inventor, and CEO, is best known for his...',
  gender: 'male',
  interests: [
    'space exploration',
    'electric vehicles',
    'artificial intelligence',
    'sustainable energy',
    'tunnel construction',
    'neural interfaces',
    'Mars colonization',
    'hyperloop transportation'
  ]
}

Выполнив эти шаги, мы извлекли структурированные данные JSON из файла PDF! Этот подход универсален и может быть адаптирован для вашего конкретного случая использования.

Заключение

В заключение: используя LangChain, GPT и Node.js, вы можете создавать мощные приложения для извлечения и генерации структурированных данных JSON из различных источников.

Потенциальные области применения огромны, и, проявив немного творчества, вы можете использовать эту технологию для создания инновационных приложений и решений.

Вы можете найти код для этого руководства здесь: https://gist.github.com/horosin/5351ae4dc3eebbf181f9db212f5d3ebc

Подпишитесь на мой профиль, заполнив свой адрес электронной почты слева, и будьте в курсе моих статей!

Не забудьте подписаться на меня в Твиттере @horosin, и подписаться на информационный бюллетень в моем блоге, где вы найдете больше советов и идей!

Если у вас нет Twitter, вы также можете подписаться на меня в LinkedIn.


Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE