LangChain框架深度解析:对Chains组件的全方位探索与实战案例

news2024/12/27 17:54:25

在这里插入图片描述


文章目录

  • 前言
  • 一、Chains
  • 二、LLMChain⭐
    • 1.LLMChain介绍
    • 2.LLMChain案例
  • 三、SimpleSequentialChain⭐
    • 1.SimpleSequentialChain介绍
    • 2.SimpleSequentialChain案例
  • 四、SequentialChain⭐
    • 1.SequentialChain介绍
    • 2.SequentialChain案例
  • 五、RouterChain⭐
    • 1.RouterChain介绍
    • 2.RouterChain案例
  • 六、TransformChain⭐
    • 1.TransformChain介绍
    • 2.TransformChain案例
  • 七、文档处理链
    • 1.StuffDocumentsChain
    • 2.RefineDocumentsChain
    • 3.MapReduceDocumentsChain
    • 4.MapRerankDocumentsChain
  • 八、自定义链


前言

    Langchain框架的Chains组件,是构建智能对话与任务式应用的关键。本文聚焦Chains,从基础概念到高级应用全面解析。您将了解LLMChain、SequentialChain等类型,它们如何协同工作以处理复杂任务。通过具体案例,展示Chains在文本处理、流程管理、数据变换中的强大能力。
    同时,探讨RouterChain的智能路由决策与TransformChain的数据处理能力,以及文档处理链在信息处理中的独特价值。此外,介绍如何自定义链,满足个性化需求。


一、Chains

     ChainsLangchain中是一个处理单元,负责接收输入数据、执行特定操作并输出结果。 每个Chain可以独立工作,也可以与其他Chain组合,形成复杂的处理流程。这种设计模式使得数据处理变得模块化和可复用,有助于构建高效、灵活且易于维护的应用。

    在简单应用中,单独使用LLM是可以的,但更复杂的应用需要将LLM进行链接。例如,我们可以创建一个链,该链接收用户输入,使用PromptTemplate对其进行格式化,然后将格式化后的响应传递给LLM。链允许我们将多个组件组合在一起创建一个单一的、连贯的应用。

四个常用的链:

- LLMChain:一个链,将一个LLM和一个PromptTemplate组合在一起。

- SimpleSequentialChain:一个简单的链,将一个链的输出作为下一个链的输入。

- SequentialChain:一个更复杂的链,允许我们定义多个链,并将它们链接在一起。

- ConversationChain:一个链,将一个LLM和一个ConversationPromptTemplate组合在一起。

二、LLMChain⭐

1.LLMChain介绍

    LLMChain 是一个在语言模型周围添加功能的简单链,它被广泛地应用于LangChain中,包括其他链和代理。LLMChain由一个PromptTemplate和一个语言模型(LLM或聊天模型)组成。它接受用户输入,使用PromptTemplate进行格式化,然后将格式化后的响应传递给LLM

2.LLMChain案例

from langchain_community.llms import Tongyi
from langchain.prompts.prompt import PromptTemplate
from langchain.chains import LLMChain

prompt_template = PromptTemplate.from_template("你是一个大厨,如何制作{food_name}?")
model = Tongyi()
chain = LLMChain(llm=model, prompt=prompt_template,verbose=True)
ret = chain.invoke({"food_name": "烤鱼"})
print(ret)

在这里插入图片描述

三、SimpleSequentialChain⭐

1.SimpleSequentialChain介绍

    SimpleSequentialChainLangchain框架中的一种顺序链类型,它的主要特点是每个步骤都具有单一输入/输出,并且一个步骤的输出是下一个步骤的输入。

2.SimpleSequentialChain案例

from langchain_community.llms import Tongyi
from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain
from langchain.chains import SimpleSequentialChain

llm = Tongyi()
# 第一个链
prompt_template1 = PromptTemplate.from_template("使下面文本{text}转成小写")
chain_1 = LLMChain(llm=llm, prompt=prompt_template1, verbose=True)
# 第二个链
prompt_template2 = PromptTemplate.from_template("只去掉{text_x}文本中的标点符号,然后输出转换后的文本,其他任何内容都不要改变")
chain_2 = LLMChain(llm=llm, prompt=prompt_template2, verbose=True)
# 构造 SimpleSequentialChain
chain_ss = SimpleSequentialChain(chains=[chain_1, chain_2], verbose=True)
ret = chain_ss.invoke("Hello,World!!!")
print(ret)

