You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Langchain中ConversationalRetrievalChain.from_llm与LLMChain构建方式的差异

Langchain ConversationalRetrievalChain两种构建方式解析

一、底层实现

示例1(ConversationalRetrievalChain.from_llm)

这是Langchain提供的快捷封装方法,底层会自动创建两个核心组件:

  • question_generator:用传入的LLM和指定的condense_question_prompt(或内置默认prompt)生成LLMChain,负责把当前问题结合聊天历史浓缩成可独立检索的问题;
  • combine_docs_chain:默认调用load_qa_chain创建stuff类型的文档处理链,也可通过chain_type参数指定map_reduce、refine等其他类型。
    同时支持直接传入memory对象,自动处理聊天历史的存储与读取逻辑。

示例2(手动定义组件)

完全手动搭建核心模块,需要自行完成:

  1. 实例化LLMChain作为question_generator,自定义LLM和浓缩问题的prompt;
  2. 调用load_qa_with_sources_chain(或load_qa_chain)创建combine_docs_chain,指定链类型与LLM;
  3. 将两个组件和retriever一起传入ConversationalRetrievalChain构造函数。
    这种方式完全开放所有组件的配置权限,无任何默认封装。

二、适用场景

示例1适用场景

  • 快速搭建原型:用默认配置就能快速跑通对话检索流程,无需自定义核心组件;
  • 简单需求场景:仅需调整LLM参数、自定义浓缩问题prompt,不需要修改文档处理链的复杂逻辑;
  • 需要集成memory:直接传入memory对象即可,无需手动传递聊天历史。

示例2适用场景

  • 高度定制化需求:比如给question_generator添加自定义输出解析器、给combine_docs_chain配置特殊prompt模板;
  • 需要文档来源信息:使用load_qa_with_sources_chain可返回答案对应的文档来源;
  • 组件差异化配置:不同组件用不同LLM(比如question_generator用轻量模型,combine_docs_chain用大模型),优化资源消耗;
  • 调试需求:单独调试question_generator或combine_docs_chain的输出,手动构建更方便排查问题。

三、输出一致性

输出是否一致取决于组件配置是否对齐:

  • 若示例1和示例2使用相同LLM、浓缩问题prompt、文档处理链类型,最终答案内容基本一致;
  • 差异点:示例2用load_qa_with_sources_chain会额外返回sources字段,示例1默认用load_qa_chain不会返回来源,除非手动指定带来源的combine_docs_chain;
  • 另外,示例1传入memory后会自动维护聊天历史,示例2需要手动传递chat_history参数。

四、示例1是否隐式使用question_generator或doc_chain

是的,示例1完全隐式创建了这两个核心组件:

  • question_generator:传入condense_question_prompt时,方法会用该prompt和指定LLM创建LLMChain;未指定则使用Langchain内置的默认浓缩问题prompt;
  • combine_docs_chain:默认用load_qa_chain(llm, chain_type="stuff")创建,也可通过chain_type修改链类型,或直接传入自定义combine_docs_chain覆盖默认值。

示例1代码(使用.from_llm)

model = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0.3)
embeddings = OpenAIEmbeddings()
vectordb = Chroma(embedding_function=embeddings, persist_directory=directory)
memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True)
qa = ConversationalRetrievalChain.from_llm(
    model,
    vectordb.as_retriever(),
    condense_question_prompt=CUSTOM_QUESTION_PROMPT,
    memory=memory
)
query = "What did the president say about Ketanji Brown Jackson"
result = qa({"question": query})

示例2代码(手动定义LLMChain)

llm = OpenAI(temperature=0)
question_generator = LLMChain(llm=llm, prompt=CONDENSE_QUESTION_PROMPT)
doc_chain = load_qa_with_sources_chain(llm, chain_type="map_reduce")

chain = ConversationalRetrievalChain(
    retriever=vectorstore.as_retriever(),
    question_generator=question_generator,
    combine_docs_chain=doc_chain,
)
chat_history = []
query = "What did the president say about Ketanji Brown Jackson"
result = chain({"question": query, "chat_history": chat_history})

内容的提问来源于stack exchange,提问作者Guilherme Giuliano Nicolau

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 21:45:06