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(手动定义组件)
完全手动搭建核心模块,需要自行完成:
- 实例化
LLMChain作为question_generator,自定义LLM和浓缩问题的prompt; - 调用
load_qa_with_sources_chain(或load_qa_chain)创建combine_docs_chain,指定链类型与LLM; - 将两个组件和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
相关产品推荐
相关产品推荐

