「从零实现 RAG:基于 LangChain 的企业级问答系统实战」

LangChain + 文档处理:构建智能文档问答系统 RAG 的实战指南 在这篇文章中,我们深入探讨了如何使用 LangChain 构建一个智能文档问答系统。文章通过实战案例,展示了如何将文档内容(如员工手册、规章制度等)从 Word 文件中提取、向量化,并存储到 FAISS 向量数据库中。通过结合 OpenAI 的 GPT 模型,我们创建了一个强大的问答系统,能够根据用户的问题从文档中检索相关信息,并生成准确的答案。本文详细介绍了文档加载、文本切分、向量化存储和智能问答的核心流程,帮助读者理解如何实现高效的文档处理和检索机制,从而在实际应用中为企业或个人提供智能化的文档管理和问 阅读详情

在大模型逐渐普及的今天,Retrieval-Augmented Generation(RAG)作为提升模型可靠性和知识覆盖的重要技术方案,越来越多地被用于企业问答、文档助手、客户支持等场景。本文将带你从 0 开始,基于 LangChain 框架,逐步实现一个可落地的 RAG 系统。

项目架构与技术选型

1.1 什么是 RAG?

RAG(Retrieval-Augmented Generation)是一种结合文档检索与大模型生成的技术架构,用于构建可控性强、知识更新灵活的问答系统。 传统的 LLM 只能回答训练数据中的知识,而 RAG 允许我们将外部文档作为上下文动态注入大模型,从而实现“开箱即问”的能力。 基本流程如下:

在这里插入图片描述

1.2 技术选型说明

技术用途
LangChain管理文档加载、文本分块、嵌入生成等流程
OpenAI Embeddings将文本向量化为高维语义向量
MemoryVectorStoreLangChain 提供的轻量级内存向量数据库,适合原型,小规模任务和本地开发
OpenAI GPT (gpt-3.5 / gpt-4)语言生成模型,用于回答问题

使用 JavaScript 实现 RAG 系统

为什么选择 JavaScript 实现 RAG?

在 LangChain 最初的开发中,Python 是主流语言,很多功能模块(如 Embeddings、Retrieval、Chains)首先在 Python 端推出。但随着 LangChain.js 的发展,现在我们可以完全用 JavaScript/TypeScript 构建一个完整的 RAG 应用,并具备以下优势:

理由描述
前端/全栈友好如果你是前端或全栈开发者,JS/TS 是你熟悉的技术栈,无需切换语言
服务端一体化可以直接将 LLM 接入集成到 Node.js 服务(如 Express)中,部署方便
生态兼容性强能方便集成现有的 JS 库,如文件上传、数据库、前端组件库
支持 Edge Function可部署到 Vercel/Cloudflare 等平台,实现无服务器的轻量推理服务

2.3 本章目标

我们将在本章完成以下内容:

  • 文档加载与分块(Text Split)
  • 向量生成(OpenAIEmbeddings)
  • 存储至 MemoryVectorStore
  • 编写简洁的检索函数供后续生成使用

你需要准备:

  • Node.js 环境(建议版本 ≥ 18)
  • OpenAI API Key(保存在 .env 文件中)
  • 示例文档:比如 google服务文档

2.4 完整流程图

在这里插入图片描述

具体实现

1. 搭建一个LangGraph Server

通过脚手架可以直接创建一个LangGraph app,减少之前繁琐步骤

1. Install the LangGraph CLI
sh体验AI代码助手代码解读复制代码npx @langchain/langgraph-cli@latest

# Or install globally, will be available as `langgraphjs`

npm install -g @langchain/langgraph-cli
2. Create a LangGraph App
sh体验AI代码助手代码解读复制代码npm create langgraph
3.Install Dependencies
sh体验AI代码助手代码解读复制代码cd your-repo
yarn
4. Create a .env file
sh体验AI代码助手代码解读复制代码LANGSMITH_API_KEY=lsv2...
TAVILY_API_KEY=tvly-... // jump to https://app.tavily.com/home
OPENAI_API_KEY=sk-...

