Langchain表达语言

ChatGPT中文站

LangChain已成为一个显著的框架,使开发人员能够利用先进的语言模型的能力。然而,对于那些没有坚实的技术背景的人来说,开发可能具有挑战性。LangChain表达语言(LCEL)通过提供一种简单和声明性的方式来与核心组件和更多内容进行交互来提供帮助。

LangChain表达语言的优势

  1. 简化的链式组合:通过直观的管道操作,与核心组件的互动变得轻松无忧。
  2. 有效的语言模型调用:支持批处理、异步和流式API,无需复杂的优化语言模型互动。
  3. 结构化对话流程:为对话检索链、向量商店检索和基于记忆的提示提供了明确的结构。
  4. 函数调用:与OpenAI相似,LCEL引入了一种无缝的函数调用方法,提高了代码的清晰度和可用性。

推出ChefBot:您的烹饪伙伴

见到ChefBot,我们LCEL旅途中的烹饪向导。拿着食材或偏好,ChefBot可以制作个性化的食谱推荐。准备好欣赏ChefBot美味旅程中的Langchain表达语言吧!

如果您是一个视觉学习者或想进一步深入了解,请参考YouTube视频。

提示模板,LLMs和输出解析器

请注意,在使用陈述性方法时,语法结构发生了重大变化:起草一个提示,选择OpenAI模型,然后使用管道运算符(链 = prompt | model)轻松地将它们组合在一起。

见证ChefBot如何从食材中制作食谱,并阐述了我们的代码。利用新开发的字符串输出解析器,人工智能的聊天消息输出也得到了整洁的转化。

from langchain.prompts import ChatPromptTemplate
from langchain.chat_models import ChatOpenAI
from langchain.schema.output_parser import StrOutputParser

model = ChatOpenAI()
prompt = ChatPromptTemplate.from_template("
Given the ingredients: {ingredients}, what is a recipe that I can cook at home?")
chain = prompt | model | StrOutputParser()
chain.invoke({"ingredients": "chicken, tomatoes, garlic, olive oil"})

批处理,流处理和异步处理

批处理:解锁批处理的潜力,LangChain的表达语言通过一次执行多个任务来简化LLM查询。LangChain的批处理还通过并行的LLM调用来优化输入。

Langchain 确保对 Open AI 模型进行并行调用,从而优化性能。

response = chain.batch([{"ingredients": "chicken, tomatoes, garlic"},
{"ingredients":"chicken, tomatoes, eggs"}])

流媒体提供实时数据流动,非常适用于动态聊天机器人和直播应用。像ChefBot这样的示例展示了其强大之处,它能够逐步流式传输信息,消除等待时间。

chain = prompt | model
for s in chain.stream({"ingredients": "chicken, tomatoes, garlic, olive oil"}):print(s.content, end="")

异步:LangChain表达式语言为invoke、batch和stream等方法引入了异步对应方法。通过利用ainvoke和await方法实现无缝异步执行,任务可以独立运行,从而提高响应能力和应用程序速度。

response = await chain.ainvoke({"ingredients": "chicken, tomatoes, garlic, olive oil"})

函数调用

LangChain 表达语言超越了数据传输,欢迎基于函数的操作以满足特定需求的任务。这个特性提升了工作流的可复用性。

在传统的编程领域中,函数代表可重用的代码块。在LangChain中,函数体现了结构化的模式,并发送到像Open AI这样的平台进行处理。

让我们为ChefBot实现这个概念。我们定义一个可重用的函数'generate_recipe',它为提供的食材制作食谱。通过添加所需的参数"菜系",我们可以确保响应中包含食谱的菜系类型。因此,我们可以确保响应中包含重要属性以达到预期的结果。

generate_recipe_fn = [
{
"name": "generate_recipe",
"description": "Generate a recipe based on user preferences",
"parameters": {
"type": "object",
"properties": {
"cuisine": {
"type": "string",
"description": "The cuisine of the recipe"
}
},
"required": ["cuisine"]
}
}
]

chain = prompt | model.bind(function_call= {"name": "generate_recipe"}, functions= generate_recipe_fn)

# Generate the recipe using chefbot
recipe = chain.invoke({"ingredients": "chicken, tomatoes, garlic, olive oil"}, config={})

VectorStore,嵌入和检索

进入复杂的领域,我们深入研究向量存储、嵌入和检索。

向量存储的是单词或短语的主机向量表示,而嵌入式则是一种以数字形式捕获单词或短语在高维空间中含义的向量表示。利用它们,检索链可以提取上下文数据,优化用户查询的响应。

接下来,我们将通过展示ChefBot的真实效果来实现这一概念。ChefBot拥有大量存储为知识嵌入的食谱收藏,可以通过“检索增强生成”链查询。

让我们以ChefBot示例来理解这些概念。

from langchain.vectorstores import Chroma
from langchain.embeddings import OpenAIEmbeddings
from langchain.schema.runnable import RunnablePassthrough

# recipe for Garlic Tomato Chicken to be stored as embeddings
recipe_ingredients = '''The ingredients of Garlic Tomato Chicken are:
1. 2 chicken breasts (boneless, skinless)
2. 4 tomatoes (diced)
3. 4 cloves of garlic (minced)
4. 2 tablespoons olive oil'''

#create the retriever from the Chroma Vectorstore.
# pass the recipe text and embed it with OpenAIEmbeddings
vectorstore = Chroma.from_texts([recipe_ingredients], embedding=OpenAIEmbeddings())
retriever = vectorstore.as_retriever()
# template to be passed to the prompt
template = """Answer the question based only on the following context:
{context}

Question: {question}
"""
prompt = ChatPromptTemplate.from_template(template)
model = ChatOpenAI()
# Notice context and RunnablePassthrough input to the chain
chain = (
{"context": retriever, "question": RunnablePassthrough()}
| prompt
| model
| StrOutputParser()
)

response = chain.invoke("How many tomatoes are in the recipe ingredients?")

在现实世界的应用中,您可以将自己的私有数据作为嵌入式数据引入向量存储中,并使用表达式语言进行轻松准确的检索。

结论

当我们结束这次探索时,请记住,Langchain Expression Language的覆盖范围超越了我们所介绍的主题。对话检索链、多重LLM链融合、工具整合、内存增强、SQL查询和Python REPL编码是LCEL无缝接触的多面手领域之一。

为了真正掌握LCEL在上述功能方面的深度,并且观看现实世界的演示,请参考YouTube视频。

2023-10-20 17:09:51 AI中文站翻译自原文