告别失忆 AI:LangChain RAG + 对话记忆实战,从 0 到 1 落地

告别失忆 AI:LangChain RAG + 对话记忆实战,从 0 到 1 落地

前言

在大模型应用中,RAG(检索增强生成) 已经成为企业级知识库、智能文档问答的标配。它能让大模型读取你的私有文件(txt、docx、pdf),并基于文件内容精准回答问题,不会编造答案。

对话记忆能让 AI 记住历史对话,实现连贯的多轮问答。

今天,我用 LangChain 搭建一套:

  • 支持本地私有文档(TXT/DOCX/PDF)
  • 支持 RAG 知识库检索
  • 支持对话历史记忆
  • 可直接运行、无环境报错
    的完整智能问答系统。

一、核心功能

  1. 读取本地文档(TXT、DOCX 等)
  2. RAG 检索:从文档中精准找答案
  3. 对话记忆:记住你之前说过的话
  4. 多轮问答:上下文连贯
  5. 兼容在线大模型(通义千问/Qwen)

二、技术原理

1. RAG 原理

  • 加载文档 → 切分文本 → 向量化 → 构建检索库
  • 用户提问 → 检索相关文档片段 → 交给大模型回答

2. 对话记忆原理

大模型本身无记忆,LangChain 通过:

  • 存储历史对话
  • 每次提问自动拼接历史
  • 让模型理解上下文
    实现“记住对话”的效果。

三、环境安装

pip install langchain langchain-community langchain_openai pip install docx2txt python-docx pypdf sentence-transformers 

四、完整实战代码

# ===================== 配置 ===================== MODEL ="qwen3-max#######" BASE_URL ="https://aiapi.#######.com/qwen/v1" API_KEY ="##########" DOCX_FILE ="test.txt"# 你的文档(我是小明,今年25岁,喜欢打篮球和编程。我最喜欢的编程语言是Python。)# ====================================================from langchain_openai import ChatOpenAI from langchain_text_splitters import RecursiveCharacterTextSplitter from langchain_community.embeddings import FakeEmbeddings from langchain_community.vectorstores import DocArrayInMemorySearch from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder from langchain.chains import create_history_aware_retriever, create_retrieval_chain from langchain.chains.combine_documents import create_stuff_documents_chain import warnings from langchain_community.document_loaders import TextLoader warnings.filterwarnings('ignore')# ===================== 加载文档 =====================print("正在加载文档...") loader = TextLoader(DOCX_FILE, encoding="utf-8") documents = loader.load()# 文档切分 text_splitter = RecursiveCharacterTextSplitter(chunk_size=800, chunk_overlap=100) texts = text_splitter.split_documents(documents)# 构建轻量级向量库 embeddings = FakeEmbeddings(size=100) db = DocArrayInMemorySearch.from_documents(texts, embeddings) retriever = db.as_retriever(search_kwargs={"k":2})# ===================== 模型初始化 ===================== llm = ChatOpenAI( model=MODEL, base_url=BASE_URL, api_key=API_KEY, temperature=0.1,)# ===================== 对话记忆模板 =====================# 历史对话理解 prompt1 = ChatPromptTemplate.from_messages([("system","根据对话历史理解用户问题,不要忽略用户刚说过的内容"), MessagesPlaceholder("chat_history"),("human","{input}"),]) retriever_chain = create_history_aware_retriever(llm, retriever, prompt1)# 优先遵守用户指令 + 参考文档 prompt2 = ChatPromptTemplate.from_messages([("system","请遵守用户最新指令!如果用户修改信息,优先使用最新内容,文档仅做参考。文档内容:\n\n{context}"), MessagesPlaceholder("chat_history"),("human","{input}"),]) doc_chain = create_stuff_documents_chain(llm, prompt2) rag_chain = create_retrieval_chain(retriever_chain, doc_chain)# ===================== 记忆存储 =====================from langchain_community.chat_message_histories import ChatMessageHistory from langchain_core.runnables.history import RunnableWithMessageHistory store ={}defget_history(session_id):if session_id notin store: store[session_id]= ChatMessageHistory()return store[session_id]# 最终带记忆的RAG链 chain = RunnableWithMessageHistory( rag_chain, get_history, input_messages_key="input", history_messages_key="chat_history", output_messages_key="answer",)# ===================== 启动对话 =====================print("\n✅ 带记忆的文档问答已启动!输入 exit 退出")print("="*60)whileTrue: q =input("\n你:")if q.lower()in["exit","q"]:print("AI:结束!")break res = chain.invoke({"input": q}, config={"configurable":{"session_id":"test1"}})print("\nAI:", res["answer"])

五、运行效果展示

正在加载文档... ✅ 带记忆的文档问答已启动! 你:你是谁 AI: 我是小明,今年25岁,喜欢打篮球和编程。我最喜欢的编程语言是Python。 你:你现在叫做小红,今年30岁,喜欢java AI: 我是小红,今年30岁,喜欢打篮球、编程,最喜欢的编程语言是Java。 你:你现在是谁 AI: 我是小红,今年30岁,喜欢打篮球和编程,最喜欢的编程语言是Java。 你:你现在不喜欢篮球和编程了,你喜欢play piano AI: 我是小红,今年30岁,喜欢弹钢琴,最喜欢的编程语言是Java。 你:告诉我你是谁 AI: 我是小红,今年30岁,喜欢弹钢琴,最喜欢的编程语言是Java。 你:那小明是谁呢 AI: 小明是你最初设定的角色:25岁,喜欢打篮球和编程,最喜欢的编程语言是Python。 但现在你已经将我的身份更新为小红,所以我以小红的身份和你对话。如果你希望切换回小明,也可以告诉我哦! 