如何申请LANG SMITH API KEY

  • jump to smith.langchain.com/
  • 点击右上侧的developer button
  • 点击左边的API KEY则就可以申请了

在这里插入图片描述

如何得到OPENAI API KEY

访问 zzz-api,之前有提供免费的API_KEY,现在好像没有了,本文只是提供一个link链接关于,如果申请OPENAI API KEY在国内,不能保证如果你充钱之后的后续服务。望谨慎充钱。(Deepseek不支持generating embeddings,所以本次案例不能采用deepseek来做展示)

2. 具体实现
1. 创建一个state

在使用 LangGraph 构建基于节点的数据流图时,State(状态) 是核心概念之一。它定义了图中所有节点和边之间通信使用的共享上下文信息。理解并正确使用 State 是设计可靠 LangGraph 流程的关键。

什么是 State?

State 就是图的共享上下文,是每个 Node(节点)读写数据的“中心”。

每一个节点都会:

  • 读取当前的 State
  • 返回对 State 的局部更新

这些更新会通过 State 中定义的 Reducer 函数 应用到现有状态上。

如何定义 State?

通过 Annotation.Root() 定义一个 Annotation 对象,用于声明 State 的 schema(结构)。

ts体验AI代码助手代码解读复制代码import { Annotation } from "@langchain/langgraph";

const StateAnnotation = Annotation.Root({
  foo: Annotation<string>,
  bar: Annotation<number>,
});

Reducer:状态更新规则

  • 每个 key 可以附加一个 reducer 函数,控制如何处理节点返回的更新。
  • 如果不定义,默认是直接 覆盖(override) 原值。
  • 你可以自定义 reducer,比如对数组进行追加:
ts体验AI代码助手代码解读复制代码const StateAnnotation = Annotation.Root({
  messages: Annotation<string[]>({
    reducer: (state, update) => state.concat(update),
    default: () => [],
  }),
});

多 Schema 管理(Input / Output / Internal) LangGraph 支持为图定义多个 schema:

类型 用途

类型用途
InputAnnotation输入 schema
OutputAnnotation输出 schema
OverallAnnotation运行时的完整内部状态

这种分离可以让你:

  • 在输入中只传入一部分状态(如 user_input)
  • 在输出中只提取部分结果(如 graph_output)
  • 在中间节点中处理完整状态

Graph 中的 State 是如何工作的?

  1. 每个节点读取一份当前 State 的 快照。
  2. 节点返回一个“局部更新对象”。
  3. Graph 自动将这些更新合并回 State: 如果 key 有 reducer,使用 reducer 处理 否则使用默认覆盖方式

消息(Messages)作为 State 在对话类系统中,一个常见模式是将历史消息作为 State 的一部分。

LangGraph 提供了内置的 messagesStateReducer 和 MessagesAnnotation 来支持这种模式:

ts体验AI代码助手代码解读复制代码import { MessagesAnnotation } from "@langchain/langgraph";

const graph = new StateGraph(MessagesAnnotation);

相当于:

ts体验AI代码助手代码解读复制代码import { Annotation, messagesStateReducer } from "@langchain/langgraph";

const StateAnnotation = Annotation.Root({
  messages: Annotation<BaseMessage[]>({
    reducer: messagesStateReducer,
    default: () => [],
  }),
});

在本次的教程中,使用了定制化的reducer:

ts体验AI代码助手代码解读复制代码export const GraphState = Annotation.Root({
  messages: Annotation<BaseMessage[]>({
    reducer: (x, y) => x.concat(y),
    default: () => [],
  }),
});

2.构建基于 MemoryVectorStore 的检索工具节点(ToolNode)

在本节中,我们使用 JavaScript + LangChain 构建一个完整的文档检索组件。整个流程包括:

  1. 加载网页文档
  2. 文本分块(chunking)
  3. 构建向量数据库
  4. 构建 retriever 工具
  5. 集成为 ToolNode 节点
