VSCode 插件适配 LangChain

918 阅读2分钟

最近在写一个基于 ChatGPT 的 VSCode 编码辅助插件,为了便于后续接入其他大语言模型和 Embedding,使用 LangChain 框架进行开发。我们的 LangChain 比较潮流只支持 Node.js 18+,燃鹅 VSCode 运行时使用的是内置的 Node.js 16 且无法升级,过程中遇到一些水土不服的问题,在此记录一下。

CatGPT Copilot - VSCode编程辅助插件

流式请求

LangChain 新版网络请求用的是浏览器环境的 fetch,VSCode 环境无法使用,官方文档给出了两种解决方案:

方案一,只需带着参数 NODE_OPTIONS='--experimental-fetch' 运行 Node 即可,经过各种场所 VSCode 插件运行时无法动态置入参数,未果。

方案二,使用 node-fetch 代替 fetch,具体操作如下:

  1. 安装 node-fetch 依赖
yarn add node-fetch --save
  1. polyfill,新建文件 fetch-polyfill.ts 代码如下,并在 LangChain 入口文件处引入此文件
/** 
 * node-fetch polyfill
 * 注:langchian 仅支持 Node.js 18+,vscode 插件环境为打包好的 Node.js 16,需加载此垫片,并按此文档替换 langchain 依赖中的流式解析逻辑
 * https://github.com/hwchase17/langchainjs/issues/548#issuecomment-1607846463
 */

import fetch, {Headers, Request, Response} from 'node-fetch';

declare global {
  var fetch: any;
  var Headers: any;
  var Request: any;
  var Response: any;
}

if (!globalThis.fetch) {
  globalThis.fetch = fetch;
  globalThis.Headers = Headers;
  globalThis.Request = Request;
  globalThis.Response = Response;
}
  1. 将依赖 /node_modules/langchain/dist/util/event-source-parse.cjs 文件中的 getBytes 函数改成如下代码
async function getBytes(stream, onChunk) {
    stream.on('readable', () => {
        let chunk;
        while (null !== (chunk = stream.read())) {
            onChunk(chunk);
        }
    });
}

重新编辑 VSCode 插件运行即可发现流式请求能跑通了

HNSWLib

HNSWLib 是一个内存向量存储器,可以将上下文保存到文件中,VSCode Node.js 16 环境也无法使用。

bug

看报错提示虽然是依赖没有安装,但实际翻编译后的源码发现是 dynamic import 在低版本环境不支持,我们只需换种 import 方式即可(CJS or ESM)。

import