LangChain学习三:链-实战

本文介绍了LangChain的学习内容,包括LLMChain的使用方法,如声明、送入大模型,以及顺序链(SimpleSequentialChain和SequentialChain)的概念和实战示例,展示了如何通过链结构组合组件并传递参数。
摘要由CSDN通过智能技术生成

上一节内容:LangChain学习二:提示-实战(下半部分)

LangChain学习二:提示-实战(下半部分)

学习目标:明白链是什么?有哪些?怎么用?


学习内容一:介绍

  链允许我们将多个组件组合在一起,创建一个单一的、一致的应用程序。

例如,我们可以创建一个链,该链接接受用户输入,使用 PromptTemplate 对其进行格式化,然后将格式化后的响应传递给 LLM。我们可以通过将多个链组合在一起,或者通过将链与其他组件组合在一起,来构建更复杂的链。

学习内容二:有那些

  • LLMChain:是一个简单的链,它接受一个提示模板,使用用户输入对其进行格式化,并从 LLM 返回响应。

学习内容三:实战

3.1 LLMChain

LLMChain:是一个简单的链,它接受一个提示模板,使用用户输入对其进行格式化,并从 LLM 返回响应。

3.1.1 声明:接入大模型、声明PromptTemplate、LLMChain

from langchain.prompts import PromptTemplate

from langchain.chat_models import ChatOpenAI
llm=ChatOpenAI(
            streaming=True,
            verbose=True,
            temperature=0,
            # callbacks=[callback],
            openai_api_key='none',
            openai_api_base='http://localhost:8000/v1',
            model_name="Qwen-7B-Chat"
        )
prompt = PromptTemplate(
    input_variables=["product"],
    template="一个制造{product}产品的公司的好名字是什么?中文",
)

from langchain.chains import LLMChain
# 将llm和prompt 进行和LLMChain关联
chain = LLMChain(llm=llm, prompt=prompt)

3.1.2 送入大模型

#只运行指定输入变量的链
print(chain.run("各种颜色的袜子"))

在这里插入图片描述
当然上面我们直接用PromptTemplate模板的,如果是聊天模型,可以是以下做法

from langchain.prompts import PromptTemplate

from langchain.chat_models import ChatOpenAI
llm=ChatOpenAI(
            streaming=True,
            verbose=True,
            temperature=0,
            # callbacks=[callback],
            openai_api_key='none',
            openai_api_base='http://localhost:8000/v1',
            model_name="Qwen-7B-Chat"
        )
from langchain.prompts.chat import (
    ChatPromptTemplate,
    HumanMessagePromptTemplate,
)
human_message_prompt = HumanMessagePromptTemplate(
        prompt=PromptTemplate(
            template="一个制造{product}产品的公司的好名字是什么?中文",
            input_variables=["product"],
        )
    )
chat_prompt_template = ChatPromptTemplate.from_messages([human_message_prompt])
from langchain.chains import LLMChain
chain = LLMChain(llm=llm, prompt=chat_prompt_template)
print(chain.run("各种颜色的袜子"))

效果也是一样的

在这里插入图片描述

3.1.3.多个参数

在上面的情况我们只是定义了一个product变量,如果我们有多个变量呢,这时候我们可以传一个字典进去
字典格式{‘变量名’:变量值,‘变量名’:变量值}

  • chain.run(字典):直接出结果
  • chain(inputs=字典):变量和结果,可以return_only_outputs=True 只输出结果
from langchain.prompts import PromptTemplate

from langchain.chat_models import ChatOpenAI
llm=ChatOpenAI(
            streaming=True,
            verbose=True,
            temperature=0,
            # callbacks=[callback],
            openai_api_key='none',
            openai_api_base='http://localhost:8000/v1',
            model_name="Qwen-14B-Chat"
        )
from langchain.prompts.chat import (
    ChatPromptTemplate,
    HumanMessagePromptTemplate,
)
human_message_prompt = HumanMessagePromptTemplate(
        prompt=PromptTemplate(
            template="一个制造{product}产品的{name}公司的好名字是什么?中文",
            input_variables=["product","name"],
        )
    )