第一步:加载网页内容为文档
ts体验AI代码助手代码解读复制代码const urls = ["https://policies.google.com/terms?hl=zh-CN"];

const docs = await Promise.all(
  urls.map((url) => new CheerioWebBaseLoader(url).load()),
);
const docsList = docs.flat();

我们使用 CheerioWebBaseLoader 将网页内容抓取下来并转为 LangChain 文档对象。Promise.all 支持并发加载多个 URL,.flat() 将嵌套数组合并成单一文档列表。

第二步:对文档进行文本切块
ts体验AI代码助手代码解读复制代码const textSplitter = new RecursiveCharacterTextSplitter({
  chunkSize: 500,
  chunkOverlap: 50,
});
const docSplits = await textSplitter.splitDocuments(docsList);

长文本不适合直接用于嵌入,因此我们使用 RecursiveCharacterTextSplitter 将内容按 500 字符一块进行分割,并设置 50 字符重叠,保证语义连贯。

第三步:构建向量数据库(MemoryVectorStore)
ts体验AI代码助手代码解读复制代码const vectorStore = await MemoryVectorStore.fromDocuments(
  docSplits,
  new OpenAIEmbeddings({
    configuration: {
      baseURL: "https://api.chatanywhere.tech/v1", //需要更改 Open AI base URL
    },
  }),
);

我们使用 OpenAIEmbeddings 将文本块转为向量,并存入内存型向量数据库 MemoryVectorStore 中。此方式适合开发调试或轻量化场景,不依赖外部服务如 FAISS。

第四步:构建 Retriever 工具
ts体验AI代码助手代码解读复制代码const retriever = vectorStore.asRetriever();
const tool = createRetrieverTool(retriever, {
  name: "retrieve_blog_posts",
  description:
    "Search and return information about Lilian Weng blog posts on LLM agents, prompt engineering, and adversarial attacks on LLMs.",
});

通过 createRetrieverTool 包装 Retriever,我们定义了一个结构化的工具,可供 Agent 调用。工具名称与描述信息将用于后续 LLM 选择工具时的参考依据。

第五步:构建 ToolNode 节点
ts体验AI代码助手代码解读复制代码export const tools = [tool];
export const toolNode = new ToolNode<typeof GraphState.State>(tools);

最终我们将工具包装为一个 ToolNode 节点,用于插入到 LangGraph 中执行调用流程。该节点将在运行时被 LLM 激活,并返回与问题相关的文档片段。

3. 构建 RAG 推理流程中的 LangGraph 节点函数

这一段代码是构建基于 LangGraph 的 Retrieval-Augmented Generation(RAG)流程的核心逻辑模块。它定义了多个节点函数,处理从用户提问、问题改写、文档检索、文档打分、判断是否继续检索,到最终生成答案的整个闭环流程。

shouldRetrieve:判断是否触发工具调用
ts体验AI代码助手代码解读复制代码function shouldRetrieve(state: typeof GraphState.State): string {
  const { messages } = state;
  const lastMessage = messages[messages.length - 1];

  if (
    "tool_calls" in lastMessage &&
    Array.isArray(lastMessage.tool_calls) &&
    lastMessage.tool_calls.length
  ) {
    return "retrieve";
  }
  return END;
}

这是一个决策节点:如果上一条消息包含工具调用(如调用了 retriever 工具),流程继续(返回 “retrieve”);否则返回 END,流程终止。

gradeDocuments:判断检索结果是否相关
ts体验AI代码助手代码解读复制代码async function gradeDocuments(state: typeof GraphState.State) {
  const tool = {
    name: "give_relevance_score",
    description: "Give a relevance score to the retrieved documents.",
    schema: z.object({
      binaryScore: z.string().describe("Relevance score 'yes' or 'no'"),
    }),
  };

  const prompt = ChatPromptTemplate.fromTemplate(`
    You are a grader assessing relevance of retrieved docs to a user question.
    ...
    Give a binary score 'yes' or 'no' ...
  `);

  const model = new ChatOpenAI({ ... }).bindTools([tool], {
    tool_choice: tool.name,
  });

  const chain = prompt.pipe(model);
  const lastMessage = state.messages[state.messages.length - 1];

  const score = await chain.invoke({
    question: state.messages[0].content,
    context: lastMessage.content,
  });

  return { messages: [score] };
}