在这里插入图片描述
在这里插入图片描述

四、SequentialChain⭐

1.SequentialChain介绍

SequentialChainLangChain库中的一个重要概念,它允许用户将多个链(Chain)按照特定的顺序连接起来,形成一个处理流程。

对比:

  • SimpleSequentialChain:这是SequentialChain的最简单形式,其中每个步骤都具有单一输入/输出,并且一个步骤的输出是下一个步骤的输入。
  • SequentialChain:更通用形式的顺序链,允许多个输入/输出,可以处理更复杂的场景。

2.SequentialChain案例

# SequentialChain
from langchain.chains.llm import LLMChain
from langchain_community.llms import Tongyi
from langchain.prompts import ChatPromptTemplate
from langchain.chains.sequential import SequentialChain

llm = Tongyi()

#chain 1 任务:翻译成中文
first_prompt = ChatPromptTemplate.from_template("把下面内容翻译成中文:\n\n{content}")
chain_one = LLMChain(
    llm=llm,
    prompt=first_prompt,
    verbose=True,
    output_key="Chinese_Rview",
)

#chain 2 任务:对翻译后的中文进行总结摘要 input_key是上一个chain的output_key
second_prompt = ChatPromptTemplate.from_template("用一句话总结下面内容:\n\n{Chinese_Rview}")
chain_two = LLMChain(
    llm=llm,
    prompt=second_prompt,
    # verbose=True,
    output_key="Chinese_Summary",
)

#chain 3 任务:智能识别语言 input_key是上一个chain的output_key
third_prompt = ChatPromptTemplate.from_template("下面内容是什么语言:\n\n{Chinese_Summary}")
chain_three = LLMChain(
    llm=llm,
    prompt=third_prompt,
    # verbose=True,
    output_key="Language",
)

#chain 4 任务:针对摘要使用指定语言进行评论 input_key是上一个chain的output_key
fourth_prompt = ChatPromptTemplate.from_template("请使用指定的语言对以下内容进行回复:\n\n内容:{Chinese_Summary}\n\n语言:{Language}")
chain_four = LLMChain(
    llm=llm,
    prompt=fourth_prompt,
    verbose=True,
    output_key="Reply",
)

#overall 任务:翻译成中文->对翻译后的中文进行总结摘要->智能识别语言->针对摘要使用指定语言进行评论
overall_chain = SequentialChain(
    chains=[chain_one, chain_two, chain_three, chain_four],
    verbose=True,
    input_variables=["content"],
    output_variables=["Chinese_Rview", "Chinese_Summary", "Language"],
)

content = "I am a student of Cumulus Education, my course is artificial intelligence, I like this course, because I can get a high salary after graduation"
overall_chain.invoke(content)

在这里插入图片描述

五、RouterChain⭐

    路由链(RouterChain) 在LangChain框架中扮演着重要的角色,它主要用于根据输入的Prompt选择并执行具体的某个链。 这种机制在处理具有不确定性和多样性的输入时尤为有效,能够灵活地根据输入内容路由到最合适的处理链上。

1.RouterChain介绍

    路由链(RouterChain) 是由LLM(大语言模型)根据输入的Prompt去选择具体的某个链。 在路由链中,一般会存在多个Prompt,这些Prompt结合LLM的推理能力来决定下一步应该选择哪个链进行处理。

路由链的组成:
路由链一般涉及到两个核心类:LLMRouterChainMultiPromptChain

  • LLMRouterChain:使用LLM(大语言模型)来路由到可能的选项中。它接收用户输入,通过Prompt的形式让大语言模型进行推理,从而决定下一步应该选择哪个链。
  • MultiPromptChain:该链用于在多个提示词之间路由输入。当你有多个提示词并且只想路由到其中一个时,可以使用这个链。它负责构建多提示词和RouterChain,选择下一个要调用的链,并处理路由逻辑。

2.RouterChain案例

# RouterChain
from langchain.chains.llm import LLMChain
from langchain_community.llms import Tongyi

llm = Tongyi()
from langchain.prompts import PromptTemplate
from langchain.chains.conversation.base import ConversationChain
from langchain.chains.router.llm_router import LLMRouterChain,RouterOutputParser
from langchain.chains.router.multi_prompt_prompt import MULTI_PROMPT_ROUTER_TEMPLATE
from langchain.chains.router import MultiPromptChain

