You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

63 lines
1.9 KiB

const { loadSummarizationChain } = require("langchain/chains");
const { PromptTemplate } = require("@langchain/core/prompts");
const { RecursiveCharacterTextSplitter } = require("@langchain/textsplitters");
const Provider = require("../providers/ai-provider");
/**
* @typedef {Object} LCSummarizationConfig
* @property {string} provider The LLM to use for summarization (inherited)
* @property {string} model The LLM Model to use for summarization (inherited)
* @property {AbortController['signal']} controllerSignal Abort controller to stop recursive summarization
* @property {string} content The text content of the text to summarize
*/
/**
* Summarize content using LLM LC-Chain call
* @param {LCSummarizationConfig} The LLM to use for summarization (inherited)
* @returns {Promise<string>} The summarized content.
*/
async function summarizeContent({
provider = "openai",
model = null,
controllerSignal,
content,
}) {
const llm = Provider.LangChainChatModel(provider, {
temperature: 0,
model: model,
});
const textSplitter = new RecursiveCharacterTextSplitter({
separators: ["\n\n", "\n"],
chunkSize: 10000,
chunkOverlap: 500,
});
const docs = await textSplitter.createDocuments([content]);
const mapPrompt = `
Write a detailed summary of the following text for a research purpose:
"{text}"
SUMMARY:
`;
const mapPromptTemplate = new PromptTemplate({
template: mapPrompt,
inputVariables: ["text"],
});
// This convenience function creates a document chain prompted to summarize a set of documents.
const chain = loadSummarizationChain(llm, {
type: "map_reduce",
combinePrompt: mapPromptTemplate,
combineMapPrompt: mapPromptTemplate,
verbose: process.env.NODE_ENV === "development",
});
const res = await chain.call({
...(controllerSignal ? { signal: controllerSignal } : {}),
input_documents: docs,
});
return res.text;
}
module.exports = { summarizeContent };