chat_prompt_template = ChatPromptTemplate.from_messages([human_message_prompt])
from langchain.chains import LLMChain
chain = LLMChain(llm=llm, prompt=chat_prompt_template)

print(chain.run({'product':"食品",'name':"提供"}))

out=chain(inputs={'product':"食品",'name':"提供"})

print(out)

在这里插入图片描述

out=chain(inputs={'product':"食品",'name':"提供"},return_only_outputs=True)

print(out)

在这里插入图片描述

3.2 顺序链

  1. SimpleSequentialChain(简单顺序链):最简单的顺序链形式,每个步骤都有一个单一的输入/输出,一个步骤的输出是下一个步骤的输入。
  • 步骤1:输入A → 输出B
  • 步骤2:输入B → 输出C
  • 步骤3:输入C → 输出D

依此类推,每个步骤都只有一个输入和一个输出,前一个步骤的输出作为后一个步骤的输入。
2. SequentialChain(顺序链):更一般的顺序链形式,允许多个输入/输出。

  • 步骤1:输入A、输入B → 输出C
  • 步骤2:输入C、输入D → 输出E
  • 步骤3:输入E、输入F → 输出G

依此类推,每个步骤可以有多个输入和多个输出。每个步骤的输入可以来自于前面的多个步骤的输出,输出也可以传递给后面的多个步骤作为输入。

3.2.1 SimpleSequentialChain(简单顺序链)实战

from langchain import PromptTemplate, LLMChain
from langchain.chat_models import ChatOpenAI

from langchain.schema import HumanMessage

llm = ChatOpenAI(
    streaming=True,
    verbose=True,
    # callbacks=[callback],
    openai_api_key="none",
    openai_api_base='http://localhost:8000/v1',
    model_name="Qwen-7B-Chat"
)



template = """你是个剧作家。给定剧本的标题,你的工作就是为这个标题写一个大纲。
标题:{{title}}
剧作家:这是上面那出戏的梗概:"""
prompt_template = PromptTemplate(input_variables=["title"], template=template,template_format="jinja2")
# 一、这是一个给剧名写大纲的LLMChain。
synopsis_chain = LLMChain(llm=llm, prompt=prompt_template)


template = """你是《纽约时报》的剧评家。有了剧本的梗概,你的工作就是为剧本写一篇评论。
游戏简介:
{{synopsis}}
《纽约时报》剧评人对此剧的评论:"""
prompt_template = PromptTemplate(input_variables=["synopsis"], template=template,template_format="jinja2")
# 二、这是一个LLMChain,给一个剧本大纲写一篇评论。
review_chain = LLMChain(llm=llm, prompt=prompt_template)

# 三、这是整个链我们按顺序运行这两条链。
from langchain.chains import SimpleSequentialChain

overall_chain = SimpleSequentialChain(chains=[synopsis_chain, review_chain], verbose=False)


review = overall_chain.run("日落海滩上的悲剧")


print(review)

在这里插入图片描述

3.2.2 SequentialChain(顺序链)实战

from langchain import PromptTemplate, LLMChain
from langchain.chat_models import ChatOpenAI

from langchain.schema import HumanMessage

llm = ChatOpenAI(
    streaming=True,
    verbose=True,
    # callbacks=[callback],
    openai_api_key="none",
    openai_api_base='http://localhost:8000/v1',
    model_name="Qwen-7B-Chat"
)

template = """你是个剧作家。考虑到剧名和它所处的时代背景,你的工作就是为剧名写一个大纲。
标题:{{title}}
时代:{{era}}
剧作家:这是上面那出戏的梗概:"""
prompt_template = PromptTemplate(input_variables=["title", "era"], template=template, template_format="jinja2")
# 一、这是一个给剧名写大纲的LLMChain。
synopsis_chain = LLMChain(llm=llm, prompt=prompt_template, output_key="synopsis")

template = """你是《纽约时报》的剧评家。有了剧本的梗概,你的工作就是为剧本写一篇评论。
游戏简介:
{{synopsis}}
《纽约时报》剧评人对此剧的评论:"""
prompt_template = PromptTemplate(input_variables=["synopsis"], template=template, template_format="jinja2")
# 二、这是一个LLMChain,给一个剧本大纲写一篇评论。
review_chain = LLMChain(llm=llm, prompt=prompt_template, output_key="review")

