首页 > 其他分享 >小北的字节跳动青训营与LangChain实战课:深入探索Chain的奥秘(上)写一篇完美鲜花推文?用SequencialChain链接不同的组件(持续更新中~~~)

小北的字节跳动青训营与LangChain实战课:深入探索Chain的奥秘(上)写一篇完美鲜花推文?用SequencialChain链接不同的组件(持续更新中~~~)

时间:2024-11-10 20:16:37浏览次数:6  
标签:Zhiyilang Chain LangChain blog csdn details 青训营 article net

 前言

       最近,字节跳动的青训营再次扬帆起航,作为第二次参与其中的小北,深感荣幸能借此机会为那些尚未了解青训营的友友们带来一些详细介绍。青训营不仅是一个技术学习与成长的摇篮,更是一个连接未来与梦想的桥梁~

小北的青训营 X MarsCode 技术训练营——AI 加码,字节跳动青训营入营考核解答(持续更新中~~~)-CSDN博客https://blog.csdn.net/Zhiyilang/article/details/143384787?sharetype=blogdetail&sharerId=143384787&sharerefer=PC&sharesource=Zhiyilang&spm=1011.2480.3001.8118​编辑https://blog.csdn.net/Zhiyilang/article/details/143384787?sharetype=blogdetail&sharerId=143384787&sharerefer=PC&sharesource=Zhiyilang&spm=1011.2480.3001.8118https://blog.csdn.net/Zhiyilang/article/details/143384787?sharetype=blogdetail&sharerId=143384787&sharerefer=PC&sharesource=Zhiyilang&spm=1011.2480.3001.8118https://blog.csdn.net/Zhiyilang/article/details/143384787?sharetype=blogdetail&sharerId=143384787&sharerefer=PC&sharesource=Zhiyilang&spm=1011.2480.3001.8118https://blog.csdn.net/Zhiyilang/article/details/143384787?sharetype=blogdetail&sharerId=143384787&sharerefer=PC&sharesource=Zhiyilang&spm=1011.2480.3001.8118https://blog.csdn.net/Zhiyilang/article/details/143384787?sharetype=blogdetail&sharerId=143384787&sharerefer=PC&sharesource=Zhiyilang&spm=1011.2480.3001.8118https://blog.csdn.net/Zhiyilang/article/details/143384787?sharetype=blogdetail&sharerId=143384787&sharerefer=PC&sharesource=Zhiyilang&spm=1011.2480.3001.8118icon-default.png?t=O83Ahttps://blog.csdn.net/Zhiyilang/article/details/143384787?sharetype=blogdetail&sharerId=143384787&sharerefer=PC&sharesource=Zhiyilang&spm=1011.2480.3001.8118

小北的字节跳动青训营与 LangChain 实战课:探索 AI 技术的新边界(持续更新中~~~)-CSDN博客​编辑https://blog.csdn.net/Zhiyilang/article/details/143454165https://blog.csdn.net/Zhiyilang/article/details/143454165https://blog.csdn.net/Zhiyilang/article/details/143454165https://blog.csdn.net/Zhiyilang/article/details/143454165https://blog.csdn.net/Zhiyilang/article/details/143454165https://blog.csdn.net/Zhiyilang/article/details/143454165icon-default.png?t=O83Ahttps://blog.csdn.net/Zhiyilang/article/details/143454165
小北的字节跳动青训营与LangChain系统安装和快速入门学习(持续更新中~~~)。-CSDN博客​编辑https://blog.csdn.net/Zhiyilang/article/details/143455380https://blog.csdn.net/Zhiyilang/article/details/143455380https://blog.csdn.net/Zhiyilang/article/details/143455380https://blog.csdn.net/Zhiyilang/article/details/143455380https://blog.csdn.net/Zhiyilang/article/details/143455380https://blog.csdn.net/Zhiyilang/article/details/143455380icon-default.png?t=O83Ahttps://blog.csdn.net/Zhiyilang/article/details/143455380