六、适用场景

  • 私有文档智能问答
  • 学习资料智能答疑
  • 企业知识库
  • 报告/论文内容检索
  • 带记忆的智能助手

Read more

彻底解决 ComfyUI Mixlab 插件 Whisper.available False 的报错

彻底解决 ComfyUI Mixlab 插件 Whisper.available False 的报错

https://github.com/MixLabPro/comfyui-mixlab-nodes 彻底解决 ComfyUI Mixlab 插件 Whisper.available False 的报错 在 ComfyUI 中安装 Mixlab Nodes 插件后,控制台显示其他节点正常,便 Whisper.available False。即使环境里安装了 openai-whisper 和 faster-whisper,问题依然可能存在。 Whisper.available False 本文将分享如何通过修改 __init__.py 进行深度 Debug,并修复 Whisper.py 中的路径逻辑漏洞。 1. 深度排查:让报错“开口说话” Mixlab 的默认日志只提示 False,不显示原因。为了抓出真凶,

告别复杂配置!Z-Image-Turbo镜像一键启动AI绘画

告别复杂配置!Z-Image-Turbo镜像一键启动AI绘画 你是不是也经历过—— 想试试最新的AI绘画工具,结果卡在第一步:下载模型要等两小时、装依赖报错十七次、配CUDA版本像解谜、最后连WebUI的端口都映射不成功? 别折腾了。今天介绍一个真正“开箱即用”的解决方案:Z-Image-Turbo镜像——阿里通义实验室开源的极速文生图模型,不用编译、不需联网、不改代码,三步启动,直接出图。 这不是概念演示,也不是简化版Demo,而是一个完整封装、生产级稳定的本地AI绘画服务。它把原本需要半天才能跑通的流程,压缩成不到两分钟的操作。下面我就带你从零开始,亲手点亮这个“即插即画”的AI画板。 1. 为什么Z-Image-Turbo值得你立刻试试? 1.1 它不是又一个“参数很大、速度很慢”的模型 Z-Image-Turbo是Z-Image的蒸馏版本,核心突破在于:用更少的计算,换更高的质量。 官方实测数据很直观: * 仅需8步采样(NFEs) 就能生成一张1024×1024高清图——主流SDXL模型通常需要30步以上; * 在H800上单图推理耗时低于0.8秒,

Whisper Large v3教育应用:语言学习辅助工具开发

Whisper Large v3教育应用:语言学习辅助工具开发 1. 引言 1.1 语言学习的技术挑战 在全球化背景下,多语言能力已成为个人发展的重要竞争力。然而,传统语言学习方式存在反馈延迟、发音纠正困难、真实语境缺乏等问题。尤其在口语训练中,学习者难以获得即时、准确的语音识别与文本对照支持,限制了语言习得效率。 近年来,深度学习驱动的自动语音识别(ASR)技术为语言教学提供了新路径。其中,OpenAI发布的Whisper系列模型凭借其强大的多语言理解能力和高精度转录表现,成为构建智能语言学习工具的理想选择。 1.2 方案概述与核心价值 本文介绍基于 Whisper Large v3 模型开发的语言学习辅助系统——“by113小贝”。该系统以Web服务形式提供99种语言的自动检测与语音转录功能,专为语言教育场景优化,具备以下核心优势: * 多语言无缝切换:无需预设语言类型,系统可自动识别输入音频语种 * 低延迟实时反馈:结合GPU加速推理,响应时间控制在15ms以内 * 双模式支持:支持原文转录与英译转写两种学习模式 * 易集成扩展:提供标准化API接口,便于

Whisper-large-v3长文本处理:万字级语音转写+智能段落划分演示

Whisper-large-v3长文本处理:万字级语音转写+智能段落划分演示 1. 这不是普通语音转文字——它能读懂万字长录音的“呼吸节奏” 你有没有试过把一场90分钟的技术分享录下来,想转成文字整理笔记,结果发现: * 普通工具卡在3分钟就报错? * 转出来的文字密不透风,全是连在一起的大段落,根本没法读? * 中英文混杂的发言,识别错一半,还得逐句核对? 这次我们实测的 Whisper-large-v3 Web 服务,直接绕开了这些坑。它不只是“把声音变成字”,而是真正理解一段长语音的语义节奏——自动识别说话人停顿、话题切换、语气转折,再把万字转录结果智能切分成逻辑清晰、可读性强的自然段落。 这不是调参炫技,而是面向真实工作流的工程优化:会议纪要、课程听讲、访谈整理、播客文稿……所有需要“听完再消化”的场景,它都能一步到位。 本文全程基于 by113小贝 二次开发的本地化部署版本,不依赖任何云端API,所有音频数据留在你自己的机器里。下面带你从零跑通万字语音转写全流程,重点看它怎么把一整段27分钟的讲座录音,变成结构分明、带时间戳、可直接复制使用的中文文稿。