#物理链
physics_template = """您是一位非常聪明的物理教授.\n
您擅长以简洁易懂的方式回答物理问题.\n
当您不知道问题答案的时候,您会坦率承认不知道.\n
下面是一个问题:
{input}"""
physics_prompt = PromptTemplate.from_template(physics_template)

## 物理的任务
physicschain = LLMChain( llm=llm,prompt=physics_prompt)

#数学链
math_template = """您是一位非常优秀的数学教授.\n
您擅长回答数学问题.\n
您之所以如此优秀,是因为您能够将困难问题分解成组成的部分,回答这些部分,然后将它们组合起来,回答更广泛的问题.\n
下面是一个问题:
{input}"""

math_prompt = PromptTemplate.from_template(math_template)

##数学的任务
mathschain = LLMChain(llm=llm, prompt=math_prompt,)

# 默认任务
default_chain = ConversationChain(
    llm = llm,
    output_key="text"
)

# 组合路由任务
destination_chains = {}
destination_chains["physics"] = physicschain
destination_chains["math"] = mathschain

# 定义路由Chain
router_template = MULTI_PROMPT_ROUTER_TEMPLATE.format(destinations="physics:擅长回答物理问题\n math:擅长回答数学问题")
router_prompt = PromptTemplate(
    template=router_template,
    input_variables=["input"],
    output_parser=RouterOutputParser()
)
router_chain = LLMRouterChain.from_llm(
    llm,
    router_prompt
)
chain = MultiPromptChain(
    router_chain=router_chain,
    destination_chains=destination_chains,
    default_chain=default_chain,
    verbose=True
)
question = "什么是牛顿第一定律?"
print(router_chain.invoke(question))
print(chain.run(question))

# question = "2+2等于几?"
# print(router_chain.invoke(question))
# print(chain.run("2+2等于几?"))

在这里插入图片描述
在这里插入图片描述

六、TransformChain⭐

    TransformChain 的核心功能是将给定的数据按照某个特定的函数进行转换,然后将转换后的结果输出给LLM 这使得在将数据发送给LLM之前,可以根据需要对数据进行各种操作,如替换字符串、截取文本等。

1.TransformChain介绍

    TransformChain 允许用户定义自定义的转换函数,这些函数可以应用于chains之间的数据。这意味着,当数据从一个chain传递到另一个chain时,TransformChain可以提供一个或多个转换步骤,以修改或格式化数据,使其符合下一个chain的输入要求。

2.TransformChain案例

    下面的例子是创建一个虚拟转换,它接收一个超长的文本,将文本过滤为仅保留第三个段落,然后将其传递给 LLMChain 进行摘要生成。

# TransformChain --- 通用的转换链
from langchain.chains.llm import LLMChain
from langchain_community.llms import Tongyi

llm = Tongyi()
from langchain.prompts import PromptTemplate
from langchain.chains.llm import LLMChain
from langchain.chains.transform import TransformChain
from langchain.chains.sequential import SimpleSequentialChain



# 第一个任务
def transform_func(inputs:dict) -> dict:
    text = inputs["text"]
    shortened_text = "\n".join(text.split("\n")[3:4])
    return {"output_text":shortened_text}

# 1.创建转换链实例
transform_chain = TransformChain(
    input_variables=["text"],
    output_variables=["output_text"],
    transform=transform_func
)

# 第二个任务
template = """对下面的文字进行总结:
{output_text}

总结:"""

# 创建提示词模板
prompt = PromptTemplate(
    input_variables=["output_text"],
    template=template
)
llm_chain = LLMChain(
    llm = Tongyi(),
    prompt=prompt
)

#使用顺序链连接起来
squential_chain = SimpleSequentialChain(
    chains=[transform_chain,llm_chain],
    verbose=True
)

with open("news.txt",encoding='utf-8') as f:
    letters = f.read()
squential_chain.invoke(letters)

在这里插入图片描述

七、文档处理链

1.StuffDocumentsChain

    StuffDocumentsChainLangChain框架中的一个关键组件,用于处理文档并将其内容整合成单一提示(prompt),再传递给大语言模型(LLM)以获取答案或响应。该组件在文档处理任务中尤为重要,尤其是在需要将多个文档内容作为一个整体输入给LLM时。