小北的字节跳动青训营用LangChain打造“易速鲜花”内部员工知识库问答系统(持续更新中~~~)-CSDN博客​编辑https://blog.csdn.net/Zhiyilang/article/details/143456544https://blog.csdn.net/Zhiyilang/article/details/143456544https://blog.csdn.net/Zhiyilang/article/details/143456544https://blog.csdn.net/Zhiyilang/article/details/143456544https://blog.csdn.net/Zhiyilang/article/details/143456544https://blog.csdn.net/Zhiyilang/article/details/143456544icon-default.png?t=O83Ahttps://blog.csdn.net/Zhiyilang/article/details/143456544小北的字节跳动青训营与提示工程(上):用少样本FewShotTemplate和ExampleSelector创建应景文案(持续更新中~~~)-CSDN博客https://blog.csdn.net/Zhiyilang/article/details/143468624?sharetype=blogdetail&sharerId=143468624&sharerefer=PC&sharesource=Zhiyilang&spm=1011.2480.3001.8118https://blog.csdn.net/Zhiyilang/article/details/143468624?sharetype=blogdetail&sharerId=143468624&sharerefer=PC&sharesource=Zhiyilang&spm=1011.2480.3001.8118https://blog.csdn.net/Zhiyilang/article/details/143468624?sharetype=blogdetail&sharerId=143468624&sharerefer=PC&sharesource=Zhiyilang&spm=1011.2480.3001.8118icon-default.png?t=O83Ahttps://blog.csdn.net/Zhiyilang/article/details/143468624?sharetype=blogdetail&sharerId=143468624&sharerefer=PC&sharesource=Zhiyilang&spm=1011.2480.3001.8118小北的字节跳动青训营与提示工程(下):用思维链和思维树提升模型思考质量(持续更新中~~~)-CSDN博客https://blog.csdn.net/Zhiyilang/article/details/143494432https://blog.csdn.net/Zhiyilang/article/details/143494432icon-default.png?t=O83Ahttps://blog.csdn.net/Zhiyilang/article/details/143494432小北的字节跳动青训营与调用模型:调用模型:OpenAI API vs 微调开源Llama2/ChatGLM(持续更新中~~~)-CSDN博客https://blog.csdn.net/Zhiyilang/article/details/143495077icon-default.png?t=O83Ahttps://blog.csdn.net/Zhiyilang/article/details/143495077小北的字节跳动青训营与LangChain实战课:深入探索输出解析器与Pydantic解析器重构(持续更新中~~~)-CSDN博客icon-default.png?t=O83Ahttps://blog.csdn.net/Zhiyilang/article/details/143497148?sharetype=blogdetail&sharerId=143497148&sharerefer=PC&sharesource=Zhiyilang&spm=1011.2480.3001.8118哈喽哈喽,这里是是zyll~,北浊.欢迎来到小北的 LangChain 实战课学习笔记! 

       在这个充满变革的时代,技术的每一次进步都在推动着世界的快速发展。在这一系列课程中,小北与友友们一同探索了LangChain的诸多应用,见证了其功能的强大与灵活性。或许你已经心生疑问:LangChain中的“Chain”作为核心组件,为何迟迟未露面?今天,我们就来揭开它的神秘面纱。

对于简单的应用程序,直接调用LLM(大型语言模型)通常已足够满足需求。因此,在前面的课程中,我们通过LangChain提供的提示模板、模型接口以及输出解析器,就轻松实现了所需功能。然而,当面对更复杂的应用程序时,我们就需要借助“Chain”来链接LangChain的各个组件和功能,无论是模型之间的链接,还是模型与其他组件的链接。我们先使用一下最基础也是最常见的LLMChain。

Chain的概念与优势

Chain的想法简单而强大:它将多个组件相互链接,组合成一个单一的、连贯的应用程序。这种模块化设计不仅简化了复杂应用程序的实现,还使得调试、维护和改进变得更加容易。通过LangChain设计好的接口,我们可以轻松实现一个具体的链的功能,如LLM链(LLMChain),它能够接受用户输入,使用PromptTemplate进行格式化,然后将格式化的响应传递给LLM,并返回LLM的输出。

LangChain提供了多种类型的预置链,旨在使各种任务的实现更加便捷和规范。接下来,我们将从最基本的LLMChain开始,逐步深入。

LLMChain:最简单的链

LLMChain围绕语言模型推理功能,整合了PromptTemplate、语言模型(LLM或聊天模型)和Output Parser,将Model I/O封装在一个链中整体操作。它使用提示模板格式化输入,将格式化的字符串传递给LLM,并返回LLM的输出。

