reactjs - NextJS 13 használata a Langchain ajánlott vektortárolójával hibát ad: HNSWLib nincs telepítve
Egy alkalmazást készítek a Langchain és az OpenAI segítségével. Az adataimat a JSONLoader-rel töltöm be, és szeretném egy vektortárban tárolni, hogy felhasználói kérés esetén elő tudjam hívni, és választ adhassak az adataimra vonatkozó kérdésekre. A Langchain dokumentációja az HNSWLib-et csak Node.js alkalmazásokhoz javasolja tárolóként. Az én értelmezésem szerint a NEXT a Node.js-re épül, így futtathat SS JavaScript-et, tehát használnom kellene tudni. Azt is meg kell említenem, hogy a JSONLoader csak NodeJS-en működik, ami tökéletesen működik, így úgy gondolom, minden készen áll.
Létrehoztam egy API útvonalat az app/api/llm/route.ts fájlban az új Route Handlers dokumentációját követve, és telepítettem a hnswlib-node csomagot is.
import { NextRequest } from 'next/server';
import { OpenAI } from 'langchain/llms/openai';
import { RetrievalQAChain } from 'langchain/chains';
import { JSONLoader } from 'langchain/document_loaders/fs/json';
import { HNSWLib } from 'langchain/vectorstores/hnswlib';
import { OpenAIEmbeddings } from 'langchain/embeddings/openai';
import path from 'path';
// eslint-disable-next-line @typescript-eslint/no-unused-vars, no-unused-vars
export const GET = async (req: NextRequest) => {
const apiKey = process.env.NEXT_PUBLIC_OPENAI_API_KEY;
const model = new OpenAI({ openAIApiKey: apiKey, temperature: 0.9, modelName: 'gpt-3.5-turbo' });
// Initialize the LLM to use to answer the question.
const loader = new JSONLoader(path.join(process.cwd(), '/assets/surfspots.json'));
const docs = await loader.load();
// Create a vector store from the documents.
const vectorStore = await HNSWLib.fromDocuments(docs, new OpenAIEmbeddings({ openAIApiKey: apiKey }));
// Create a chain that uses the OpenAI LLM and HNSWLib vector store.
const chain = RetrievalQAChain.fromLLM(model, vectorStore.asRetriever());
const res = await chain.call({
query: 'List me all of the waves I can find in Fuerteventura',
});
console.log({ res });
};
Ezt a kliensoldali React komponensben a front-endről hívom.
Amikor megpróbálom futtatni ezt a kódot, a következő hibát kapom:
Error: Please install hnswlib-node as a dependency with, e.g. `npm install -S hnswlib-node`
at HNSWLib.imports (webpack-internal:///(sc_server)/./node_modules/langchain/dist/vectorstores/hnswlib.js:184:19)
Megpróbáltam újratelepíteni a csomagot, eltávolítottam a node_modules-t, és mindent újra telepítettem, kerestem a választ az interneten, stb.
Valaki dolgozott már ezekkel a könyvtárakkal, vagy van valamilyen irány, amit figyelembe vehetnék a hibakereséshez? Előre is köszönöm!
Válasz #1
Miután megpróbáltam újratelepíteni, megváltoztatni az importot és eltávolítani az önálló csomagot, majd megpróbálni a langchain könyvtárból használni, találtam egy problémát a githubon. A langchain/js githubján van egy beszélgetés, amely hasonló problémát ír le különböző környezetekben, és kiderült, hogy a next.config.js fájlhoz némi extra beállítás szükséges a működéshez. Nagy köszönet @manduks-nak.
https://github.com/hwchase17/langchainjs/issues/943#issuecomment-1544928533
A 6. sor hozzáadása megoldotta a problémát.
/** @type {import("next").NextConfig} */
module.exports = {
experimental: { appDir: true },
webpack(config) {
config.experiments = { ...config.experiments, topLevelAwait: true };
config.externals = [...config.externals, 'hnswlib-node']; // by adding this line, solved the import
return config;
},
};