核心特点:

  • 整合文档: 能够将多个文档的内容整合成一个单一的提示,简化与大模型的交互。
  • 保持上下文: 确保LLM在处理时能够考虑到多个文档之间的上下文关系,从而提高回答的准确性和相关性。
  • 高效利用: 减少调用LLM的次数,因为所有相关文档内容都整合在一个提示中。

适用场景:

  • 当需要处理多个相互关联的文档,并将它们作为整体输入给LLM进行摘要、问答等任务时。
  • 文档拆分较小、一次处理的文档数量较少的场景,以避免超出LLM的token限制。

注意事项:

  • 需要注意文档的数量和长度,避免超出LLM的上下文窗口限制,这可能导致信息丢失或模型性能下降。
  • 在处理大量或长篇文档时,可能需要考虑文档分割或简化的策略。

协同工作:

  • StuffDocumentsChain通常与其他LangChain组件(如LLM加载器、文档加载器等)一起使用,构建完整的文档处理流程。 这种协同工作确保了从文档加载到最终答案生成的整个流程能够顺畅进行。

总之,StuffDocumentsChain通过其独特的文档整合能力,为LangChain框架中的文档处理任务提供了高效、简洁的解决方案,同时确保了上下文的完整性和与大模型交互的便利性。

from langchain.chains.combine_documents.stuff import StuffDocumentsChain
from langchain.chains.llm import LLMChain
from langchain.prompts import PromptTemplate
from langchain_community.document_loaders import PyPDFLoader,TextLoader
from langchain.text_splitter import CharacterTextSplitter

from langchain_community.llms import Tongyi
llm = Tongyi()


# 1 定义prompt模板
prompt_template = """对以下文字做简洁的总结:{text}"""
prompt = PromptTemplate.from_template(prompt_template)

# 2 定义任务
llm_chain = LLMChain(llm=llm, prompt=prompt)

# 3、定义chain
stuff_chain = StuffDocumentsChain(
    llm_chain=llm_chain,
    document_variable_name="text",
)

loader = TextLoader("news.txt",encoding='utf-8')
docs = loader.load()

print(stuff_chain.run(docs))

其中,news.txt 为 爬虫爬取到的一些新闻
在这里插入图片描述

2.RefineDocumentsChain

RefineDocumentsChain是LangChain框架中的一个关键组件,旨在通过顺序和迭代的方式处理多个文档,以生成一个综合了所有文档信息的更准确、全面的答案。以下是该组件的总结:

基本概念

  • 作用: 基于多个文档生成一个综合答案,通过迭代方式不断改进答案质量。
  • 使用场景: 适用于需要综合多个文档信息来回答复杂问题的场景,如问答系统。

工作原理

  1. 初始处理: 首先处理第一个文档,生成初始答案。
  2. 迭代处理: 随后,按顺序处理剩余的每个文档。每次处理时,将当前文档的内容和之前生成的答案作为上下文,生成新的答案。这个过程不断重复,直到所有文档都被处理。
  3. 信息传递: 在处理每个文档时,都会考虑之前文档的内容和结果,确保生成的答案能够综合所有文档的信息。

优点

  1. 准确性: 通过综合多个文档的信息,生成的答案通常更准确、全面。
  2. 可解释性: 顺序和迭代的处理过程使得答案的生成过程更加透明,易于理解和解释。

注意事项

  1. 文档数量: 虽然可以处理多个文档,但文档数量过多可能导致处理时间增加。因此,在实际应用中可能需要考虑文档筛选或合并。
  2. 上下文窗口限制: 受到大模型上下文窗口大小的限制,如果文档总长度超过此限制,可能需要分割文档或采用其他方法处理。

RefineDocumentsChain通过其独特的迭代和顺序处理方式,为处理多个文档并生成综合答案提供了一种高效、准确的方法。

示例:
假设有一个问答系统,用户的问题涉及三个文档A、B和C。使用RefineDocumentsChain处理这些文档时,首先基于文档A生成初始答案。然后,在处理文档B时,会将文档B的内容和之前生成的答案作为上下文,生成一个新的答案。最后,在处理文档C时,同样会将文档C的内容和之前生成的答案作为上下文,生成最终的答案。这样,最终的答案就能够综合文档A、B和C的信息。