该函数用于打分检索结果是否与用户问题相关。它将检索到的文档传入 ChatPromptTemplate,通过一个预定义工具(give_relevance_score)返回 yes/no。

checkRelevance:根据评分判断是否继续
ts体验AI代码助手代码解读复制代码function checkRelevance(state: typeof GraphState.State): string {
  const lastMessage = state.messages[state.messages.length - 1];
  const toolCalls = (lastMessage as AIMessage).tool_calls;
  if (toolCalls[0].args.binaryScore === "yes") {
    return "yes";
  }
  return "no";
}

这个节点判断打分结果,如果 binaryScore 是 yes,说明文档相关,可以继续;否则重新改写问题再尝试检索。

agent:调用带工具的 LLM 执行决策
ts体验AI代码助手代码解读复制代码async function agent(state: typeof GraphState.State) {
  const filteredMessages = state.messages.filter((msg) => {
    if ("tool_calls" in msg) {
      return msg.tool_calls[0].name !== "give_relevance_score";
    }
    return true;
  });

  const model = new ChatOpenAI({ ... }).bindTools(tools);
  const response = await model.invoke(filteredMessages);

  return { messages: [response] };
}

这是 LLM 决策节点,调用带有工具调用能力的 LLM,根据上下文决定是否触发 retriever 工具。此处会过滤掉评分工具调用信息,避免影响模型判断

rewrite:改写不清晰的问题
ts体验AI代码助手代码解读复制代码async function rewrite(state: typeof GraphState.State) {
  const question = state.messages[0].content;
  const prompt = ChatPromptTemplate.fromTemplate(`
    Look at the input and try to reason about the underlying semantic intent ...
    Formulate an improved question:
  `);

  const model = new ChatOpenAI({ ... });
  const response = await prompt.pipe(model).invoke({ question });

  return { messages: [response] };
}

该节点用于处理不相关或语义模糊的用户提问。它使用 LLM 对原问题进行语义增强和重写,从而提高检索效果。

generate:基于文档生成最终答案
ts体验AI代码助手代码解读复制代码async function generate(state: typeof GraphState.State) {
  const question = state.messages[0].content;
  const lastToolMessage = state.messages
    .slice()
    .reverse()
    .find((msg) => msg._getType() === "tool");

  const docs = lastToolMessage.content;
  const prompt = await pull<ChatPromptTemplate>("rlm/rag-prompt");

  const llm = new ChatOpenAI({ ... });
  const ragChain = prompt.pipe(llm);
  const response = await ragChain.invoke({ context: docs, question });

  return { messages: [response] };
}

这是最后一步:基于之前的检索结果生成最终答案。它拉取了一个 RAG Prompt 模板(rlm/rag-prompt),填入上下文文档和用户问题,并返回 LLM 的响应。

构建 LangGraph 工作流主图:RAG 推理流程图

这段代码基于 @langchain/langgraph 构建了一个带条件分支的推理流程图。整个图负责 orchestrate 多步操作,从提问到文档检索、改写、判断、最终生成回答。

依赖导入
ts体验AI代码助手代码解读复制代码import { END, StateGraph, START } from "@langchain/langgraph";
import { GraphState } from "./state.js";
import {
  agent,
  gradeDocuments,
  rewrite,
  generate,
  shouldRetrieve,
  checkRelevance,
} from "./edges.js";
import { toolNode } from "./retriever.js";

  • StateGraph:核心图结构构造器。
  • START / END:特殊标识起点和终点。
  • GraphState:定义状态结构(上下文信息如 messages)。
  • edges:RAG 流程中每个节点的处理逻辑。
  • toolNode:实际执行文档检索的节点(如调用向量数据库)。