举例来说,如果我想让大模型告诉我某种花的花语,如果不使用链的示例

#----第一步 创建提示
# 导入LangChain中的提示模板
from langchain import PromptTemplate
# 原始字符串模板
template = "{flower}的花语是?"
# 创建LangChain模板
prompt_temp = PromptTemplate.from_template(template) 
# 根据模板创建提示
prompt = prompt_temp.format(flower='玫瑰')
# 打印提示的内容
print(prompt)

#----第二步 创建并调用模型 
# 导入LangChain中的OpenAI模型接口
from langchain import OpenAI
# 创建模型实例
model = OpenAI(temperature=0)
# 传入提示,调用模型,返回结果
result = model(prompt)
print(result)

输出:

玫瑰的花语是?
爱情、浪漫、美丽、永恒、誓言、坚贞不渝。

此时Model I/O的实现分为两个部分,提示模板的构建和模型的调用独立处理。

如果使用链,代码结构则显得更简洁。

使用链的示例

# 导入所需的库
from langchain import PromptTemplate, OpenAI, LLMChain
# 原始字符串模板
template = "{flower}的花语是?"
# 创建模型实例
llm = OpenAI(temperature=0)
# 创建LLMChain
llm_chain = LLMChain(
    llm=llm,
    prompt=PromptTemplate.from_template(template))
# 调用LLMChain,返回结果
result = llm_chain("玫瑰")
print(result)

输出:

{'flower': '玫瑰', 'text': '\n\n爱情、浪漫、美丽、永恒、誓言、坚贞不渝。'}

在这里,提示模板的构建和模型的调用被封装在了一起,使得代码更加简洁明了。

链的调用方式

链有多种调用方式,包括直接调用、通过run方法、通过predict方法、通过apply方法以及通过generate方法。每种方式都有其特定的应用场景和优势。

  • 直接调用:像函数一样调用链对象,实际上会调用该对象内部实现的__call__方法。
  • 通过run方法:等价于直接调用。
  • 通过predict方法:输入键被指定为关键字参数而不是Python字典。
  • 通过apply方法:允许我们针对输入列表运行链,一次处理多个输入。
  • 通过generate方法:返回一个LLMResult对象,包含模型生成文本过程中的一些相关信息。

通过run方法

 刚才我们是直接调用的链对象。当我们像函数一样调用一个对象时,它实际上会调用该对象内部实现的__call__方法。如果你的提示模板中包含多个变量,在调用链的时候,可以使用字典一次性输入它们。

prompt = PromptTemplate(
    input_variables=["flower", "season"],
    template="{flower}在{season}的花语是?",
)
llm_chain = LLMChain(llm=llm, prompt=prompt)
print(llm_chain({
    'flower': "玫瑰",
    'season': "夏季" }))

输出:

{'flower': '玫瑰', 'season': '夏季', 'text': '\n\n玫瑰在夏季的花语是爱的誓言,热情,美丽,坚定的爱情。'}

通过run方法,也等价于直接调用_call_函数。语句:

llm_chain("玫瑰")

 等价于:

llm_chain.run("玫瑰")

通过predict方法

predict方法类似于run,只是输入键被指定为关键字参数而不是 Python 字典。 

result = llm_chain.predict(flower="玫瑰")
print(result)

通过apply方法

apply方法允许我们针对输入列表运行链,一次处理多个输入。

示例如下:

# apply允许您针对输入列表运行链
input_list = [
    {"flower": "玫瑰",'season': "夏季"},
    {"flower": "百合",'season': "春季"},
    {"flower": "郁金香",'season': "秋季"}
]
result = llm_chain.apply(input_list)
print(result)

输出:

'''[{'text': '\n\n玫瑰在夏季的花语是“恋爱”、“热情”和“浪漫”。'}, 
{'text': '\n\n百合在春季的花语是“爱情”和“友谊”。'},
 {'text': '\n\n郁金香在秋季的花语表达的是“热情”、“思念”、“爱恋”、“回忆”和“持久的爱”。'}]'''

通过generate方法

generate方法类似于apply,只不过它返回一个LLMResult对象,而不是字符串。LLMResult通常包含模型生成文本过程中的一些相关信息,例如令牌数量、模型名称等。 

result = llm_chain.generate(input_list)
print(result)

输出: 

