[轻松迁移:从ConversationalRetrievalChain到LCEL实现的指南]

【LangChain】对话式问答(Conversational Retrieval QA) 它首先将聊天记录(显式传入或从提供的内存中检索)和问题组合成一个独立的问题,然后从检索器中查找相关文档,最后将这些文档和问题传递到问答链以返回一个响应。这样会有一个非常大的好处:我们可以使用更便宜、更快的模型来完成问题的凝练工作,然后再使用昂贵的模型来回答问题。首先,它将当前问题和聊天历史凝练为一个独立的问题。声明性特性的部分强大之处在于,您可以轻松地为每个调用使用单独的语言模型。之后,它进行检索,然后使用单独模型的检索增强生成来回答问题。在下面的示例中,我们将从向量存储创建一个,该向量存储可以从。 阅读详情

引言

在当今的AI与编程领域,结合聊天历史与检索增强生成的ConversationalRetrievalChain是一种强大的工具,能够让开发者实现与文档的“对话”。然而,随着技术的进步,迁移到LCEL实现具有许多优势,包括更清晰的内部结构、方便地返回源文档以及支持流式和异步操作。在本文中,我们将探讨如何从ConversationalRetrievalChain迁移到LCEL,并提供详细的代码示例和潜在挑战的解决方案。

主要内容

为什么迁移到LCEL?

  • 更清晰的内部ConversationalRetrievalChain隐藏了一个完整的问题重述步骤,而LCEL则提供了更透明的实现,使开发者能够更好地掌控流程。
  • 更简便的源文档返回LCEL允许更灵活的文档检索和处理。
  • 支持流式和异步操作LCEL支持更多种类的方法调用,提升了实现的多样性和效率。

LCEL的主要组件

  1. 历史感知检索器:能够智能地处理聊天历史,并根据需要重述问题。
  2. 检索链:负责从存储中获取相关的上下文文档。
  3. 文档组合链:用于将多个文档的内容组合成有意义的答案。

代码示例

以下是如何利用LCEL实现的一个完整示例。

%pip install --upgrade --quiet langchain-community langchain langchain-openai faiss-cpu

import os
from getpass import getpass

os.environ["OPENAI_API_KEY"] = getpass()

from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.document_loaders import WebBaseLoader
from langchain_community.vectorstores import FAISS
from langchain_openai.chat_models import ChatOpenAI
from langchain_openai.embeddings import OpenAIEmbeddings

# 加载文档
loader = WebBaseLoader("https://lilianweng.github.io/posts/2023-06-23-agent/")
data = loader.load()

# 文本拆分
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=0)
all_splits = text_splitter.split_documents(data)

# 向量存储
vectorstore = FAISS.from_documents(documents=all_splits, embedding=OpenAIEmbeddings())

# 初始化LLM
llm = ChatOpenAI()

from langchain.chains import create_history_aware_retriever, create_retrieval_chain
from langchain.chains.combine_documents import create_stuff_documents_chain
from langchain_core.prompts import ChatPromptTemplate

# 设置问题重述模板
condense_question_system_template = (
    "Given a chat history and the latest user question "
    "which might reference context in the chat history, "
    "formulate a standalone question which can be understood "
    "without the chat history. Do NOT answer the question, "
    "just reformulate it if needed and otherwise return it as is."
)

condense_question_prompt = ChatPromptTemplate.from_messages(
    [
        ("system", condense_question_system_template),
        ("placeholder", "{chat_history}"),
        ("human", "{input}"),
    ]
)

# 创建历史感知检索器
history_aware_retriever = create_history_aware_retriever(
    llm, vectorstore.as_retriever(), condense_question_prompt
)

# 设置系统提示
system_prompt = (
    "You are an assistant for question-answering tasks. "
    "Use the following pieces of retrieved context to answer "
    "the question. If you don't know the answer, say that you "
    "don't know. Use three sentences maximum and keep the "
    "answer concise."
    "\n\n"
    "{context}"
)

