30 行跑通 LangChain.js RAG(Node)

把你自己的文档喂给大模型,回答就不再“瞎编”。下面这段 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 文本即可)。


延伸阅读

<think>好的,用户现在遇到了两个问题:LangChain中USER_AGENT环境变量未设置的警告,以及WebBaseLoader被弃用的问题。我需要仔细分析这两个问题,并提供有效的解决方案。 首先,关于USER_AGENT警告,这可能是因为在使用WebBaseLoader或其他网络相关组件时,LangChain要求设置USER_AGENT,以符合网站的爬虫政策。用户需要设置这个环境变量,避免被目标网站拒绝访问。我应该给出如何设置环境变量的方法,比如在代码中直接设置或者过环境变量文件。 然后,WebBaseLoader的弃用问题。根据LangChain的更新日志,可能推荐使用其他加载器,比如AsyncHtmlLoader或PlaywrightURLLoader。需要确认替代方案,并给出示例代码。同时,用户可能需要安装额外的依赖,比如playwright,这部分也要提醒用户。 接下来,用户之前的问题是关于构建RAG系统,现在的问题可能是在文档加载部分遇到了问题。需要确保提供的解决方案与之前的代码兼容,比如替换WebBaseLoader后,其他步骤如分块、向量存储等是否需要调整。 还需要考虑用户的环境,比如是否需要安装新包,或者是否需要配置浏览器驱动(如Playwright需要安装浏览器)。在代码示例中要包含这些步骤,比如playwright install。 另外,用户可能希望了解弃用的原因以及替代方法的优势,比如AsyncHtmlLoader的异步特性提升效率,Playwright支持动态页面加载。这些信息能帮助用户更好地理解解决方案。 最后,确保回答结构清晰,分步骤说明,并提供验证方法,让用户确认问题是否解决。同时,附带相关问题,帮助用户深入理解相关主题,比如环境变量管理和处理动态内容。</think>以下是为您整理的LangChain相关问题解决方案,包含代码示例和最佳实践建议: ### 一、USER_AGENT警告解决方案 #### 1. 设置环境变量(推荐) ```python import os from langchain.document_loaders import WebBaseLoader # 设置合法的用户代理标识 os.environ["USER_AGENT"] = "Mozilla/5.0 (compatible; MyLangChainBot/1.0; +http://my-domain.com)" # 现在使用WebBaseLoader将不再产生警告 loader = WebBaseLoader(["https://example.com"]) ``` #### 2. 临时解决方案(不推荐) ```python from langchain.document_loaders import WebBaseLoader # 过headers参数直接指定 loader = WebBaseLoader( web_paths=["https://example.com"], requests_kwargs={"headers": {"User-Agent": "MyCustomAgent/1.0"}} ) ``` ### 二、WebBaseLoader弃用解决方案 #### 推荐替代方案 ```python # 安装新依赖(需先执) pip install playwright && playwright install from langchain.document_loaders import AsyncHtmlLoader # 异步加载器 from langchain.document_loaders import PlaywrightURLLoader # 支持动态页面 # 方案1:使用AsyncHtmlLoader(推荐) loader = AsyncHtmlLoader(["https://example.com"]) docs = loader.load() # 方案2:使用Playwright加载器(支持JavaScript渲染) loader = PlaywrightURLLoader( urls=["https://example.com"], remove_selectors=["header", "footer"] # 过滤无关内容 ) ``` ### 三、最佳实践组合方案 ```python import os from langchain.document_loaders import PlaywrightURLLoader from langchain.text_splitter import RecursiveCharacterTextSplitter # 1. 设置用户代理 os.environ["USER_AGENT"] = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36" # 2. 使用新版加载器 loader = PlaywrightURLLoader( urls=["https://example.com"], continue_on_failure=True, headless=True # 无头模式 ) # 3. 文档处理(带智能分块) text_splitter = RecursiveCharacterTextSplitter( chunk_size=1000, chunk_overlap=200, separators=["\n\n", "\n", "(?<=\. )", ""] ) docs = text_splitter.split_documents(loader.load()) ``` ### 四、验证方案有效性 ```python # 检查警告是否消除 import warnings with warnings.catch_warnings(): warnings.simplefilter("error") try: # 执加载操作 loader.load() except Warning as w: print(f"仍有未处理警告: {w}") ``` ### 五、版本兼容说明 | 组件 | 最低推荐版本 | 弃用版本范围 | |------------------|-------------|-------------| | WebBaseLoader | <0.0.247 | ≥0.0.248 | | PlaywrightLoader | ≥0.0.250 | - | | AsyncHtmlLoader | ≥0.0.245 | - | 建议升级到最新版本: ```bash pip install langchain --upgrade ``` --相关问题-- 1. 如何管理LangChain的环境变量配置? 2. Playwright加载器如何处理动态网页内容? 3. 文档分块策略有哪些最佳实践? 4. 如何避免网页爬取被封禁IP?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值