最近在写一个基于 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,具体操作如下:
- 安装 node-fetch 依赖
yarn add node-fetch --save
- 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;
}
- 将依赖
/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 环境也无法使用。
看报错提示虽然是依赖没有安装,但实际翻编译后的源码发现是 dynamic import 在低版本环境不支持,我们只需换种 import 方式即可(CJS or ESM)。