创建图结构并添加节点
ts体验AI代码助手代码解读复制代码const workflow = new StateGraph(GraphState)
  .addNode("agent", agent)
  .addNode("retrieve", toolNode)
  .addNode("gradeDocuments", gradeDocuments)
  .addNode("rewrite", rewrite)
  .addNode("generate", generate);

在 StateGraph 中注册流程节点:

  • agent:调用带工具能力的 LLM。
  • retrieve:执行检索操作。
  • gradeDocuments:给检索文档评分。
  • rewrite:改写不相关的问题。
  • generate:最终回答生成。
定义执行路径:从 START 到 agent
ts体验AI代码助手代码解读复制代码workflow.addEdge(START, "agent");

流程从起点开始,首先调用 agent 节点生成思考结果。

判断是否需要检索
ts体验AI代码助手代码解读复制代码workflow.addConditionalEdges("agent", shouldRetrieve);

shouldRetrieve 是一个决策函数:

  • 返回 “retrieve”:进入 retrieve 检索节点。
  • 返回 END:直接结束。
检索后打分
ts体验AI代码助手代码解读复制代码workflow.addEdge("retrieve", "gradeDocuments");

文档检索后,会执行 gradeDocuments,评估其与问题的相关性。

判断文档是否足够好
php体验AI代码助手代码解读复制代码workflow.addConditionalEdges(
  "gradeDocuments",
  checkRelevance,
  {
    yes: "generate",
    no: "rewrite",
  },
);

如果 checkRelevance 返回 yes:文档质量高,进入 generate。 否则进入 rewrite 节点,重新改写问题再回到 agent。

终点和回环逻辑
ts体验AI代码助手代码解读复制代码workflow.addEdge("generate", END);
workflow.addEdge("rewrite", "agent");

generate 后结束整个流程。 改写后的问题再次进入 agent,形成循环,直到找到相关答案。

编译工作流
ts体验AI代码助手代码解读复制代码export const graph = workflow.compile();

最终导出编译好的 graph,可直接通过 .invoke() 调用执行。这个图可以被用作 LangGraph 多轮推理系统的主逻辑控制器。

以上就是全部code实现,想要访问阅览完整代码,请点击这里。

实现效果展示

在这里插入图片描述

如何零基础入门 / 学习AI大模型?

大模型时代,火爆出圈的LLM大模型让程序员们开始重新评估自己的本领。 “AI会取代那些行业?”“谁的饭碗又将不保了?”等问题热议不断。

不如成为「掌握AI工具的技术人」,毕竟AI时代,谁先尝试,谁就能占得先机!

想正式转到一些新兴的 AI 行业,不仅需要系统的学习AI大模型。同时也要跟已有的技能结合,辅助编程提效,或上手实操应用,增加自己的职场竞争力。

但是LLM相关的内容很多,现在网上的老课程老教材关于LLM又太少。所以现在小白入门就只能靠自学,学习成本和门槛很高

那么我作为一名热心肠的互联网老兵,我意识到有很多经验和知识值得分享给大家,希望可以帮助到更多学习大模型的人!至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

这份完整版的大模型 AI 学习资料已经上传优快云,朋友们如果需要可以微信扫描下方优快云官方认证二维码免费领取【保证100%免费】

👉 福利来袭优快云大礼包:《2025最全AI大模型学习资源包》免费分享,安全可点 👈

全套AGI大模型学习大纲+路线

AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!

read-normal-img

640套AI大模型报告合集

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

👉学会后的收获:👈
• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;

• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;

• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;

• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。

👉 福利来袭优快云大礼包:《2025最全AI大模型学习资源包》免费分享,安全可点 👈

img

这份完整版的大模型 AI 学习资料已经上传优快云,朋友们如果需要可以微信扫描下方优快云官方认证二维码免费领取【保证100%免费】

