|
const { zodToJsonSchema } = require('zod-to-json-schema'); |
|
const { PromptTemplate } = require('langchain/prompts'); |
|
const { JsonKeyOutputFunctionsParser } = require('langchain/output_parsers'); |
|
const { LLMChain } = require('langchain/chains'); |
|
function getExtractionFunctions(schema) { |
|
return [ |
|
{ |
|
name: 'information_extraction', |
|
description: 'Extracts the relevant information from the passage.', |
|
parameters: { |
|
type: 'object', |
|
properties: { |
|
info: { |
|
type: 'array', |
|
items: { |
|
type: schema.type, |
|
properties: schema.properties, |
|
required: schema.required, |
|
}, |
|
}, |
|
}, |
|
required: ['info'], |
|
}, |
|
}, |
|
]; |
|
} |
|
const _EXTRACTION_TEMPLATE = `Extract and save the relevant entities mentioned in the following passage together with their properties. |
|
|
|
Passage: |
|
{input} |
|
`; |
|
function createExtractionChain(schema, llm, options = {}) { |
|
const { prompt = PromptTemplate.fromTemplate(_EXTRACTION_TEMPLATE), ...rest } = options; |
|
const functions = getExtractionFunctions(schema); |
|
const outputParser = new JsonKeyOutputFunctionsParser({ attrName: 'info' }); |
|
return new LLMChain({ |
|
llm, |
|
prompt, |
|
llmKwargs: { functions }, |
|
outputParser, |
|
tags: ['openai_functions', 'extraction'], |
|
...rest, |
|
}); |
|
} |
|
function createExtractionChainFromZod(schema, llm) { |
|
return createExtractionChain(zodToJsonSchema(schema), llm); |
|
} |
|
|
|
module.exports = { |
|
createExtractionChain, |
|
createExtractionChainFromZod, |
|
}; |
|
|