import { ChatOpenAI, OpenAIEmbeddings } from "@langchain/openai";
import { MemoryVectorStore } from "@langchain/classic/vectorstores/memory";
import { TokenTextSplitter } from "@langchain/textsplitters";
import { SearchApiLoader } from "@langchain/community/document_loaders/web/searchapi";
import { ChatPromptTemplate } from "@langchain/core/prompts";
import { createStuffDocumentsChain } from "@langchain/classic/chains/combine_documents";
import { createRetrievalChain } from "@langchain/classic/chains/retrieval";
// 初始化必要组件
const llm = new ChatOpenAI({
model: "gpt-3.5-turbo-1106",
});
const embeddings = new OpenAIEmbeddings();
const apiKey = "Your SearchApi API key";
// 定义您的问题和查询
const question = "Your question here";
const query = "Your query here";
// 使用 SearchApiLoader 加载网络搜索结果
const loader = new SearchApiLoader({ q: query, apiKey, engine: "google" });
const docs = await loader.load();
const textSplitter = new TokenTextSplitter({
chunkSize: 800,
chunkOverlap: 100,
});
const splitDocs = await textSplitter.splitDocuments(docs);
// 使用 MemoryVectorStore 将加载的文档存储在内存中
const vectorStore = await MemoryVectorStore.fromDocuments(
splitDocs,
embeddings
);
const questionAnsweringPrompt = ChatPromptTemplate.fromMessages([
[
"system",
"根据以下上下文回答用户的问题:\n\n{context}",
],
["human", "{input}"],
]);
const combineDocsChain = await createStuffDocumentsChain({
llm,
prompt: questionAnsweringPrompt,
});
const chain = await createRetrievalChain({
retriever: vectorStore.asRetriever(),
combineDocsChain,
});
const res = await chain.invoke({
input: question,
});
console.log(res.answer);