# 三、这是整个链我们按顺序运行这两条链。
from langchain.chains import SequentialChain

overall_chain = SequentialChain(chains=[synopsis_chain, review_chain],
                                input_variables=["era", "title"],
                                # 这里我们返回多个变量
                                output_variables=["synopsis", "review"], verbose=False)

review = overall_chain({"title": "日落海滩上的悲剧", "era": "维多利亚时代的英国"})

print(review)


#结果如下
# {'title': '日落海滩上的悲剧',
#  'era': '维多利亚时代的英国',
#  'synopsis': '在维多利亚时代的英国,一位名叫艾米莉亚的年轻女子在日落海滩上发现了一个神秘的瓶子。瓶子里装着一封信,信中描述了一段悲惨的爱情故事。艾米莉亚被这个故事深深打动,并决定找出这个故事的真相。\n\n随着剧情的发展,艾米莉亚开始调查这个故事的来源,并逐渐揭示了隐藏在这个故事背后的秘密。她发现这封信是由一名叫做威廉的男子写的,他在19世纪末期与他的爱人艾米丽相爱,但由于社会的压力和家庭的反对,他们的爱情最终以悲剧收场。\n\n艾米莉亚深入挖掘这段历史,发现了更多关于威廉和艾米丽的故事。她了解到他们曾经试图逃离英国,但最终失败并被迫分开。威廉在绝望中写下这封信,希望有人能够找到它,并了解他们的故事。\n\n然而,当艾米莉亚试图将这个故事公之于众时,她遭到了来自社会和家庭的强烈反对。她的父亲认为这个故事会破坏家族名誉,而她的朋友们则担心这会让人们对她产生误解。\n\n尽管面临重重困难,艾米莉亚仍然坚持自己的信念,并最终成功地将这个故事公之于众。她的勇气和决心赢得了人们的尊重和赞扬,也让人们对那个时代的社会问题有了更深的理解和反思。\n\n这部剧通过讲述一个悲剧性的爱情故事,揭示了维多利亚时代英国的社会问题和人性的复杂性。同时,它也展现了一个人如何通过勇气和决心,挑战传统观念和社会压力,实现自我价值的过程。',
#  'review': '《日落海滩的秘密》是一部引人入胜的历史剧,以其深情的故事、出色的演员表演和精美的制作获得了观众的喜爱。该剧通过讲述一个悲剧性的爱情故事,揭示了维多利亚时代英国的社会问题和人性的复杂性,同时也展现了一个女性如何通过勇气和决心,挑战传统观念和社会压力,实现自我价值的过程。\n\n艾米莉亚的角色由一位才华横溢的女演员扮演,她的表演充满了情感和深度,让人为她的坚韧不拔和无私奉献感到敬佩。其他演员的表演也非常出色,他们成功地塑造了一系列生动的人物形象,使观众对剧中人物的命运产生了深深的同情和关注。\n\n剧中的服装设计和布景都非常精美,完美地再现了维多利亚时代的英国风貌。音乐和配乐也非常出色,它们增强了剧的情感效果,使观众更加沉浸在故事的情境之中。\n\n总的来说,《日落海滩的秘密》是一部值得一看的优秀剧目。它不仅提供了娱乐,还让我们思考了一些重要的社会问题。我强烈推荐大家去看这部电影。'
#  }

在这里插入图片描述

3.2.3 SimpleMemory (顺序链中的记忆)

有时您可能想传递一些上下文以在链的每个步骤或链的后面部分中使用,但维护和链接输入/输出变量可能会很快变得混乱。使用 SimpleMemory 是一种方便的方式来管理这个问题并清理您的链。

举个例子,假设你使用之前介绍过的SequentialChain,你想要在剧本中添加一些关于日期、时间和地点的上下文信息,并且使用生成的简介和评论来创建一些社交媒体发布文本。你可以将这些新的上下文变量添加为input_variables,或者我们可以添加一个SimpleMemory到链中来管理这个上下文:

from langchain import PromptTemplate, LLMChain
from langchain.chat_models import ChatOpenAI
from langchain.memory import SimpleMemory

from langchain.schema import HumanMessage

llm = ChatOpenAI(
    streaming=True,
    verbose=True,
    # callbacks=[callback],
    openai_api_key="none",
    openai_api_base='http://localhost:8000/v1',
    model_name="Qwen-7B-Chat"
)

template = """你是个剧作家。考虑到剧名和它所处的时代背景,你的工作就是为剧名写一个大纲。
标题:{{title}}
时代:{{era}}
剧作家:这是上面那出戏的梗概:"""
prompt_template = PromptTemplate(input_variables=["title", "era"], template=template, template_format="jinja2")
# 一、这是一个给剧名写大纲的LLMChain。
synopsis_chain = LLMChain(llm=llm, prompt=prompt_template, output_key="synopsis")

template = """你是《纽约时报》的剧评家。有了剧本的梗概,你的工作就是为剧本写一篇评论。
游戏简介:
{{synopsis}}
《纽约时报》剧评人对此剧的评论:"""
prompt_template = PromptTemplate(input_variables=["synopsis"], template=template, template_format="jinja2")
# 二、这是一个LLMChain,给一个剧本大纲写一篇评论。
review_chain = LLMChain(llm=llm, prompt=prompt_template, output_key="review")

# 三、这是整个链我们按顺序运行这两条链。
from langchain.chains import SequentialChain

overall_chain = SequentialChain(chains=[synopsis_chain, review_chain],
                                input_variables=["era", "title"],
                                # 这里我们返回多个变量
                                output_variables=["synopsis", "review"], verbose=False)

review = overall_chain({"title": "日落海滩上的悲剧", "era": "维多利亚时代的英国"})

# 四、这里我们新建一个提示词
template = """你是一家戏剧公司的社交媒体经理。根据剧名、所处的时代、日期、时间和地点、剧作梗概和剧评,你的工作就是为这部剧作写一篇社交媒体帖子。

以下是关于戏剧发生的时间和地点的一些背景:
日期和时间:{{time}}
地点:{{location}}

游戏简介:
{{synopsis}}
《纽约时报》剧评人对此剧的评论:
{{review}}

社交媒体帖子:
"""
prompt_template = PromptTemplate(input_variables=["synopsis", "review", "time", "location"], template=template,
                                 template_format="jinja2")
# social_post_text作为输出变量
social_chain = LLMChain(llm=llm, prompt=prompt_template, output_key="social_post_text")

# print(review)
from langchain.memory import SimpleMemory

overall_chain = SequentialChain(
    memory=SimpleMemory(memories={"time": "太平洋标准时间12月25日晚上8点", "location": "公园剧场"}),
    chains=[synopsis_chain, review_chain, social_chain],
    input_variables=["era", "title"],
    # Here we return multiple variables
    output_variables=["social_post_text"],
    verbose=False)
result = overall_chain({"title": "日落海滩上的悲剧", "era": "维多利亚时代的英国"})
print(result)
# {'title': '日落海滩上的悲剧', 
#  'era': '维多利亚时代的英国', 
#  'time': '太平洋标准时间12月25日晚上8点',
#  'location': '公园剧场',
#  'social_post_text': '🎉今晚8点,我们将在公园剧场上演一部引人入胜的历史剧——《日落海滩的秘密》!在这部剧中,你会看到一个关于爱、勇气和决心的故事,让你对维多利亚时代的英国社会有更深入的了解。\n\n劇情简介:在日落海滩上,年轻的艾米莉亚发现了一个神秘的瓶子,里面装着一封描述一段悲惨爱情故事的信。她被这个故事深深打动,并决定找出这个故事的真相。随着剧情的发展,艾米莉亚开始调查这个故事的来源,并逐渐揭示了隐藏在这个故事背后的秘密。\n\n《纽约时报》剧评人评价:“《日落海滩的秘密》是一部深情的故事,出色的演员表演和精美的制作获得了观众的喜爱。”不要错过这场精彩的演出,购票链接在我们的网站上,赶快行动吧!#日落海滩的秘密 #公园剧场 #维多利亚时代 #历史剧'}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码浪人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值