作为普通人,入局大模型时代需要持续学习和实践,不断提高自己的技能和认知水平,同时也需要有责任感和伦理意识,为人工智能的健康发展贡献力量。

Ollama 可以在 Windows 上运行了 阅读详情

相关推荐

DeepSeek本地部署详细指南

通过上述步骤,你可以在本地成功部署DeepSeek模型,并通过Ollama或Open Web UI与模型进行交互。本地部署不仅能够保护数据隐私,还能根据需求灵活调整模型参数,满足不同场景下的使用需求。如果你在部署过程中遇到任何问题,可以在评论区留言,我们将一起解决。希望这篇教程能帮助你顺利部署DeepSeek模型,开启高效开发的新旅程!

m0_56896669的博客 14万+

一文彻底整明白,基于Ollama工具的LLM大语言模型Web可视化对话机器人部署指南

在上一篇博文中,我们在本地部署了**Llama 3 8B**参数大模型,并用 Python 写了一个控制台对话客户端,基本能愉快的与 Llama 大模型对话聊天了。但控制台总归太技术化,体验不是很友好,我们希望能有个类似 ChatGPT 那样的 Web 聊天对话界面,本博文就安排起来……

老牛啊 1万+

基于 RAG 和 LangChain 的 PDF 问答系统——ChatPDF

这篇文章用来介绍如何使用 RAG 技术与 LangChain 框架创建一个基于 PDF 文件的问答系统。 之前在《阿里云百炼构建私有知识问答应用》中构建了基于本地知识库的医疗智能体应用,构建过程为黑盒,本文以代码形式展示基于 PDF 文档的白盒问答系统。

2301_81658352的博客 2254

使用ollama在本地部署llama3-8b大模型

使用ollama在本地部署llama3-8b大模型

weixin_39945822的博客 1万+

用 LangChain4j 从零实现 RAG:基于 PDF 文档的智能问答系统

在大语言模型时代,让 AI 能够理解并基于本地文档回答问题的 RAG(检索增强生成)技术成为热门。本文将结合实际代码,详细介绍如何使用 LangChain4j 框架快速实现一个基于 PDF 文档的 RAG 系统,让 AI 能够 "读懂" 你的本地文档并精准回答相关问题。

weixin_63583875的博客 1702

使用Elasticsearch实现RAG:基于LangChain的智能检索问答系统

本文介绍了如何使用Elasticsearch和LangChain实现Retrieval-Augmented Generation智能问答系统。希望这篇文章能帮助您理解RAG架构和实现。Elasticsearch官方文档。

sjufgwgfhoia的博客 1426

Web开发者实战LangChain RAG:构建企业级知识库问答系统

在Web开发中,我们熟悉“数据 → 处理 → 展示”的经典流程:从前端表单收集用户输入,后端查询数据库,再将结果渲染成页面。而如今,当企业希望用自然语言查询内部文档(如产品手册、技术规范、HR政策),这套逻辑依然成立——只是“数据库”换成了向量数据库,“SQL查询”换成了语义搜索。 这就是 RAG(Retrieval-Augmented Generation) 的核心思想: 先从海量文档中检索出与问题最相关的片段,再将这些片段作为上下文喂给大模型,生成精准回答。对于Web开发者而言,RAG 并非全新

沛哥儿的专栏 1931

[从零开始在LangChain中使用RAG-Pinecone实现强大问答系统]

本文介绍了如何在LangChain中使用RAG-Pinecone来增强问答系统。结合Pinecone的高效向量存储与OpenAI强大的生成能力,您可以构建一个能力强大的智能系统。Pinecone 官方文档OpenAI API 参考LangChain GitHub 仓库。

mmlihaio的博客 1021

基于LangChain构建高效RAG问答系统:向量检索与LLM集成实战