from langchain.chains.combine_documents.refine import RefineDocumentsChain
from langchain.chains.llm import LLMChain
from langchain.prompts import PromptTemplate
from langchain_community.document_loaders import PyPDFLoader, TextLoader
from langchain_community.llms.tongyi import Tongyi
from langchain.text_splitter import CharacterTextSplitter
from langchain.chains.summarize import load_summarize_chain

llm = Tongyi()

# 加载问答
# loader = PyPDFLoader("doc/demo.pdf")
loader = TextLoader("news.txt",encoding='utf-8')
docs = loader.load()
#split
text_splitter = CharacterTextSplitter(separator="\n",chunk_size=400, chunk_overlap=0)
split_docs = text_splitter.split_documents(docs)
print(split_docs)

prompt_template = """对以下文字做简洁的总结:
{text}
简洁的总结:"""

prompt = PromptTemplate.from_template(prompt_template)

refine_template = (
    "你的任务是产生最终摘要\n"
    "我们已经提供了一个到某个特定点的现有回答:{existing_answer}\n"
    "我们有机会通过下面的一些更多上下文来完善现有的回答(仅在需要时使用).\n"
    "------------\n"
    "{text}\n"
    "------------\n"
    "根据新的上下文,用中文完善原始回答.\n"
    "如果上下文没有用处,返回原始回答。"
)

refine_prompt = PromptTemplate.from_template(refine_template)

chain = load_summarize_chain(
    llm=llm,
    chain_type="refine",
    question_prompt=prompt,
    refine_prompt = refine_prompt,
    return_intermediate_steps=True,
    input_key = "documents",
    output_key = "output_text",
)
result = chain.invoke({"documents":split_docs})
print("result:\n",result)
print('result["output_text"]:\n',result["output_text"])
print('result["intermediate_steps"][:3]',"\n\n".join(result["intermediate_steps"][:3]))

在这里插入图片描述

3.MapReduceDocumentsChain

    MapReduceDocumentsChainLangChain框架中的一个高效处理大规模文档数据的组件,它借鉴了MapReduce的并行处理思想,并结合了大型语言模型(LLM)的文档处理能力。以下是关键点总结:

基本概念

  • 作用: 用于处理大量文档,通过并行处理提高效率,并通过简化和聚合生成综合结果。
  • 使用场景: 适用于文档数量众多且可以分割成独立部分进行并行计算的场景。

工作原理

  • Map阶段:

    • 将文档集合分割成多个块,每块独立并行处理。
    • 使用LLM对每个文档块进行处理,提取关键信息或生成初步结果。
  • Reduce阶段:

    • 收集Map阶段的所有初步结果。
    • 通过ReduceDocumentsChain或其他组件对结果进行简化、聚合或进一步处理。
    • 最终生成包含所有文档信息的综合输出。

优点

  • 并行处理: 显著提高处理大规模文档数据的效率。
  • 简化文档: 将复杂文档简化为更易处理的格式。
  • 灵活性: 可与其他LangChain组件结合,构建复杂处理流程。

注意事项

  • 文档数量: 处理极大量文档时,需考虑更高效的分割和并行策略。
  • 上下文窗口限制: 避免信息丢失,可能需要分块处理过长文档或文档集合。

与其他组件的协同

  • LLM:依赖LLM进行文档处理,LLM的选择和配置影响性能和效果。
  • ReduceDocumentsChainReduce阶段常用此组件简化和聚合初步结果,其选择和配置影响最终输出的质量和准确性。

    总之,MapReduceDocumentsChain是一个结合MapReduce并行处理和LLM文档处理能力的强大组件,适用于处理大规模、复杂的文档数据,能够显著提高处理效率和结果质量。

from langchain.chains.combine_documents.map_reduce import MapReduceDocumentsChain
from langchain.chains.combine_documents.reduce import ReduceDocumentsChain
from langchain.chains.combine_documents.stuff import StuffDocumentsChain
from langchain.prompts import PromptTemplate
from langchain_community.llms.tongyi import Tongyi
from langchain.chains.llm import LLMChain
from langchain_community.document_loaders import PyPDFLoader,TextLoader
from langchain.text_splitter import CharacterTextSplitter

llm = Tongyi()

#load pdf
# loader = PyPDFLoader("doc/demo.pdf")
loader = TextLoader("news.txt",encoding='utf-8')
docs = loader.load()