generations=[[Generation(text='\n\n玫瑰在夏季的花语是“热情”、“爱情”和“幸福”。', 
generation_info={'finish_reason': 'stop', 'logprobs': None})], 
[Generation(text='\n\n春季的花语是爱情、幸福、美满、坚贞不渝。', 
generation_info={'finish_reason': 'stop', 'logprobs': None})], 
[Generation(text='\n\n秋季的花语是“思念”。银色的百合象征着“真爱”,而淡紫色的郁金香则象征着“思念”,因为它们在秋天里绽放的时候,犹如在思念着夏天的温暖。', 
generation_info={'finish_reason': 'stop', 'logprobs': None})]] 
llm_output={'token_usage': {'completion_tokens': 243, 'total_tokens': 301, 'prompt_tokens': 58}, 'model_name': 'gpt-3.5-turbo-instruct'} 
run=[RunInfo(run_id=UUID('13058cca-881d-4b76-b0cf-0f9c831af6c4')), 
RunInfo(run_id=UUID('7f38e33e-bab5-4d03-b77c-f50cd195affb')), 
RunInfo(run_id=UUID('7a1e45fd-77ee-4133-aab0-431147186db8'))]

Sequential Chain:顺序链

除了LLMChain外,LangChain还提供了SequentialChain等更多类型的链。SequentialChain允许我们将多个链按顺序串联起来,形成一个复杂的处理流程。

示例

假设我们的目标是生成一篇关于某种鲜花的运营文案。我们可以使用三个LLMChain分别生成鲜花的知识性说明、评论和社交媒体帖子,然后将它们串联起来形成一个顺序链。

这个示例中,我们的目标是这样的:

  • 第一步,我们假设大模型是一个植物学家,让他给出某种特定鲜花的知识和介绍。
  • 第二步,我们假设大模型是一个鲜花评论者,让他参考上面植物学家的文字输出,对鲜花进行评论。
  • 第三步,我们假设大模型是易速鲜花的社交媒体运营经理,让他参考上面植物学家和鲜花评论者的文字输出,来写一篇鲜花运营文案。

下面我们就来一步步地实现这个示例。

首先,导入所有需要的库。

# 设置OpenAI API密钥
import os
os.environ["OPENAI_API_KEY"] = '你的OpenAI API Key'

from langchain.llms import OpenAI
from langchain.chains import LLMChain
from langchain.prompts import PromptTemplate
from langchain.chains import SequentialChain

然后,添加第一个LLMChain,生成鲜花的知识性说明。

# 这是第一个LLMChain,用于生成鲜花的介绍,输入为花的名称和种类
llm = OpenAI(temperature=.7)
template = """
你是一个植物学家。给定花的名称和类型,你需要为这种花写一个200字左右的介绍。

花名: {name}
颜色: {color}
植物学家: 这是关于上述花的介绍:"""
prompt_template = PromptTemplate(input_variables=["name", "color"], template=template)
introduction_chain = LLMChain(llm=llm, prompt=prompt_template, output_key="introduction")

接着,添加第二个LLMChain,根据鲜花的知识性说明生成评论。

# 这是第二个LLMChain,用于根据鲜花的介绍写出鲜花的评论
llm = OpenAI(temperature=.7)
template = """
你是一位鲜花评论家。给定一种花的介绍,你需要为这种花写一篇200字左右的评论。

鲜花介绍:
{introduction}
花评人对上述花的评论:"""
prompt_template = PromptTemplate(input_variables=["introduction"], template=template)
review_chain = LLMChain(llm=llm, prompt=prompt_template, output_key="review")

接着,添加第三个LLMChain,根据鲜花的介绍和评论写出一篇自媒体的文案。

# 这是第三个LLMChain,用于根据鲜花的介绍和评论写出一篇自媒体的文案
template = """
你是一家花店的社交媒体经理。给定一种花的介绍和评论,你需要为这种花写一篇社交媒体的帖子,300字左右。

鲜花介绍:
{introduction}
花评人对上述花的评论:
{review}

社交媒体帖子:
"""
prompt_template = PromptTemplate(input_variables=["introduction", "review"], template=template)
social_post_chain = LLMChain(llm=llm, prompt=prompt_template, output_key="social_post_text")

最后,添加SequentialChain,把前面三个链串起来。

