当前位置:

首页 > 编程开发 > LangChain 实现 PDF 聊天机器人记忆功能

LangChain 实现 PDF 聊天机器人记忆功能

本文详解如何基于LangChain+FastAPI构建支持上下文感知的PDF智能问答系统,重点解决“无法记住历史提问”问题,通过ConversationBufferMemory实现真正的多轮对话连贯性。

本文详解如何基于 LangChain + FastAPI 构建支持上下文感知的 PDF 智能问答系统,重点解决“无法记住历史提问”问题,通过 ConversationBufferMemory 实现真正的多轮对话连贯性。

本文详解如何基于 LangChain + FastAPI 构建支持上下文感知的 PDF 智能问答系统,重点解决“无法记住历史提问”问题,通过 ConversationBufferMemory 实现真正的多轮对话连贯性。

在构建 PDF 智能问答服务时,一个常见痛点是:单次提问能返回准确答案,但后续追问(如“它提到的日期是多少?”、“这个结论的依据是什么?”)却无法关联前文——系统“失忆”了。根本原因在于原始代码中每次调用 /process/ 都新建独立链(RetrievalQA),未共享对话状态。解决方案不是简单启用 memory 参数,而是将 ConversationBufferMemory 与 load_qa_chain 深度集成,并配合自定义 Prompt 模板显式注入聊天历史。

✅ 正确实现多轮记忆的关键步骤

  1. 全局初始化内存实例(非每次请求新建)

    memory = ConversationBufferMemory(
        memory_key="chat_history", 
        input_key="human_input",
        return_messages=True  # 返回 Message 对象而非字符串,兼容新版 LangChain
    )

    ⚠️ 注意:必须声明为模块级变量(如 global memory 或使用依赖注入),否则每次请求都会重置。

  2. 构造带历史上下文的 Prompt 模板
    模板需明确预留 {chat_history} 占位符,并确保其位置在问题之前,让 LLM 理解对话流:

    template = """You are a helpful assistant answering questions about a document.
    
    Context from document:
    {context}
    
    Previous conversation:
    {chat_history}
    
    Human: {human_input}
    Assistant:"""
    prompt = PromptTemplate(
        input_variables=["chat_history", "human_input", "context"],
        template=template
    )
  3. 使用 load_qa_chain 并传入 memory 和 prompt
    替代已弃用的 ConversationalRetrievalChain(v0.1+ 中行为不稳定):

    chain = load_qa_chain(
        llm=OpenAI(temperature=0.0),
        chain_type="stuff",
        memory=memory,
        prompt=prompt
    )
    response = chain.invoke({
        "input_documents": docs,
        "human_input": question
    }, return_only_outputs=True)

? 完整工作流程示例

假设用户上传一份《2023 年公司年报.pdf》,随后发起以下对话:

  • Q1: “公司去年营收是多少?” → 返回 “¥1.2B”
  • Q2: “同比增长多少?” → 模型结合 chat_history 中的“去年营收 ¥1.2B”及文档中“2022 年营收 ¥1.0B”,正确回答 “20%”

这依赖于 memory 自动将 Q1 的问答对存入 chat_history,并在 Q2 请求时通过 Prompt 注入上下文。

⚠️ 重要注意事项

  • 避免 global vector_store 的线程安全风险:生产环境应改用依赖注入或缓存服务(如 Redis)存储向量库,当前代码仅适用于单用户本地测试。
  • return_messages=True 是关键:LangChain v0.1+ 要求 memory 返回 BaseMessage 列表(如 AIMessage, HumanMessage),否则 Prompt 渲染失败。
  • Embedding 与 LLM 的一致性:确保 OpenAIEmbeddings() 与 OpenAI() 使用相同模型(如 text-embedding-3-small + gpt-3.5-turbo),避免语义空间错位。
  • 调试技巧:打印 memory.load_memory_variables({}) 可实时查看当前存储的对话历史。

✅ 总结

实现 PDF 多轮问答的核心不在于“加个 memory”,而在于三者协同:
① 全局可复用的 ConversationBufferMemory 实例;
② 显式包含 {chat_history} 占位符的 Prompt 模板;
③ 使用 load_qa_chain(而非 RetrievalQA)并正确传递 memory 和 prompt。

如此,你的 FastAPI 后端即可像人类一样“记住上一句”,真正理解 follow-up 问题中的指代与隐含前提。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
作者最新文章
编程开发
相关文章 更多
git解决代码冲突的详细步骤与操作方法
git解决代码冲突的详细步骤与操作方法

遇到Git合并冲突别慌张,本文详解冲突产生的原因及标准处理流程,涵盖查看冲突文件、理解标记含义、手动修改代码及完成合并提交的完整步骤,助你高效解决协作开发中的代码冲突问题。

