Запрос моих собственных данных с использованием langchain и сосновой шишки
Я хочу использовать langchain, чтобы предоставить свой собственный контекст модели llm openai gpt и запросить мои данные с использованием модели llm. Во-первых, я использую langchainjs для загрузки документов на основе предоставленного пути к файлу и разделения их на фрагменты. Затем эти разделенные документы передаются в базу данных шишек и сохраняются с использованием библиотеки шишек. Это хранилище используется для создания цепочки контроля качества llm и использования ее для запроса моих данных.
Это моя текущая реализация:
main.js
import { Document } from "langchain/document";
import { TextLoader } from "langchain/document_loaders/fs/text";
import { PDFLoader } from "langchain/document_loaders/fs/pdf";
import { CharacterTextSplitter } from "langchain/text_splitter";
import { PineconeClient } from "@pinecone-database/pinecone";
import { OpenAIEmbeddings } from "langchain/embeddings/openai";
import { PineconeStore } from "langchain/vectorstores/pinecone";
import { OpenAI } from "langchain/llms/openai";
import { VectorDBQAChain } from "langchain/chains";
const openAIApiKey = process.env.OPEN_AI_API_KEY;
async function main(filePath) {
// create document array
const docs = [
new Document({
metadata: { name: `Filepath: ${filePath}` },
}),
];
// initialize loader
const Loader = path.extname(file) === `.pdf` ? PDFLoader : TextLoader;
const loader = new Loader(file);
// load and split the docs
const loadedAndSplitted = await loader.loadAndSplit();
// push the splitted docs to the array
docs.push(...loadedAndSplitted);
// create splitter
const textSplitter = new CharacterTextSplitter({
chunkSize: 1000,
chunkOverlap: 0,
});
// use the splitter to split the docs to different chunks
const splittedDocs = await textSplitter.splitDocuments(docs);
// create pinecone index
const client = new PineconeClient();
await client.init({
apiKey: process.env.PINECONE_API_KEY,
environment: process.env.PINECONE_ENVIRONMENT,
});
const pineconeIndex = client.Index(process.env.PINECONE_INDEX);
// create openai embedding
const embeddings = new OpenAIEmbeddings({ openAIApiKey });
// create a pinecone store using the splitted docs and the pinecone index
const pineconeStore = await PineconeStore.fromDocuments(
splittedDocs,
embeddings,
{
pineconeIndex,
namespace: "my-pinecode-index",
}
);
// initialize openai model
const model = new OpenAI({
openAIApiKey,
modelName: "gpt-3.5-turbo",
});
// create a vector chain using the llm model and the pinecone store
const chain = VectorDBQAChain.fromLLM(model, pineconeStore, {
k: 1,
returnSourceDocuments: true,
});
// use the chain to query my data
const response = await chain.call({
query: "Explain about the contents of the pdf file I provided.", // question is based on the file i provided
});
console.log(`\nResponse: ${response.text}`);
}
Примечание. Мой индекс сосновой шишки имеет размерность 1536, потому что я получил ошибку:
Ответы, которые я получаю, совершенно неожиданны. Иногда он отвечает мне, если ему задают нормальный и нетривиальный вопрос, но зачастую модель вообще не понимает контекста моих данных. Он просто отрицает знание даже самых простых вещей. Основную идею реализации я почерпнул из документации langchainjs.
Я попытался изменить модель GPT с помощью текстовых моделей Давинчи, изменить размер фрагмента и воссоздать хранилище сосновых шишек. Но это тоже ничего не дает.
Может ли кто-нибудь помочь мне, что я здесь делаю не так? Или подскажите, что мне делать.
Любая помощь приветствуется. Спасибо.