# 这是总的链,我们按顺序运行这三个链
overall_chain = SequentialChain(
    chains=[introduction_chain, review_chain, social_post_chain],
    input_variables=["name", "color"],
    output_variables=["introduction","review","social_post_text"],
    verbose=True)

# 运行链,并打印结果
result = overall_chain({"name":"玫瑰", "color": "黑色"})
print(result)

最终的输出如下:

> Entering new  chain...

> Finished chain.
{'name': '玫瑰', 'color': '黑色', 
'introduction': '\n\n黑色玫瑰,这是一种对传统玫瑰花的独特颠覆,它的出现挑战了我们对玫瑰颜色的固有认知。它的花瓣如煤炭般黑亮,反射出独特的微光,而花蕊则是金黄色的,宛如夜空中的一颗星,强烈的颜色对比营造出一种前所未有的视觉效果。在植物学中,黑色玫瑰的出现无疑提供了一种新的研究方向,对于我们理解花朵色彩形成的机制有着重要的科学价值。', 
'review': '\n\n黑色玫瑰,这不仅仅是一种花朵,更是一种完全颠覆传统的艺术表现形式。黑色的花瓣仿佛在诉说一种不可言喻的悲伤与神秘,而黄色的蕊瓣犹如漆黑夜空中的一抹亮色,给人带来无尽的想象。它将悲伤与欢乐,神秘与明亮完美地结合在一起,这是一种全新的视觉享受,也是一种对生活理解的深度表达。', 
'social_post_text': '\n欢迎来到我们的自媒体平台,今天,我们要向您展示的是我们的全新产品——黑色玫瑰。这不仅仅是一种花,这是一种对传统观念的挑战,一种视觉艺术的革新,更是一种生活态度的象征。
这种别样的玫瑰花,其黑色花瓣宛如漆黑夜空中闪烁的繁星,富有神秘的深度感,给人一种前所未有的视觉冲击力。这种黑色,它不是冷酷、不是绝望,而是充满着独特的魅力和力量。而位于黑色花瓣之中的金黄色花蕊,则犹如星星中的灵魂,默默闪烁,给人带来无尽的遐想,充满活力与生机。
黑色玫瑰的存在,不仅挑战了我们对于玫瑰传统颜色的认知,它更是一种生动的生命象征,象征着那些坚韧、独特、勇敢面对生活的人们。黑色的花瓣中透露出一种坚韧的力量,而金黄的花蕊则是生活中的希望,二者的结合恰好象征了生活中的喜怒哀乐,体现了人生的百态。'}

输出将包含鲜花的知识性说明、评论和社交媒体帖子,至此,我们就通过两个LLM链和一个顺序链,生成了一篇完美的文案。

总结与思考题

LangChain为我们提供了强大的“链”功能,帮助我们将多个组件像链条一样连接起来。这个“链条”其实就是一系列组件的调用顺序,可以包含其他的“链条”。我们可以使用多种方法调用链,并根据开发需求选择不同类型的链。

思考题

  1. 在之前的一篇博客中中,小北曾经用提示模板生成过一段鲜花的描述。请你使用LLMChain重构提示的format和获取模型输出部分,完成相同的功能。
    for flower, price in zip(flowers, prices):
        # 根据提示准备模型的输入
        input = prompt.format(flower_name=flower, price=price)
        # 获取模型的输出
        output = model(input)    
        # 解析模型的输出
        parsed_output = output_parser.parse(output)
    

    请你使用LLMChain重构提示的format和获取模型输出部分,完成相同的功能。提示:

        llm_chain = LLMChain(
            llm=model,
            prompt=prompt)
    
  2. 你还可以更进一步,把output_parser也整合到LLMChain中,让程序结构进一步简化。请你尝试一下。
        llm_chain = LLMChain(
            llm=model,
            prompt=prompt,
            output_parser=output_parser)
    
  3. 选择一个LangChain中未使用的链类型(如RouterChain等),尝试使用它解决一个问题,并分享你的用例和代码。

小北觉得题目较多,你可以选择性地思考。期待在留言区看到你的分享!如果友友们觉得内容对你有帮助,也欢迎分享给有需要的朋友!最后,如果你学有余力,可以进一步学习下面的延伸阅读~

延伸阅读

  • GitHub上各种各样的
  • 代码,LLMChain 的实现细节

希望今天小北的博客能够帮助友友们更深入地理解LangChain中的Chain组件。在下一节课中,小北将继续介绍另一种好用的链——RouterChain。敬请期待~

标签:Zhiyilang,Chain,LangChain,blog,csdn,details,青训营,article,net
From: https://blog.csdn.net/Zhiyilang/article/details/143501151

相关文章

  • python实战(七)——基于LangChain的RAG实践
    一、任务目标    基于之前的RAG实战,相信大家对RAG的实现已经有了一定的了解了。这篇文章将使用LangChain作为辅助,实现一个高效、便于维护的RAG程序。二、什么是LangChain        LangChain是一个用于构建大模型应用程序的开源框架,它内置了多个模块化组件。......
  • 字节青训营 兔群繁殖之谜
    兔群繁殖之谜问题描述生物学家小R正在研究一种特殊的兔子品种的繁殖模式。这种兔子的繁殖遵循以下规律:每对成年兔子每个月会生育一对新的小兔子(一雌一雄)。新生的小兔子需要一个月成长,到第二个月才能开始繁殖。兔子永远不会死亡。小R从一对新生的小兔子开始观察。他想知......
  • sudoku 数独 XY-Chains
    XY-ChainsTheY-WingChainsareinfactpartofamoreencompassingstrategycalledXY-Chains.Thecommonalityisthesamepincer-likeattackoncandidatesthatbothendscanseeandthatthechainismadeofbi-valuecells.WithY-Chainsthehingewasexp......
  • Langchain-提示工程
    今天我们来尝试用思维链也就是CoT(ChainofThought)的概念来引导模型的推理,让模型生成更详实、更完备的文案什么是ChainofThoughtCoT这个概念来源于学术界,是谷歌大脑的JasonWei等人于2022年在论文《Chain-of-ThoughtPromptingElicitsReasoninginLargeLanguageModel......
  • langchain agent with tools sample code
    importasynciofromlangchain_openaiimportChatOpenAIfromlangchain.agentsimporttoolfromlangchain_core.promptsimportChatPromptTemplate,MessagesPlaceholderfromlangchain.agents.format_scratchpad.openai_toolsimport(format_to_openai_tool_me......
  • blockchain | web3.py交互模板
    blockchain|web3.py交互模板exp:fromweb3importWeb3fromweb3.middlewareimportSignAndSendRawMiddlewareBuilderimportjsonw3=Web3(Web3.HTTPProvider('http://127.0.0.1:8545'))ifnotw3.is_connected(): print('connerr') exit(-1)......
  • 基于langchain的RAG问答(QA)链实现
    文章目录概要整体架构流程1.加载JSON数据2.创建文档对象并添加元数据3.初始化嵌入模型4.初始化Chroma向量存储5.向向量数据库添加文档6.基于相似度检索文档7.通过嵌入向量检索相似文档8.初始化检索器9.加载RAG提示模板10.定义RAG链并生成回答总结技......
  • 基于LLM Graph Transformer的知识图谱构建技术研究:LangChain框架下转换机制实践
    文本到图谱的转换是一个具有技术挑战性的研究领域,其核心任务是将非结构化文本数据转换为结构化的图谱表示。这种技术虽然由来已久,但随着大型语言模型(LLMs)的发展,其应用范围得到了显著扩展,并逐渐成为主流技术方案之一。上图展示了信息抽取过程中文本到知识图谱的转换。图左侧展......
  • 07LangChain实战课 - LLM模块使用与自定义模型调用
    LangChain实战课-LLM模块使用与自定义模型调用1.课程简介本节课聚焦于LangChain中的LLM(LargeLanguageModel)模块,探讨如何使用不同的大语言模型,包括开源模型和自定义模型。2.大语言模型的发展Transformer架构:Google在2018年提出的架构,是现代预训练模型的核心。基础......
  • 08LangChain实战课 - 输出解析器深入与Pydantic解析器实战
    LangChain实战课-输出解析器深入与Pydantic解析器实战1.课程回顾第5课中,我们学习了如何为花和价格生成吸引人的描述,并将这些描述和原因存储到CSV文件中。程序调用了OpenAI模型,并利用了结构化输出解析器以及数据处理和存储工具。2.LangChain中的输出解析器输出解析器......