qa_prompt = ChatPromptTemplate.from_messages(
    [
        ("system", system_prompt),
        ("placeholder", "{chat_history}"),
        ("human", "{input}"),
    ]
)

# 创建文件组合链
qa_chain = create_stuff_documents_chain(llm, qa_prompt)

# 创建检索链
convo_qa_chain = create_retrieval_chain(history_aware_retriever, qa_chain)

# 执行链
convo_qa_chain.invoke(
    {
        "input": "What are autonomous agents?",
        "chat_history": [],
    }
)

常见问题和解决方案

  • API访问问题:由于某些地区的网络限制,开发者可能需要考虑使用API代理服务来提高访问稳定性。
  • LLM初始化失败:确保API密钥和必要的库已正确安装和配置。
  • 文档加载错误:检查网络连接和文档源的可访问性。

总结与进一步学习资源

通过将ConversationalRetrievalChain迁移到LCEL,开发者可以获得更大的灵活性和功能。推荐进一步阅读以下资源以更深入地理解LCEL:

参考资料

本文所用资料来源于Langchain及其API文档。具体参考文献和资源可在Langchain Documentation中查阅。

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

—END—

ConversationalRetrievalChain迁移LCEL ConversationalRetrievalChain是一种结合聊天历史与检索增强生成(retrieval-augmented generation)的工具,允许用户与文档进行“对话”。它通过历史对话内容和追踪查询,达到准确的问答效果。更加清晰的内部结构:ConversationalRetrievalChain隐藏了一个完整的问题重构步骤,该步骤将初始查询与聊天历史记录进行解除引用。结果是这个类包含了两套可配置的提示、LLMs等。更容易返回源文档。支持可运行的方法,如流操作和异步操作。 阅读详情

相关推荐

树莓派与ROS2

树莓派与ROS2(Robot Operating System 2)的结合使用为机器人开发、自动化控制以及物联网项目提供了强大的平台。

weixin_47695827的博客 1728

轻松迁移:从ConversationalRetrievalChainLCEL的转变

迁移LCEL不仅能改进系统的灵活性和性能,还能提升代码的可读性和可维护性。建议开发者进一步阅读LCEL的概念文档以深入理解其优势和应用。

aehrutktrjk的博客 362

9、双玩家博弈中的精确与近似纳什均衡及中国股市再融资偏好研究

本文研究了双玩家博弈中精确与近似纳什均衡的计算方法,提出通过线性松弛问题LR在多项式时间内求解正则双矩阵博弈的纳什均衡,并分析其在α-平滑博弈中的近似性能。同时,探讨了中国股市2001-2009年期间再融资偏好的动态变化,重点考察非流通股改革对再融资方式选择的影响。研究表明,改革前配股为主导,改革后公开发行(含定向增发)因溢价发行和低参与门槛成为主流,显著提升了资金募集效率和市场参与度。结合博弈论模型与实证分析,揭示了制度变革对企业融资行为的深远影响。

nn3456的博客 65

ConversationalRetrievalChain迁移LCEL:升级你的文档聊天体验

通过迁移LCEL实现,你可以获得更灵活的配置、更清晰的内部逻辑和更多的功能扩展。LangChain官方文档LCEL概念文档LangChain社区论坛。

tt_jishu的博客 431

[从ConversationalRetrievalChain迁移:拥抱更清晰的LCEL实现]

迁移LCEL可以明显提高问答系统的灵活性和性能。建议探索LCEL的概念文档以获得更深入的理解。

bhawfgrcbtwny的博客 264

【LangChain】从传统对话链到RunnableWithMessageHistory:现代化RAG系统的历史管理迁移指南

本文详细介绍了如何从传统的ConversationalRetrievalChain迁移到现代化的RunnableWithMessageHistory架构,以优化LangChain中的RAG系统。通过模块化设计、统一历史管理和未来兼容性三大优势,新架构显著提升了系统性能和灵活性。文章还提供了逐步迁移指南和实战技巧,帮助开发者高效完成架构升级。

