Weboldal keresés

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;
  },
};