各种chain的介绍
- 串联式编排调用链:SequentialChain
- 流水线 胶水代码逻辑处理
- 具备编排逻辑 串行 one by one的调用
- 上一个chain的输出 作为 下一个chain的输入
- 超长文本的转换 Transform Chain
- pdf文件处理
- 提供了套壳的能力 将python处理字符串的能力 套用进来 完成数据的格式化处理
- 实现条件判断的路由链:RouterChain
- 复杂逻辑 条件判断
- 组合routerchain 目标链 通过条件判断 选择对应的目标链进行调用
LangChain 核心模块学习:Chains
对于简单的大模型应用,单独使用语言模型(LLMs)是可以的。
但更复杂的大模型应用需要将 LLMs 和 Chat Models 链接在一起 - 要么彼此链接,要么与其他组件链接。
LangChain 为这种“链式”应用程序提供了 Chain 接口。
LangChain 以通用方式定义了 Chain,它是对组件进行调用序列的集合,其中可以包含其他链
Chain Class 基类
类继承关系:
Chain --> <name>Chain # Examples: LLMChain, MapReduceChain, RouterChain
# 定义一个名为Chain的基础类
class Chain(Serializable, Runnable[Dict[str, Any], Dict[str, Any]], ABC):
"""为创建结构化的组件调用序列的抽象基类。
链应该用来编码对组件的一系列调用,如模型、文档检索器、其他链等,并为此序列提供一个简单的接口。
Chain接口使创建应用程序变得容易,这些应用程序是:
- 有状态的:给任何Chain添加Memory可以使它具有状态,
- 可观察的:向Chain传递Callbacks来执行额外的功能,如记录,这在主要的组件调用序列之外,
- 可组合的:Chain API足够灵活,可以轻松地将Chains与其他组件结合起来,包括其他Chains。
链公开的主要方法是:
- `__call__`:链是可以调用的。`__call__`方法是执行Chain的主要方式。它将输入作为一个字典接收,并返回一个字典输出。
- `run`:一个方便的方法,它以args/kwargs的形式接收输入,并将输出作为字符串或对象返回。这种方法只能用于一部分链,不能像`__call__`那样返回丰富的输出。
"""
# 调用链
def invoke(
self, input: Dict[str, Any], config: Optional[runnableConfig] = None
) -> Dict[str, Any]:
"""传统调用方法。"""
return self(input, **(config or {}))
# 链的记忆,保存状态和变量
memory: Optional[BaseMemory] = None
"""可选的内存对象,默认为None。
内存是一个在每个链的开始和结束时被调用的类。在开始时,内存加载变量并在链中传递它们。在结束时,它保存任何返回的变量。
有许多不同类型的内存,请查看内存文档以获取完整的目录。"""
# 回调,可能用于链的某些操作或事件。
callbacks: Callbacks = Field(default=None, exclude=True)
"""可选的回调处理程序列表(或回调管理器)。默认为None。
在对链的调用的生命周期中,从on_chain_start开始,到on_chain_end或on_chain_error结束,都会调用回调处理程序。
每个自定义链可以选择调用额外的回调方法,详细信息请参见Callback文档。"""
# 是否详细输出模式
verbose: bool = Field(default_factory=_get_verbosity)
"""是否以详细模式运行。在详细模式下,一些中间日志将打印到控制台。默认值为`langchain.verbose`。"""
# 与链关联的标签
tags: Optional[List[str]] = None
"""与链关联的可选标签列表,默认为None。
这些标签将与对这个链的每次调用关联起来,并作为参数传递给在`callbacks`中定义的处理程序。
你可以使用这些来例如识别链的特定实例与其用例。"""
# 与链关联的元数据
metadata: Optional[Dict[str, Any]] = None
"""与链关联的可选元数据,默认为None。
这些元数据将与对这个链的每次调用关联起来,并作为参数传递给在`callbacks`中定义的处理程序。
你可以使用这些来例如识别链的特定实例与其用例。"""
LLMChain
LLMChain 是agent调用的基本单元
LLMChain 是 LangChain 中最简单的链,作为其他复杂 Chains 和 Agents 的内部调用,被广泛应用。
一个LLMChain由PromptTemplate和语言模型(LLM or Chat Model)组成。它使用直接传入(或 memory 提供)的 key-value 来规范化生成 Prompt Template(提示模板),并将生成的 prompt (格式化后的字符串)传递给大模型,并返回大模型输出。
示例-LLMChain 公司取名
代码示例
import os
from langchain.output_parsers import CommaSeparatedListOutputParser
from langchain.prompts import PromptTemplate
from langchain_openai import OpenAI
from langchain.chains import LLMChain
api_key = 'sk-xxx'
os.environ["OPENAI_API_KEY"] = api_key
serp_api = 'xxx'
os.environ["SERPAPI_API_KEY"] = serp_api
output_parser = CommaSeparatedListOutputParser()
# 模版
template = """给制造{product}的有限公司 取10个名字, 给出完整的公司名称。
{format_instructions}"""
# 预定义提示词
format_instructions = output_parser.get_format_instructions()
# prompt提示词
prompt = PromptTemplate(input_variables=["product"],
partial_variables={"format_instructions": format_instructions},
template=template)
chain = LLMChain(prompt=prompt, llm=OpenAI())
output = chain.run("笔记本电脑")
result = output_parser.parse(output)
print(result)
#输出内容 ['1. Lenovo Limited\n2. Dell Technologies Co.\n3. HP Inc.\n4. Acer Incorporated\n5. AsusTek Computer Inc.\n6. Apple Inc.\n7. Toshiba Corporation\n8. Samsung Electronics Co.', 'Ltd.\n9. Microsoft Corporation\n10. Fujitsu Limited']