nodejs openai langchain 本地对话机器人

1,181 阅读1分钟

话不多说直接上代码

import { OpenAI } from 'langchain/llms';
import { RetrievalQAChain } from 'langchain/chains';
import { HNSWLib } from 'langchain/vectorstores';
import { OpenAIEmbeddings } from 'langchain/embeddings';
import { RecursiveCharacterTextSplitter } from 'langchain/text_splitter';
import * as fs from 'fs';
import * as dotenv from 'dotenv';   
// 2. 加载环境变量
dotenv.config();
const openAIApiKey = '';
const basePath = '' ; 
// 3. 设置输入数据和路径
const txtFilename = "The_Creative_Act";
const question = "林知命是好人么,为什么,用中文回答我";
const txtPath = `./${txtFilename}.txt`;
const VECTOR_STORE_PATH = `${txtFilename}.index`;

// 4. 定义运行带嵌入的主函数
export const runWithEmbeddings = async () => {
  // 5. 使用一个空的配置对象初始化OpenAI模型
  const model = new OpenAI({openAIApiKey },{basePath });

  // 6. 检查矢量存储文件是否存在
  let vectorStore;
  if (fs.existsSync(VECTOR_STORE_PATH)) {
    // 6.1. 如果向量存储文件存在,将其加载到内存中
    console.log('Vector Exists..');
    vectorStore = await HNSWLib.load(VECTOR_STORE_PATH, new OpenAIEmbeddings({openAIApiKey },{basePath }));
  } else {
    // 6.2. 如果矢量存储文件不存在,创建
    // 6.2.1.读取输入的文本文件
    const text = fs.readFileSync(txtPath, 'utf8');
    // 6.2.2. 创建分割文本对象
    const textSplitter = new RecursiveCharacterTextSplitter({ chunkSize: 1000 });
    // 6.2.3. 将输入文本拆分为文档
    const docs = await textSplitter.createDocuments([text]);
    // 6.2.4. 使用OpenAIEmbeddings从文档创建新的矢量存储
    vectorStore = await HNSWLib.fromDocuments(docs, new OpenAIEmbeddings({openAIApiKey },{basePath })); 
    // 6.2.5. 将矢量存储保存到文件
    await vectorStore.save(VECTOR_STORE_PATH);
  }

  // 7. 通过传递初始化的OpenAI模型和向量存储检索器创建RetrievalQAChain
  const chain = RetrievalQAChain.fromLLM(model, vectorStore.asRetriever());

  // 8. 使用输入问题调用RetrievalQAChain,并将结果存储在“res”变量中
  const res = await chain.call({
    query: question,
  });

  // 9.将结果记录到控制台
  console.log({ res });
}; 
// 10. 执行主函数runWithEmbeddings
runWithEmbeddings(); 

自己做的对话小程序 基于chatgpt gh_fee1287c2853_258.jpg