text_splitter = CharacterTextSplitter(separator="\n",chunk_size=400, chunk_overlap=0)
split_docs = text_splitter.split_documents(docs)

#map chain
map_template = """对以下文字做简洁的总结:
"{content}"
简洁的总结:"""
map_prompt = PromptTemplate.from_template(map_template)

# 定义任务
map_chain = LLMChain(
    llm=llm, #llm
    prompt=map_prompt,
)

#reduce chain
reduce_template = """以下是一个摘要集合:
{doc_summaries}
将上述摘要与所有关键细节进行总结.
总结:"""
reduce_prompt = PromptTemplate.from_template(reduce_template)

# 定义reduce任务
reduce_chain = LLMChain(
    prompt=reduce_prompt,
    llm=llm,
)

# stuff chain
stuff_chain = StuffDocumentsChain(
    llm_chain=reduce_chain,
    document_variable_name="doc_summaries",
)

# reduce chain
reduce_final_chain = ReduceDocumentsChain(
    combine_documents_chain=stuff_chain,
    #超过4000个token就会切入到下一个stuff_chain
    collapse_documents_chain=stuff_chain,
    token_max=4000,
)

# map reduce chain
map_reduce_chain = MapReduceDocumentsChain(
    llm_chain=map_chain,
    document_variable_name="content",
    reduce_documents_chain=reduce_final_chain,
)

# 默认使用了hugging face上的 GPT-2 模型,下载有问题会报错

summary = map_reduce_chain.invoke(split_docs)
print(summary)

4.MapRerankDocumentsChain

    MapRerankDocumentsChainMapReduceDocumentsChain 类似,先通过 LLM 对每个 document 进行处理,每个答案都会返回一个 score,最后选择 score 最高的答案。MapRerankMapReduce 类似,会大批量的调用 LLM,每个 document 之间是独立处理。

from langchain.chains.combine_documents.map_reduce import MapReduceDocumentsChain
from langchain.chains.combine_documents.reduce import ReduceDocumentsChain
from langchain.chains.combine_documents.stuff import StuffDocumentsChain
from langchain.prompts import PromptTemplate
from langchain_community.llms.tongyi import Tongyi
from langchain.chains.llm import LLMChain
from langchain_community.document_loaders import PyPDFLoader,TextLoader
from langchain.text_splitter import CharacterTextSplitter
from langchain.chains.qa_with_sources import load_qa_with_sources_chain

#load
# loader = PyPDFLoader("doc/demo.pdf")
llm = Tongyi()

loader = TextLoader("news.txt",encoding='utf-8')
docs = loader.load()
#split
text_splitter = CharacterTextSplitter(separator="\n",chunk_size=200, chunk_overlap=0)
split_docs = text_splitter.split_documents(docs)

chain = load_qa_with_sources_chain(
    llm,
    chain_type="map_rerank",
    metadata_keys=['source'],
    return_intermediate_steps=True
)
# print(chain)
query = "中文回答这篇文章的主要内容是什么?"
result = chain.invoke({"input_documents":split_docs,"question":query})
print(result)

在这里插入图片描述

八、自定义链

    示例代码自定义了一个名为 wiki_article_chain 的类,它继承自 Chain 类,用于开发一个维基百科文章生成器。这个类利用了一个语言模型(BaseLanguageModel)和一个提示模板(BasePromptTemplate)来生成文章。

from typing import List, Dict, Any, Optional
from langchain.callbacks.manager import CallbackManagerForChainRun
from langchain.chains.base import Chain
from langchain.prompts.base import BasePromptTemplate
from langchain.base_language import BaseLanguageModel

class wiki_article_chain(Chain):
    """开发一个wiki文章生成器"""
    prompt: BasePromptTemplate
    llm: BaseLanguageModel
    out_key: str = "text"

    @property
    def input_keys(self) -> List[str]:
        """将返回Prompt所需的所有键"""
        return self.prompt.input_variables

    @property
    def output_keys(self) -> List[str]:
        """将始终返回text键"""
        return [self.out_key]

    def _call(
            self,
            inputs: Dict[str, Any],
            run_manager: Optional[CallbackManagerForChainRun] = None,
    ) -> Dict[str, Any]:
        """运行链"""
        prompt_value = self.prompt.format_prompt(**inputs)
        # print("prompt_value:",prompt_value)
        response = self.llm.generate_prompt(
            [prompt_value], callbacks=run_manager.get_child() if run_manager else None
        )
        # print("response:",response)
        if run_manager:
            run_manager.on_text("wiki article is written")
        return {self.out_key: response.generations[0][0].text}

    @property
    def _chain_type(self) -> str:
        """链类型"""
        return "wiki_article_chain"