Java获取当前时间戳:System.currentTimeMillis与Instant对比
Java获取当前时间戳:System.currentTimeMillis与Instant对比

深入对比Java中获取当前时间戳的两种主流方式:System.currentTimeMillis与java.time.Instant。分析二者的精度差异、API设计、时钟回拨影响与实际选型建议。

大数据开发语言选型:Java对比Scala与Python的优缺点及适用场景
大数据开发语言选型:Java对比Scala与Python的优缺点及适用场景

针对大数据工程场景,系统对比Java、Scala与Python在执行性能、生态结合、开发效率和维护成本上的核心差异,给出清晰的架构选型依据与落地方案。

Java常量命名规范与接口常量反模式最佳实践
Java常量命名规范与接口常量反模式最佳实践

深入解析Java常量命名标准、大写下划线语义规则,剖析接口常量反模式的危害与本质原因,并提供枚举、不可实例化常量工具类等工业级最佳替代方案。

c语言段错误处理方法及排查解决步骤
c语言段错误处理方法及排查解决步骤

针对C语言常见的段错误(Segmentation fault)问题,详细剖析内存非法访问根因,提供结合GDB、Core Dump与AddressSanitizer的标准化排查解决步骤与预防方法。

windsurf开发工具安装与使用详细教程
windsurf开发工具安装与使用详细教程

本文提供全面的Windsurf开发工具安装与使用详细教程,覆盖客户端下载安装、环境配置与VS Code插件迁移、Cascade核心协作中枢使用技巧、Chat与Write双模式实战及高效开发规范。

Flutter状态管理框架有哪些?常用框架选择指南
Flutter状态管理框架有哪些?常用框架选择指南

全面盘点Flutter主流状态管理框架,深度解析Provider、Riverpod、Bloc与GetX的核心机制、优缺点及适用场景,提供系统化的状态管理选型指南。

Java抽象方法修饰符限制:为何不能用private或static
Java抽象方法修饰符限制:为何不能用private或static

深入剖析Java中抽象方法为何严禁使用private和static修饰符。从面向对象契约规范、方法继承重写、JVM动态绑定(invokevirtual)与静态解析(invokestatic)等底层机制展开详细推导,结合编译报错示例与全景对比,彻底理清修饰符限制背后的设计逻辑。

tomcat启动失败的原因和解决办法详解
tomcat启动失败的原因和解决办法详解

详细分析 Tomcat 启动失败的常见原因,并提供可操作的排查和解决方案。

uniapp网络请求拦截怎么设置及配置方法
uniapp网络请求拦截怎么设置及配置方法

详细讲解uni-app中网络请求拦截的配置方法与实现路径,包含uni.addInterceptor原生API拦截与Promise二次封装方案、Token注入、全局错误处理及踩坑提醒。

查看更多
精品专题 更多
装机必备
装机必备

正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

Windows
Windows

正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

PDF教程
PDF教程

正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

Mac软件 更多
IntelliJ IDEA macOS版
IntelliJ IDEA macOS版
Mac

IntelliJ IDEA 是 JetBrains 推出的专业集成开发环境,重点服务于 Java、Kotlin 与 JVM 项目开发。软件集成代码补全、静态检查、重构、调试、测试、版本控制及构建工具,并可借助插件扩展语言和框架支持。

PyCharm macOS版
PyCharm macOS版
Mac

JetBrains PyCharm 是面向 Python 开发者的集成开发环境,提供智能补全、代码检查、重构、调试、测试、版本控制及虚拟环境管理功能。Mac 版兼容 Intel 与 Apple 芯片,核心功能可免费使用。

WebStorm macOS版
WebStorm macOS版
Mac

JetBrains WebStorm 是面向 JavaScript、TypeScript 和现代 Web 技术的专业集成开发环境,可智能理解项目结构,提供代码补全、重构、错误检查、运行调试、测试及 Git 工具。

WINDOWS 更多
IntelliJ IDEA Windows版
IntelliJ IDEA Windows版
Windows

JetBrains IntelliJ IDEA 是以 Java、Kotlin 和 JVM 项目为核心的专业集成开发环境,提供智能补全、代码检查、安全重构、调试、测试、版本控制及构建工具集成。统一发行版的核心功能可免费用于商业和非商业项目,

PhpStorm Windows版
PhpStorm Windows版
Windows

PhpStorm 是 JetBrains 面向 PHP 与现代 Web 开发打造的专业集成开发环境,提供代码补全、静态检查、重构、调试、测试、数据库、版本控制及前端语言支持。Windows 用户可直接下载安装程序,

PyCharm Windows版
PyCharm Windows版
Windows

PyCharm 是 JetBrains 推出的 Python 集成开发环境,提供智能代码补全、错误检查、重构、调试、测试、Git、终端及 Jupyter Notebook 支持。统一版安装后可体验 30 天 Pro 功能,