mqtt6iot的博客 694

从CVI(C)到Pyside(python)/Qt(C++)/VS(C#)的一点吐槽

Tkinter 布局助手”,是我接触过的基于python原生的图形界面套件Tkinter来做GUI程序的最佳实践,链接是https://www.pytk.net/],在web上就可以拖拽基础控件到面板,并定义控件的回调函数,完了存盘到本机。我曾经死抱着CVI不放,没有去追逐更现代的IDE,究其原因,主要是以前没有 AI 辅助编程,很多新 IDE 摸都不敢摸,随便一个编译报错或环境配错,就会卡死我半天。所以,遇到我这样,时不时输出一个学习心得的老工程师,也应该算是一种缘分了,很罕见的哦。

qq_15084199的博客 243

用 TRAE Builder+MCP+VibeCoding 做个超酷的AI旅游札记生成器

可以通过修改"文艺": "文字优美,富有诗意...","幽默": "语言轻松活泼...","深度": "深入思考旅行的意义...","简洁": "语言简洁明了...","古风": "使用文言文或古风语言,富有古典韵味...","科技感": "使用现代科技词汇,突出数字化体验..."兄弟们,咱们的AI旅游札记生成应用终于搞定啦!基于TRAE Builder+MCP服务和VibeCoding技术,咱们开发出了一个功能超全、体验超棒的旅行小伙伴。它能帮你做什么呢?🤖智能旅行札记生成。

laozhangguzhang的博客 211

AI Agent学习笔记(20260817)

肖斌。

weixin_43341767的博客 239

Reddit 数据抓取工具指南:如何在 2026 年抓取 Reddit 数据

本文介绍了2026年Reddit数据抓取的主要方法及注意事项。官方API(如PRAW库)适合结构化数据获取,而第三方工具(如Apify)简化了数据收集流程。常见问题包括403/429错误、缺失评论和重复数据,建议采用退避策略和唯一标识符解决。关键注意事项包括:最小化个人数据收集、控制请求频率、合理使用代理IP(如IPFoxy的动态住宅代理),以及优先收集高质量小数据集而非海量杂乱信息。最佳方法取决于项目需求,小型项目可用现成工具,复杂任务建议构建自定义Python管道。

2603_96479538的博客 346

PC / 外设资产 TCO 测算模型:租赁模式和直接采购怎么量化对比

本文介绍了企业IT硬件全生命周期管理中PC及外设类硬件的TCO(总拥有成本)量化测算工程实现方案。针对传统Excel测算的缺陷(如逻辑硬编码、隐性成本缺失、无统一对比基准等),提出结构化TCO测算引擎架构,通过参数配置层、计算内核层、约束校验层和结果输出层四部分实现。方案采用Python开发,包含完整可运行Demo,支持自购与租赁模式的年均等效成本对比,可输出分项明细和参数敏感性分析。文章详细展示了YAML参数配置、边界校验模块和核心计算逻辑的设计,重点解决了企业硬件采购决策中隐性成本量化困难等问题。

企业 IT 文印实战知识库,面向 IT 运维、信息化负责人、采购决策者。 专栏《复印机》:分布式文印全套落地实战系列,包含架构、安全、SDK 集成、TCO 测算、设备监控、电子化归档。 670

ANNA 7.2 Cognitive RAG Engine

ANNA is not a feature upgrade—it's a new category of knowledge system: conscious retrieval. By introducing a cognitive layer that dynamically adapts retrieval strategies based on real‑time state, guaranteeing entity recall through mandatory inclusion, and

科技翻译和认知研究 220

Python基础7 - 函数:(2)参数传递

【代码】Python基础7 - 函数:(2)参数传递。

weixin_69667614的博客 192

Python 文件读写操作完全指南

核心函数:使用open()打开文件,用with语句管理上下文。模式选择:根据需求选择正确的moderwa及其组合)。读取方式:小文件用read(),大文件用迭代或read(size)分块。写入注意'w'模式会清空原文件,'a'模式用于追加。编码问题:处理中文务必指定。异常处理:使用捕获等。掌握这些基础操作,你就能应对绝大多数 Python 文件处理场景。接下来可以探索os和pathlib模块进行更复杂的文件和路径操作。

