赞
踩
LangChain系列文章
路由允许您创建非确定性链,其中前一步的输出定义了下一步。路由有助于在与LLMs的交互中提供结构和一致性。
作为一个非常简单的例子,假设我们有两个针对不同类型问题进行优化的模板,并且我们希望根据用户输入选择模板。
Chain/chat_chains_router.py
这段代码利用 Langchain 库创建了一个处理链,用于根据用户的输入问题在不同主题(物理、数学或通用问题)之间进行选择并生成回答。以下是对代码的详细解释:
# 导入 Langchain 库的 ChatOpenAI 类,用于与 OpenAI 聊天模型进行交互。 from langchain.chat_models import ChatOpenAI # 导入 PromptTemplate 模块,用于创建和管理提示模板。 from langchain.prompts import PromptTemplate from langchain.schema.output_parser import StrOutputParser from langchain.schema.runnable import RunnableBranch from typing import Literal from langchain.output_parsers.openai_functions import PydanticAttrOutputFunctionsParser from langchain.utils.openai_functions import convert_pydantic_to_openai_function from langchain.utils.openai_functions import convert_pydantic_to_openai_function # 导入 dotenv 库,用于从 .env 文件加载环境变量,管理敏感数据如 API 密钥。 from dotenv import load_dotenv # 调用 load_dotenv 函数来加载 .env 文件中的环境变量。 load_dotenv() # 定义物理问题的提示模板 physics_template = """ 你是一位非常聪明的物理教授。你擅长以简明易懂的方式回答物理问题。当你不知道某个问题的答案时,你会承认自己不知道。 以下是一个问题: {input} """ physics_prompt = PromptTemplate.from_template(physics_template) # 定义数学问题的提示模板 math_template = """ 你是一个非常优秀的数学家。你擅长回答数学问题。你之所以这么厉害,是因为你能够把难题分解成组成部分,回答这些部分,然后把它们放在一起回答更广泛的问题。 这里有一个问题: {input} """ math_prompt = PromptTemplate.from_template(math_template) # 定义通用问题的提示模板 general_prompt = PromptTemplate.from_template( "您是一个很有帮助的助手。尽可能准确地回答问题。" ) # 创建基于条件的提示分支 prompt_branch = RunnableBranch( (lambda x: x["topic"] == "物理", physics_prompt), (lambda x: x["topic"] == "数学", math_prompt), general_prompt ) # 定义主题分类器模型 from langchain.pydantic_v1 import BaseModel from typing import Literal class TopicClassifier(BaseModel): "分类用户问题的主题" topic: Literal["物理", "数学", "通用"] "用户问题的主题。其中之一是'数学','物理'或'通用'。" # 创建主题分类器函数 from langchain.utils.openai_functions import convert_pydantic_to_openai_function classifier_function = convert_pydantic_to_openai_function(TopicClassifier) print("classifier_function") print(classifier_function) # 创建 ChatOpenAI 实例并绑定主题分类器函数 llm = ChatOpenAI().bind( functions=[classifier_function], function_call={"name": "TopicClassifier"} ) # 创建解析器 from langchain.output_parsers.openai_functions import PydanticAttrOutputFunctionsParser parser = PydanticAttrOutputFunctionsParser( pydantic_schema=TopicClassifier, attr_name="topic" ) # 创建分类链 classifier_chain = llm | parser # 创建最终的处理链 from operator import itemgetter from langchain.schema.output_parser import StrOutputParser from langchain.schema.runnable import RunnablePassthrough final_chain = ( RunnablePassthrough.assign(topic=itemgetter("input") | classifier_chain) | prompt_branch | ChatOpenAI() | StrOutputParser() ) # 使用处理链生成响应 response = final_chain.invoke({"input": "第一个大于 40 的质数是多少,且该质数的 1 加上能被 3 整除?"}) print(response) response1 = final_chain.invoke({"input": "请解释什么是相对论。"}) print(response1)
输出结果:
zgpeace at zgpeaces-MBP in ~/Workspace/LLM/langchain-llm-app (develop●) (.venv) $ python Chain/chat_chains_router.py classifier_function {'name': 'TopicClassifier', 'description': '分类用户问题的主题', 'parameters': {'title': 'TopicClassifier', 'description': '分类用户问题的主题', 'type': 'object', 'properties': {'topic': {'title': 'Topic', 'enum': ['物理', '数学', '通用'], 'type': 'string'}}, 'required': ['topic']}} 首先,我们需要找到第一个大于 40 的质数。我们可以从 41 开始,然后检查每个数是否为质数。质数是只能被 1 和自身整除的正整数。 41 是一个质数,因此它是第一个大于 40 的质数。 接下来,我们需要找到 41 加上能被 3 整除的数。我们可以从 1 开始,然后依次检查每个数是否能被 3 整除。 1 不能被 3 整除,所以我们需要继续检查下一个数。 2 不能被 3 整除,所以我们需要继续检查下一个数。 3 能够被 3 整除,所以 41 加上 3 是 44。 因此,第一个大于 40 的质数是 41 且该质数的 1 加上能被 3 整除是 44。 相对论是一种科学理论,它是由爱因斯坦在20世纪初提出的。它主要研究光的传播和物体的运动,特别是在高速和引力场中的情况下。相对论告诉我们,物体的运动和时间的流逝都是相对的,即取决于观察者的参考系。 在相对论中,光的速度是宇宙中最快的速度,无论观察者如何运动,光速度的值都是一样的。这导致了一些非常奇特的现象,例如时间的相对性和长度的相对性。根据相对论,当物体以接近光速运动时,它们的时间会变慢,而长度也会变短。这被称为时间膨胀和长度收缩。 相对论还告诉我们,质量和能量之间存在着等效关系,也就是著名的E=mc²公式。这意味着质量和能量可以互相转化,而且质量越大的物体所蕴含的能量也越大。 总的来说,相对论改变了我们对时间、空间和物质的理解,它揭示了一些非常奇妙和不直观的现象。尽管相对论可能有些复杂,但我们可以用简单的例子和比喻来解释它,以帮助人们更好地理解。
代码
https://github.com/zgpeace/pets-name-langchain/tree/develop
https://python.langchain.com/docs/modules/chains/foundational/router
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。