LangChain系列文章
使用LCEL,您可以轻松地向您的链中添加自定义路由逻辑,以动态地根据用户输入确定链逻辑。您需要做的就是定义一个函数,给定一个输入,返回一个可运行的函数。
特别有用的一种技术是使用嵌入将查询路由到最相关的提示。这里有一个非常简单的例子。
from langchain.prompts import PromptTemplate
from langchain_community.chat_models import ChatOpenAI
from langchain_core.runnables import ConfigurableField
from langchain_core.output_parsers import StrOutputParser
from langchain.utils.math import cosine_similarity
from langchain_community.embeddings import OpenAIEmbeddings
from langchain_core.runnables import RunnableLambda, RunnablePassthrough
from dotenv import load_dotenv # 导入从 .env 文件加载环境变量的函数
load_dotenv() # 调用函数实际加载环境变量
from langchain.globals import set_debug # 导入在 langchain 中设置调试模式的函数
set_debug(True) # 启用 langchain 的调试模式
physics_template = """你是一个非常聪明的物理教授。
你擅长以简洁易懂的方式回答物理问题。
当你不知道问题的答案时,你会承认自己不知道。
这是一个问题。:
{query}"""
math_template = """你是一个非常优秀的数学家。你擅长回答数学问题。
你之所以这么厉害,是因为你能够把难题分解成组成部分,回答这些部分,
然后把它们放在一起回答更广泛的问题。
这里有一个问题:
{query}"""
embeddings = OpenAIEmbeddings()
prompt_templates = [physics_template, math_template]
prompt_embeddings = embeddings.embed_documents(prompt_templates)
def prompt_router(input):
query_embedding = embeddings.embed_query(input["query"])
similarity = cosine_similarity([query_embedding], prompt_embeddings)[0]
most_similar = prompt_templates[similarity.argmax()]
print("用 数学 >>>>>>>>>>" if most_similar == math_template else "用 物理 >>>>>>>>")
return PromptTemplate.from_template(most_similar)
chain = (
{"query": RunnablePassthrough()}
| RunnableLambda(prompt_router)
| ChatOpenAI()
| StrOutputParser()
)
print(chain.invoke("黑洞是什么?"))
print(">>>>>>>>>>")
print(chain.invoke("路径积分是什么?"))
输出如下:
(.venv) zgpeace@zgpeaces-MacBook-Pro git:(develop) ?% python LCEL/router_cosine_similar.py ~/Workspace/LLM/langchain-llm-app
用 物理 >>>>>>>>
黑洞是一种极其密集的天体,它的引力非常强大,以至于连光都无法逃离它的吸引。黑洞的形成是宇宙中质量非常大的恒星耗尽核燃料后发生的,它会塌缩成一个极小但质量极大的点,称为奇点。黑洞的外围有一个边界,称为事件视界,它标志着进入黑洞的点,一旦穿过事件视界,就无法逃离黑洞的吸引力。由于黑洞非常特殊且极端,我们对它的了解还有很多未解之谜。
>>>>>>>>>>
>
用 数学 >>>>>>>>>>
路径积分是量子力学中的一个概念。在量子力学中,粒子并不像经典物理中那样只有一个确定的轨迹,而是存在多条可能的路径。路径积分是一种数学形式,用于计算出粒子在给定时间间隔内可能的所有路径,并对这些路径进行加权求和。
路径积分的基本思想是将粒子的运动视为从一个初始位置到一个结束位置的所有可能路径的叠加。每条路径都有一个相位因子,由路径的作用量决定。作用量是一个度量路径的物理特性的量,例如路径的长度或能量。
通过对所有可能的路径进行积分,路径积分可以计算出在给定时间间隔内粒子的量子幅度。这些量子幅度可以用来计算出一系列物理量,例如粒子的位置、能量和概率分布等。
路径积分在量子力学中有广泛的应用,尤其在量子场论和统计物理中起着重要的作用。它提供了一种描述粒子行为的数学框架,能够解释一些经典力学无法解释的现象,并为我们理解微观世界的规律提供了一种新的视角。
https://github.com/zgpeace/pets-name-langchain/tree/develop
https://python.langchain.com/docs/expression_language/cookbook/embedding_router