KevinChen2019的博客 81

Python 入门通关:注释、变量、数据类型、运算符全覆盖

本章系统介绍了Python编程语言的基础知识,涵盖代码格式规范(注释、缩进、换行)、标识符与关键字命名规则、变量定义与数据类型(数字类型、字符串、列表、元组、集合、字典)、输入输出函数(input/print)以及各类运算符(算术、赋值、比较、逻辑、成员、位运算)的使用。通过多个课堂练习(购物票打印、温度转换、BMI计算、房贷计算器)巩固知识点,帮助初学者建立Python编程的基本概念和语法基础,为后续深入学习打下坚实基础。

2602_95508776的博客 607

python,vue3 web项目.gitignore,推送标签到git,后续项目可基于此标签作为基础继续开发

【代码】python,vue3 web项目.gitignore,推送标签到git,后续项目可基于此标签作为基础继续开发。

kobe_okok的博客 19

2026-08-19 GitHub 热点项目精选

* 全局样式 */padding: 0;body {/* 标题样式 *//* 链接样式 *//* 引用样式 *//* 表格样式 */table {th, td {th {/* 代码块样式(pygments 高亮) */pre {/* 列表样式 *//* 图片样式 */

m0_65659549的博客 230

Selenium | Edge 手动驱动完整版教学

适用场景:网络不佳,Selenium自动下载驱动失败,搭配 Edge 浏览器运行。

qq_51372804的博客 271

Python 3.9 · Flask 火灾监测识别系统 与 钉钉告警机器人 集成说明文档

本文介绍如何将钉钉群机器人告警功能集成到基于Python 3.9和Flask的火灾监测系统中。主要内容包括:系统架构设计(YOLOv11检测火灾/烟雾后触发钉钉告警)、环境配置说明、钉钉机器人创建与安全设置(推荐使用加签验证)、钉钉推送模块代码实现支持重试机制)、Flask后端集成改造方法,以及告警去重与冷却控制机制。文档提供了完整的实施步骤,从环境准备到测试验证,并包含常见问题解答和进阶功能建议(如图片告警)。该方案实现了火灾检测的实时预警功能,同时避免了消息刷屏问题。

isoft888的专栏,致力于C#/python分享物联网、大数据,神经网络的等领域,欢迎讨论交流! 271

LeetCode 28. 找出字符串中第一个匹配项的下标(暴力匹配 + KMP 算法详解)

本文介绍了LeetCode 28题"找出字符串中第一个匹配项的下标"的两种解法:暴力匹配和KMP算法。暴力匹配通过逐个字符比较实现,时间复杂度O(m×n);KMP算法利用next数组跳过不必要匹配,时间复杂度O(m+n)。文章详细解释了KMP的核心思想,包括next数组的定义和构建过程,并提供了Python和Java的代码实现。两种方法各具特点:暴力匹配简单直观,KMP更高效但实现复杂,适合处理长字符串匹配问题。

2603_95532426的博客 230

TRC20提币接口源码/USDT提币转账接口源码.zip

TRC20提币接口源码/USDT提币转账接口源码可以自己对接到需要的平台里,简单方便。 只能学习研究!可以二开

上一篇: 如何在SQL问答中进行查询验证:确保SQL查询的安全性和有效性
下一篇: 如何为LangChain贡献集成:从社区到合作伙伴包的完整指南
saeagtj
博客等级 码龄2年 281粉丝 · 45原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值