LangChain系列文章
- LangChain 实现给动物取名字,
- LangChain 2模块化prompt template并用streamlit生成网站 实现给动物取名字
- LangChain 3使用Agent访问Wikipedia和llm-math计算狗的平均年龄
- LangChain 4用向量数据库Faiss存储,读取YouTube的视频文本搜索Indexes for information retrieve
- LangChain 5易速鲜花内部问答系统
- LangChain 6根据图片生成推广文案HuggingFace中的image-caption模型
- LangChain 7 文本模型TextLangChain和聊天模型ChatLangChain
- LangChain 8 模型Model I/O:输入提示、调用模型、解析输出
- LangChain 9 模型Model I/O 聊天提示词ChatPromptTemplate, 少量样本提示词FewShotPrompt
- LangChain 10思维链Chain of Thought一步一步的思考 think step by step
- LangChain 11实现思维树Implementing the Tree of Thoughts in LangChain’s Chain
- LangChain 12调用模型HuggingFace中的Llama2和Google Flan t5
- LangChain 13输出解析Output Parsers 自动修复解析器
- LangChain 14 SequencialChain链接不同的组件
Router Chain
路由允许您创建非确定性链,其中前一步的输出定义了下一步。路由有助于在与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