路由chain 路由链是LangChain中用于智能决策和分发 的核心机制,它可以根据输入内容自动选择 最合适的处理路径。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 from langchain_core.runnables import RunnablePassthrough, RunnableLambda, RunnableBranchfrom langchain.prompts import ChatPromptTemplate,SystemMessagePromptTemplate,HumanMessagePromptTemplatefrom langchain_core.output_parsers import StrOutputParserfrom langchain_deepseek import ChatDeepSeekfrom dotenv import load_dotenvload_dotenv() physics_chain = ( ChatPromptTemplate.from_template("你是物理专家。问题:{input}" ) | ChatDeepSeek(model="deepseek-chat" ) | StrOutputParser() ) math_chain = ( ChatPromptTemplate.from_template("你是数学专家。问题:{input}" ) | ChatDeepSeek(model="deepseek-chat" ) | StrOutputParser() ) general_chain = ( ChatPromptTemplate.from_template("你是通用助手。问题:{input}" ) | ChatDeepSeek(model="deepseek-chat" ) | StrOutputParser() ) def classify_input (input_text: str ) -> str : prompt = ChatPromptTemplate.from_messages([ SystemMessagePromptTemplate.from_template("你是一个问题分类专家" ), HumanMessagePromptTemplate.from_template("{input}。请分类这个问题:如果是物理问题返回字符串physics,数学问题返回字符串math,否则返回字符串general。" ), ]) chain = prompt | ChatDeepSeek(model="deepseek-chat" ) | StrOutputParser() return chain.invoke({"input" : input_text}).strip().lower() def post_processor (response: str ) -> str : """添加结果前缀""" return f"最终回答:{response} " router = ( RunnablePassthrough() | RunnableLambda(lambda x: {"classify" : classify_input(x["input" ]), "raw" : x["input" ]}) | RunnableBranch( (lambda x: x["classify" ] == "physics" , lambda x: physics_chain.invoke({"input" : x["raw" ]})), (lambda x: x["classify" ] == "math" , lambda x: math_chain.invoke({"input" : x["raw" ]})), lambda x: general_chain.invoke({"input" : x["raw" ]}) ) ) if __name__ == "__main__" : result1 = router.invoke({"input" : "解释一下牛顿第一定律" }) print (f"物理问题: {result1} " ) result2 = router.invoke({"input" : "如何解二次方程?" }) print (f"数学问题: {result2} " ) result3 = router.invoke({"input" : "今天天气怎么样?" }) print (f"通用问题: {result3} " )
SequentalChain顺序执行 SequentialChain 是 LangChain 中用于顺序执行多个链 的机制,前一个链的输出作为后一个链的输入,形成处理流水线
简单顺序执行 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 from langchain_core.runnables import RunnableSequencefrom langchain_deepseek import ChatDeepSeekfrom langchain.prompts import PromptTemplatefrom langchain_core.output_parsers import StrOutputParserfrom dotenv import load_dotenvload_dotenv() from langchain.globals import set_debugset_debug(True ) template = """你是一个剧作家,我会给出一个剧的辩题,你的任务是为该标题写一个剧情概要 标题:{title} 剧作家:""" prompt1 = PromptTemplate(input_variables=["title" ],template=template) first_chain = prompt1 | ChatDeepSeek(model="deepseek-chat" ) | StrOutputParser() template = """你是剧评人。给出剧本的摘要,你需要为该剧撰写评论: 剧本概述{synopsis} 剧评人: """ prompt2 = PromptTemplate(input_variables=["synopsis" ],template=template) secend_chain = prompt2 | ChatDeepSeek(model="deepseek-chat" ) | StrOutputParser() sequential_chain = first_chain | secend_chain result = sequential_chain.invoke("赘婿龙王归来" ) print (result)
TransformationChain(转换链) 是LangChain中用于数据转换和预处理的专用链。它的核心作用是:原始数据 → 转换处理 → 结构化/标准化数据 → 供后续AI链使用
数据清洗 :去除噪声、标准化格式格式转换 :文本→字典、JSON→文本等特征提取 :从原始数据中提取关键信息数据增强 :扩展或转换数据格式
其实就是自己写方法,进行数据的处理,然后集成到chain中
Chain摘要 Chain摘要 主要用于对长文本进行内容总结和浓缩。
它的核心作用是将复杂的文档或对话内容提炼成简洁、关键的要点 ,以便于后续处理或人类快速理解。
stuff document 最简单,一次性处理所有文档,适用短文档
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 from langchain.chains.summarize import load_summarize_chainfrom langchain.text_splitter import RecursiveCharacterTextSplitterfrom langchain.docstore.document import Documentfrom langchain_deepseek import ChatDeepSeekfrom dotenv import load_dotenvload_dotenv() llm = ChatDeepSeek(model="deepseek-chat" ) long_text = """ 近年来,人工智能技术快速发展,在各个领域都有广泛应用。 在自然语言处理方面,深度学习模型如Transformer架构的出现极大地提升了机器理解人类语言的能力。 GPT系列模型展示了强大的文本生成和理解能力,能够完成写作、翻译、问答等多种任务。 在计算机视觉领域,卷积神经网络的发展使得图像识别、目标检测等任务达到了实用水平。 人工智能在医疗、金融、教育等行业也发挥着重要作用,帮助提高效率和准确性。 不过,人工智能的发展也带来了一些挑战,如数据隐私、算法偏见和就业影响等问题需要解决。 未来,人工智能技术将继续发展,与人类社会的融合将更加深入。 """ text_splitter = RecursiveCharacterTextSplitter( chunk_size=500 , chunk_overlap=50 ) docs = text_splitter.create_documents([long_text]) chain = load_summarize_chain( llm=llm, chain_type="stuff" , verbose=True ) summary = chain.invoke(docs) print ("摘要结果:" )print (summary)
Map-Reduce 先分块处理再合并,适用长文档
1 2 3 4 5 6 7 8 9 10 chain = load_summarize_chain( llm=llm, chain_type="map_reduce" , verbose=True ) summary = chain.invoke(docs) print ("摘要结果:" )print (summary)