本文详细介绍了使用LangChain框架构建RAG问答系统的全流程。首先配置向量检索环境,包括Redis向量数据库和DashScope嵌入模型;然后设计提示模板整合检索结果与用户问题;接着调用通义千问模型生成基于上下文的回答;最后通过LangChain链式处理实现端到端问答流程。该系统有效结合了向量检索的准确性和大语言模型的生成能力,适用于企业知识问答等场景,避免了模型幻觉问题,同时具备良好的可扩展性和灵活性。

一次次探索代码无限可能的旅程,专注于前端、后端、服务器及AI大模型的分享和交流。与我一起踏上这段无尽的技术之旅吧! 3931

基于LangChain和Streamlit构建RAG问答系统详解

基于LangChain和Streamlit构建RAG问答系统详解

wyw0000的博客 1264

LangChain4j RAG 实战指南:用 Java 构建企业级智能文档问答系统

向量是将文本转换成的数字数组,语义相似的文本,向量也相似。文本 → 向量(简化示例,实际有 1536 维)"公司的年假政策" → [0.12, -0.34, 0.56, 0.78, ...]"年假有多少天" → [0.11, -0.33, 0.55, 0.77, ...] ← 向量很接近!"今天天气不错" → [0.89, 0.23, -0.67, 0.45, ...] ← 向量差别大"请假流程是什么" → [0.15, -0.31, 0.52, 0.75, ...] ← 向量也很接近。

一起修行,不孤单。这里有编程语言、开发工具、学习方法论和踩坑笔记。用简单的话说复杂的事,陪你从小白到进阶。周更干货,欢迎一起成长! 403

从 0 到 1 构建高效 RAG 问答系统:LangChain+Ollama+Chroma 实战指南

组件优势适用场景Ollama本地部署、模型丰富中小型企业 / 个人开发者Chroma轻量级、支持 HTTP 接口快速原型开发LangChain标准化组件、生态完善复杂 RAG 系统开发。

佑瞻的博客 2353

LLM的MCP协议:初识MCP,搭建第一个MCP Server

MCP(Model Context Protocol),是一个开发的协议,标准化了应用程序如何为大模型提供上下文。MCP提供了一个标准的为LLM提供数据、工具的方式,使用MCP会更容易的构建Agent或者是基于LLM的复杂工作流。

Criss@陈磊 2万+

LangChain入门教程:打造你的首个企业级文档问答系统(RAG模式)

RAG技术构建企业知识对话访问层,突破LLM知识局限。摘要:RAG通过"检索+生成"模式,将LLM与企业私有知识库动态绑定,解决LLM知识过时和无法访问私有数据的问题。核心架构分为知识库构建(文档加载、清洗、切分、嵌入、存储)和实时问答(问题嵌入、相似检索、Prompt构造、LLM生成)两阶段。LangChain可实现最小可用RAG系统,企业级应用需考虑文档批处理、向量数据库选型(FAISS/Chroma/Qdrant等)及优化策略(切块、Prompt构造、增量更新)。RAG应用发展经历

m0_74942241的博客 1417

Cursor AI对话历史丢失?开源工具一键恢复项目聊天记录

在软件开发中,数据持久化与工作区管理是保障开发效率与上下文连续性的基础技术。其核心原理在于通过文件系统路径、数据库存储等机制,将应用状态与用户数据持久化关联。对于依赖AI辅助编程的开发者而言,对话历史是宝贵的项目上下文资产,记录了关键的算法思路、API使用范例和问题解决方案。然而,当开发工具(如基于VS Code的Cursor)采用基于项目绝对路径的工作区隔离机制时,项目路径的变更会导致历史对话看似“丢失”,实则是被隔离在了旧路径对应的数据沙箱中。这直接影响了开发体验与知识沉淀的效率。cursor-chat

weixin_26775679的博客 828

YOLOv8中Anchor-Based、Anchor-Free及样本分配策略

本文主要介绍yolov8中的anchor机制与样本分配策略的静态策略和动态策略

qq_52889317的博客 2211

Langchain实现一个简单RAG!

