把你自己的文档喂给大模型,回答就不再“瞎编”。下面这段 30 行代码,用 MemoryVectorStore + OpenAI Embeddings + Chat LLM,一键完成检索增强生成(RAG):
// rag-demo.mjs
import { ChatOpenAI, OpenAIEmbeddings } from "@langchain/openai";
import { MemoryVectorStore } from "langchain/vectorstores/memory";
import { RecursiveCharacterTextSplitter } from "langchain/text_splitter";
import { ChatPromptTemplate } from "@langchain/core/prompts";
import { RunnableSequence } from "@langchain/core/runnables";
import { Document } from "@langchain/core/documents";
const docs = [
new Document({ pageContent: "LangChain.js 是用于构建 LLM 应用的 JS/TS 框架,支持 RAG、Agent、工具调用与多环境运行。" }),
new Document({ pageContent: "它能在浏览器、Node.js 与 Cloudflare Workers 运行,生态成熟、文档完善、社区活跃。" }),
new Document({ pageContent: "RAG 通过向量检索,把你的业务文档变成模型的外部知识,提高准确性与可控性。" }),
];
const splitter = new RecursiveCharacterTextSplitter({ chunkSize: 200, chunkOverlap: 20 });
const splitDocs = await splitter.splitDocuments(docs);
const vectorStore = await MemoryVectorStore.fromDocuments(
splitDocs,
new OpenAIEmbeddings({ model: "text-embedding-3-small" })
);
const retriever = vectorStore.asRetriever({ k: 3 });
const llm = new ChatOpenAI({ model: "gpt-4o-mini", temperature: 0 });
const prompt = ChatPromptTemplate.fromTemplate(
`你是技术助手,只依据<context>回答用户问题,无法从中获得答案就说“我不知道”。\n<context>\n{context}\n</context>\n问题:{question}`
);
const chain = RunnableSequence.from([
{
context: async (input) => (await retriever.getRelevantDocuments(input.question))
.map(d => d.pageContent).join("\n---\n"),
question: (input) => input.question
},
prompt,
llm
]);
const res = await chain.invoke({ question: "为什么 LangChain.js 适合 JS 开发者做 RAG?" });
console.log(res.content);
本地运行
# 1) 初始化并安装
npm init -y
npm i langchain @langchain/openai
# 2) 设置环境变量(macOS/Linux)
export OPENAI_API_KEY=你的key
# 3) 运行
node rag-demo.mjs
你会得到: 一段仅依据你提供文档生成的回答,且能复用到更大的私域知识库中(只需把 docs
替换为你的 Markdown、FAQ 或导入的 PDF 文本即可)。
—
延伸阅读