from langchain_community.llms import Tongyi
from langchain.prompts import PromptTemplate
llm = Tongyi()
prompt = PromptTemplate(
    template="写一篇关于{topic}的维基百科形式的文章",
    input_variables=["topic"]
)

chain = wiki_article_chain(
    llm=llm,
    prompt=prompt
)

# chain.run(topic="人工智能")
ret = chain.invoke({"topic": "人工智能"})
print(ret)

# 使用invoke方法时提供了更多的灵活性,因为它允许你动态地构建输入字典,并在需要时添加或修改键值对。
# 而run方法则更适合于输入参数已知且固定的情况。

在这里插入图片描述


在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2065660.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ArcGIS空间自相关 (Global Moran‘s I)——探究人口空间格局的20年变迁

先了解什么是莫兰指数? 莫兰指数(Morans I)是一种用于衡量空间自相关性的统计量,即它可以帮助我们了解一个地理区域内的观测值是否彼此相关以及这种相关性的强度和方向。 白话版:一句话就是判断数据在空间上有没有自…

ChatGPT3.5/新手使用手册——在线使用详细操作步骤

成长路上不孤单😊【14后小学生一枚,C爱好者,持续分享所学,今日分享主题【ChatGPT新手使用手册】,需要欢迎收藏转发😊😊😊😊😊😊😊&…

学习笔记七:基于Jenkins+k8s+Git+DockerHub等技术链构建企业级DevOps容器云平台

基于Jenkinsk8sGitDockerHub等技术链构建企业级DevOps容器云平台 安装Jenkins在kubernetes中部署jenkins创建名称空间创建pv,上传pv.yaml创建pvc创建一个sa账号通过deployment部署jenkins更新资源清单文件把jenkins前端加上service,提供外部网络访问 配置Jenkins获取…

MQ的优缺点及适用场景

MQ的优缺点及适用场景 1、MQ的优点2、MQ的缺点 💖The Begin💖点点关注,收藏不迷路💖 消息队列(MQ)在软件开发中扮演重要角色,带来解耦、异步、削峰等好处。然而,MQ的引入也伴随着一些…

【Hot100】LeetCode—101. 对称二叉树

目录 1- 思路借助队列 2- 实现⭐101. 对称二叉树——题解思路 3- ACM 实现 原题连接&#xff1a;101. 对称二叉树 1- 思路 借助队列 1- 创建队列&#xff1a;Queue<TreeNode> queue&#xff0c;初始化加入 root.left 和 root.right2- 判断逻辑&#xff1a;while(!queu…

为什么要进行微隔离

在当今数字化时代&#xff0c;随着云计算、大数据、物联网等技术的飞速发展&#xff0c;企业网络环境日益复杂&#xff0c;传统的网络边界防护策略面临着前所未有的挑战。传统的防火墙、入侵检测系统等安全设备虽然在一定程度上能够抵御外部威胁&#xff0c;但在内部网络的安全…

回归分析系列16— 多层次模型

119 多层次模型 19.1 简介 多层次模型&#xff08;也称为层次线性模型或混合效应模型&#xff09;在处理具有嵌套结构的数据时非常有用。例如&#xff0c;在教育数据中&#xff0c;学生嵌套在班级中&#xff0c;班级嵌套在学校中。多层次模型允许我们同时建模这些不同层次的影…

政安晨【零基础玩转各类开源AI项目】基于本地Linux Ubuntu系统部署及应用强大的开源AI音乐生成工具:AudioCraft

目录 简介 部署 下载项目 创建虚拟环境 激活虚拟环境 安装依赖 启动 成功 政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff01; 简介 A…

c++每日练习记录4-(递归思想)

题解1迭代&#xff1a; 利用利用两个新的指针&#xff0c;一个用于保存输出的初始节点&#xff0c;另外一个用于地址的迭代指向。 ListNode *mergeTwoLists(ListNode *list1, ListNode *list2){ListNode *list_node new ListNode(0);ListNode *list_node1 list_node;while (l…