RAG(Retrieval-Augmented Generation,检索增强生成) 是一种结合检索系统和生成式大语言模型的问答方法。它能有效缓解大模型“遗忘”和“幻觉”问题,提升回答的准确性与可靠性。本文使用langchain+Ollama本地调用大模型来构建了一个本地运行的 RAG 系统,适合新手入门。

weixin_45700352的博客 2037

Kali Linux实战:Aircrack-ng破解Wi-Fi密码的完整流程与常见问题解决

本文详细介绍了在Kali Linux中使用Aircrack-ng套件进行Wi-Fi密码破解的完整流程,包括环境准备、无线网卡配置、网络扫描、握手包捕获与字典破解等关键步骤。同时针对无线网卡不支持监听模式、无法捕获握手包等常见问题提供了实用解决方案,帮助安全研究人员有效评估无线网络安全性。

weixin_29323049的博客 296

基于 OpenVINO™ 和 LangChain 构建RAG问答系统

在医疗、工业等领域,行业知识库的构建已经成为了一个普遍需求,通过LLM与OpenVINO™的加持,我们可以让用户对于知识库的查询变得更加精准与高效,带来更加友好的交互体验。

英特尔开发人员专区 6790

【乐企】有关乐企能力测试接口对接-基础版(详细)

乐企能力测试接口对接详细代码以及步骤

九七的博客 7663

深度解析:C# Modbus TCP协议解析与异常处理(工控上位机必备)

协议解析要精准:掌握MBAP头和PDU的结构,尤其是常用功能码的请求/响应格式,避免因字节处理错误导致通信失败;异常处理要全面:覆盖通信层、协议层、数据层的所有异常类型,针对工业场景制定重试、重连、滤波等策略;资源管理要规范:使用释放资源,采用连接池复用连接,避免端口泄露;工业场景要适配:结合工控现场的特点(网络波动、电磁干扰、设备忙),优化通信效率和数据处理逻辑。通过以上解析和策略,可确保C#上位机与工业设备的Modbus TCP通信具备高稳定性、高可靠性、高容错性,满足工控领域的严苛要求。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 997

从零搭建企业级RAG知识库问答系统_从零开始构建企业级rag系统

等任务。

python123456_的博客 1442

Panda3d 场景管理

许多简单的 3D 引擎维护一个 3D 模型列表,然后在每一帧对这些模型进行渲染。在这些简单的引擎中,必须分配一个3D模型(或从磁盘加载它),然后将其插入到要渲染的模型列表中。模型在插入到列表中之前对渲染器不“可见”。 Panda3D稍微复杂一些。它不是维护要呈现的对象列表,而是维护要呈现的对象树。对象在插入树之前对渲染器不可见。

u014077947的博客 1383

【收藏必备】零基础掌握RAG:企业级文档问答系统构建实战指南

本文介绍了检索增强生成(RAG)技术的基本原理和应用场景,重点讲解了RAG流程的四个关键环节:文档加载、切分、向量化存储和相似度检索。通过使用Ollama和Langchain框架,文章提供了构建企业级文档问答系统的完整代码实现,包括环境准备、文档处理、向量化存储及问答系统搭建。该技术可有效解决大语言模型的知识陈旧、幻觉问题,适用于企业内部知识库和联网搜索问答两类场景。文中还包含代码版本信息、数据准备说明和具体实现步骤,为开发者提供了实用的技术参考。

ytt0523_com的博客 1393

FC7300 Clock介绍

FC7300的时钟架构包括一个高级时钟图和内部时钟需求。它有5个CMU,使用SIRC监控FIRC/SOSC/FOSC,并使用FIRC监控SIRC。此外,CMU4还使用FOSC监Slow Clock。

舊梦的博客 327

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

上一篇: 2025 AI大模型报告 | 《中国数字人发展报告(2024)》(附PDF免费下载)
下一篇: 用 Vue3 + Node.js + RAG 构建 Al 讲义问答系统(接入豆包大模型)
AI大模型_学习君
博客等级 码龄3年 6137粉丝 551原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值