看图学sql之sql 中的UNION 和union all

UNION 用于合并两个或者多个 SELECT 语句的结果集 语法&#xff1a; SELECT column1, column2 ... FROM table1, table2 [WHERE condition1]UNION / UNION ALLSELECT column1, column2 ... FROM table1, table2 [WHERE condition2] 数据分析社区直达 免费数据分析资料下载。…

C#使用 ModeBusTCP读取汇川Easy521PLC

Modbus TCP是一种基于以太网TCP/IP的Modbus协议变种&#xff0c;它允许Modbus协议在以太网网络上运行&#xff0c;使得设备之间可以通过IP网络交换数据。Modbus由MODICON公司于1979年开发&#xff0c;是一种工业现场总线协议标准&#xff0c;广泛应用于工业自动化领域。 #regio…

【嵌入式】总结指南——Linux下的裸机驱动开发

板型:正点原子 I.MX6UL MINI 屏幕&#xff1a;7寸 1024*600 立意&#xff1a;既是这一段学习的总结&#xff0c;也可作为入门指南的参考&#xff0c;不过并不能作为教程来看&#xff0c;实际学习还是要找相应的视频或文章教程。 一、历程 应该和使用这块板子的大部分人一样&a…

理解List AbstractList ArrayList

ArrayList 实现了 List 接口&#xff0c;继承了 AbstractList 抽象类。 Q: 为什么要ArrayList继承AbstractList&#xff0c;让AbstractList实现List&#xff1f;而不是让ArrayList直接实现List&#xff1f; A: 接口中全都是抽象的方法&#xff0c;而抽象类中可以有抽象方法&am…

【达梦数据库】shell脚本获取集群内确认监视器地址

目录 1、需求2、想法3、实现代码4、检验效果4.1、集群内任意节点使用非dmdba用户执行4.2、集群内任意节点使用dmdba用户执行4.2.1、数据库主备节点执行4.2.1、数据库确认监视器节点执行 4.3、非集群内节点执行 1、需求 有确认监视器的集群&#xff0c;在集群的任何一个集群上执…

Android13 app后台无法启动Abort background activity starts from

总纲 android13 rom 开发总纲说明 目录 1.前言 2.log分析 3.代码查找分析 4.修改方法 5.编译测试 6彩蛋 1.前言 Android13 用户app后台无法启动,提示Abort background activity starts from 10111 2.log分析 08-07 21:37:36.703: W/ActivityTaskManager(440): Back…

Llama3.1大模型

背景 Llama 3.1是一款由Meta&#xff08;前Facebook&#xff09;推出的先进大型语言模型。它在自然语言处理领域具有显著优势&#xff0c;为用户提供高质量的文本生成、理解和推理能力。 Transformer架构 Transformer是一种神经网络架构&#xff0c;可以处理文本、音频、视频和…

无线数传模块有啥特点?

一 、 模块特点  支持 RS485RTU 、RS232、UART 标准协议  AES加密  供电电压DC4.5V——5.5V  工作频段 410~525MHz, 免申请频段  标准配置提供多达 115信道 …

数据结构-递归算法-第四天

参考文献&#xff1a; 华为云 博客园 labuladong 的算法笔记 递归是一种编程技巧&#xff0c;一种解决问题的思维方式&#xff1b;分治算法和动态规划很大程度上是递归思想基础上的&#xff08;虽然动态规划的最终版本大都不是递归了&#xff0c;但解题思想还是离不开递归&…

数学建模之数据分析【七】:对Pandas DataFrame 进行切片

文章目录 一、切片简介二、创建Pandas数据框三、使用iloc进行切片3.1 对行进行切片3.2 对列进行切片3.3 Dataframe选中特定单元格 四、使用loc创建切片4.1 使用Python对Dataframe中的行进行切片4.2 指定单元格 五、在Python中使用布尔条件六、结论 对 Pandas DataFrames 进行切…

水战再起波澜,“怡宝”要下好怎样一盘棋?

不少投资者常把那些刚需性强、永远也不可能淘汰的产业称为“日不落产业”&#xff0c;从细分板块来看&#xff0c;水无疑具有一定代表性。农夫山泉掌门人钟晱晱曾直言&#xff1a;“我选择了一个日不落的产业&#xff0c;你永远要喝水&#xff0c;不可能不喝水。” 多年下来&a…