首页 > 其他分享 >【LLM应用开发】 langchain框架的 4大组件

【LLM应用开发】 langchain框架的 4大组件

时间:2025-01-23 19:46:06浏览次数:1  
标签:prompt template ChatOpenAI langchain LLM output 组件 import

在人工智能的浪潮中,大型语言模型(LLM)逐渐成为推动科技进步的重要力量。而LangChain,作为一个专为LLM应用开发设计的框架,凭借其模块化和高效性,受到了广泛关注。本文将深入浅出地讲解LangChain中的四个基础组件:PromptTemplate、LLMs、Chain和OutputParser,帮助入门者快速上手。

一、PromptTemplate

PromptTemplate是LangChain中用于生成提示(Prompt)的可重复方式。它包含一个文本字符串模板,可以接受来自最终用户的一组参数并生成提示。这极大地简化了针对不同情况同类型问题的Prompt设计。

示例1:使用PromptTemplate

from langchain_core.prompts import PromptTemplate

template = "您是新公司的命名顾问。生产{product}的公司起什么好名字?"
prompt_template = PromptTemplate.from_template(template)
prompt = prompt_template.format(product="彩色袜子")
print(prompt)  # 输出: 您是新公司的命名顾问。一家生产彩色袜子的公司起什么名字好呢?

示例2:使用FewShotPromptTemplate

FewShotPromptTemplate是在PromptTemplate基础上,增加了few-shot examples,帮助语言模型生成更好的响应。

from langchain_core.prompts import PromptTemplate, FewShotPromptTemplate

# 创建few-shot examples
examples = [
    {"word": "happy", "antonym": "sad"},
    {"word": "tall", "antonym": "short"},
]

# 定义模板
example_formatter_template = "Word: {word} Antonym: {antonym}\n"
example_prompt = PromptTemplate(input_variables=["word", "antonym"], template=example_formatter_template)

# 创建FewShotPromptTemplate
few_shot_prompt_template = FewShotPromptTemplate(prompt_template=example_prompt, examples=examples)
formatted_prompt = few_shot_prompt_template.format(word="big", antonym="small")
print(formatted_prompt)
# 输出:
# Word: happy Antonym: sad
# Word: tall Antonym: short
# Word: big Antonym: small

二、LLMs

LLMs(Large Language Models)是LangChain的核心组件之一。LangChain提供了一个标准接口来调用不同的LLM,例如OpenAI的GPT系列。

示例:LLM


from langchain.chat_models import ChatOpenAI

# 初始化ChatOpenAI模型
model = ChatOpenAI(model="gpt-3.5-turbo", openai_api_key="你的API_KEY", openai_api_base="你的API_BASE")

# 发送请求
response = model.invoke([{"content": "Translate this sentence from English to French: I love programming."}])
print(response)

更完整的例子

from langchain_community.chat_models import ChatOpenAI
from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain
import os

# 设置OpenAI API密钥
os.environ["OPENAI_API_KEY"] = 'your_openai_api_key'

# 创建PromptTemplate
prompt_template = PromptTemplate.from_template("请写一篇关于{topic}的文章")

# 创建LLMChain,并指定使用的LLM和PromptTemplate
llm = ChatOpenAI(model_name='gpt-3.5-turbo', temperature=0.7)
chain = LLMChain(llm=llm, prompt=prompt_template)

# 使用LLMChain生成文章
generated_text = chain.run(input_data={"topic": "人工智能的未来"})
print(generated_text)

三、Chain

Chain在LangChain中代表一系列按顺序执行的任务或操作。这些任务通常涉及与语言模型的交互,可以看作处理输入、执行一系列决策和操作,最终产生输出的流程。。Chain可以嵌套和组合,以构建复杂的流程

示例1:简单顺序链(SimpleSequentialChain)

简单顺序链适用于顺序执行的任务,即上一条链的输出自动作为下一条链的输入。

from langchain.chains import SimpleSequentialChain, LLMChain
from langchain.prompts import ChatPromptTemplate
from langchain_community.chat_models import ChatOpenAI

# 创建两个LLMChain
prompt_1 = ChatPromptTemplate.from_template("请描述一个{product}的特点")
chain_1 = LLMChain(llm=ChatOpenAI(model_name='gpt-3.5-turbo'), prompt=prompt_1)

prompt_2 = ChatPromptTemplate.from_template("根据上述特点,为{product}写一个广告词")
chain_2 = LLMChain(llm=ChatOpenAI(model_name='gpt-3.5-turbo'), prompt=prompt_2)

# 创建SimpleSequentialChain
chain_ss = SimpleSequentialChain(chains=[chain_1, chain_2], verbose=True)

# 使用SimpleSequentialChain
output = chain_ss.run(input_data={"product": "智能手机"})
print(output)

示例2:一般顺序链(SequentialChain)

from langchain.chains import SequentialChain, LLMChain
from langchain.prompts import ChatPromptTemplate
from langchain_community.chat_models import ChatOpenAI

# 创建多个LLMChain,并指定输出变量名
prompt_1 = ChatPromptTemplate.from_template("请将以下评论翻译成中文:\n\n{Review}")
chain_1 = LLMChain(llm=ChatOpenAI(model_name='gpt-3.5-turbo'), prompt=prompt_1, output_key='中文_评论')

prompt_2 = ChatPromptTemplate.from_template("请用一句话总结这篇中文评论:\n\n{中文_评论}")
chain_2 = LLMChain(llm=ChatOpenAI(model_name='gpt-3.5-turbo'), prompt=prompt_2, output_key='中文_总结')

# 创建SequentialChain,并指定输入和输出变量
chain_seq = SequentialChain(chains=[chain_1, chain_2], input_variables=['Review'], output_variables=['中文_评论', '中文_总结'])

# 使用SequentialChain
review = "This is a great product!"
output = chain_seq.run(input_data={"Review": review})
print(output)

一般顺序链用于处理稍微复杂一些的情况,即可能有多个输入及输出。

示例3:使用|构建Chain

LangChain提供了多种方式将Chain组合起来,其中使用管道符|是一种既方便书写又表达力强劲的方式。

from langchain_openai import ChatOpenAI
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate

model = ChatOpenAI(model="gpt-4o-mini")
prompt = ChatPromptTemplate.from_template("tell me a joke about {topic}")
chain = prompt | model | StrOutputParser()
chain.invoke({"topic": "bears"})

四、OutputParser

在LangChain中,OutputParser用于解析LLM或其他组件生成的输出。OutputParser可以根据应用需求进行自定义,以提取有用的信息或进行进一步的处理。

示例1:使用CommaSeparatedListOutputParser

from langchain.output_parsers import CommaSeparatedListOutputParser
from langchain.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI

# 定义Prompt
prompt = ChatPromptTemplate.from_messages([
    ("system", "{parser_instructions}"),
    ("human", "列出{cityName}的{viewPointNum}个著名景点。")
])

# 初始化OutputParser
output_parser = CommaSeparatedListOutputParser()
parser_instructions = output_parser.get_format_instructions()

# 生成最终Prompt并执行
final_prompt = prompt.invoke({"cityName": "南京", "viewPointNum": 3, "parser_instructions": parser_instructions})
model = ChatOpenAI(model="gpt-3.5-turbo", openai_api_key="你的API_KEY", openai_api_base="你的API_BASE")
response = model.invoke(final_prompt)
parsed_output = output_parser.invoke(response)
print(parsed_output)  # 输出格式化的景点列表

示例2:使用PydanticOutputParser

from langchain.output_parsers import PydanticOutputParser
from langchain.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
from pydantic import BaseModel, Field

# 定义数据结构类
class BookInfo(BaseModel):
    book_name: str = Field(description="书籍的名字")
    author_name: str = Field(description="书籍的作者")
    genres: list = Field(description="书籍的体裁")

# 初始化OutputParser
output_parser = PydanticOutputParser(pydantic_object=BookInfo)
parser_instructions = output_parser.get_format_instructions()

# 定义Prompt并执行
prompt = ChatPromptTemplate.from_messages([
    ("system", "{parser_instructions} 你输出的结果请使用中文。"),
    ("human", "请你帮我从书籍的概述中,提取书名、作者,以及书籍的体裁。书籍概述如下:#{book_introduction}#")
])
book_introduction = "《朝花夕拾》原名《旧事重提》..."  # 书籍概述内容
final_prompt = prompt.invoke({"book_introduction": book_introduction, "parser_instructions": parser_instructions})
model = ChatOpenAI(model="gpt-3.5-turbo", openai_api_key="你的API_KEY", openai_api_base="你的API_BASE")
response = model.invoke(final_prompt)
parsed_output = output_parser.invoke(response)
print(parsed_output)  # 输出格式化的书籍信息

五、结语

LangChain是一个强大的框架,它通过将LLM、Prompt、Chain和OutputParser等组件结合在一起,为开发者提供了一个灵活、可扩展的平台来构建和管理LLM应用。

从Prompt的设计到LLM的选择,再到Chain的构建和OutputParser的使用,LangChain的每个组件都扮演着重要的角色。通过学习和掌握这些概念,开发者可以更加高效地利用LangChain来构建复杂、智能的应用。

希望这篇Blog能帮助大家更好地理解和使用LangChain框架。如果你对LangChain或大型语言有任何模型疑问或想法,欢迎在评论区留言与我交流!

个人观点,仅供参考

原创 WedO实验君 人工智能微客

标签:prompt,template,ChatOpenAI,langchain,LLM,output,组件,import
From: https://www.cnblogs.com/o-O-oO/p/18688542

相关文章

  • Vue3为了封装组件,我写了三天的 vue3 hook!学起来!
    前言我以前很喜欢封装组件,什么东西不喜欢别人的,总喜欢自己搞搞,这让人很有成就感,虽然是重复造轮子,但是能从无聊的crud业务中暂时解脱出来,对我来说也算是一种休息,相信有很多人跟我一样有这个习惯。这种习惯在独立开发时无所谓,毕竟没人会关心你咋实现的,但是在跟人合作时就给别人......
  • Jetpack架构组件学习——使用Glance实现桌面小组件
    基本使用1.添加依赖添加Glance依赖://ForAppWidgetssupportimplementation"androidx.glance:glance-appwidget:1.1.0"//ForinteropAPIswithMaterial3implementation"androidx.glance:glance-material3:1.1.0"//ForinteropAPIs......
  • (一)一文读懂transformers库中常见组件PreTrainedModel,PretrainedConfig,AutoTokenizer
    文章目录一、训练管理大师:`Trainer`和`TrainingArguments``TrainingArguments`:训练的“魔法配方”`Trainer`:训练的“超级厨师”二、数据整理小能手:`DataCollatorWithPadding`三、因果语言模型的输出管家:`CausalLMOutputWithPast`四、模型加载与处理的智能助手:`AutoPro......
  • 大模型论文精选|| 多 LLM 文本摘要:创新方法与卓越成果
    多LLM文本摘要:创新方法与卓越成果论文https://arxiv.org/abs/2412.15487Multi-LLMTextSummarization2412.15487多LLM摘要框架在每一轮对话中有两个至关重要的步骤:生成和评估。根据使用的是多LLM去中心化摘要还是中心化摘要,这些步骤会有所不同。在这两种策略中,k个不同的大......
  • 深入探索LLM架构,使用pytorch实现Transformer
    深入探究架构并利用从RNN到Transformer的NLP模型构建实际应用本系列文章1.LLM大模型架构专栏||从NLP基础谈起2.LLM大模型架构专栏||自然语言处理(NLP)之建模3.LLM大模型架构之词嵌入(Part1)4.LLM大模型架构之词嵌入(Part2)5.LLM大模型架构之词嵌入(Part3)6.LLM架构从基础......
  • 记忆层增强的 Transformer 架构:通过可训练键值存储提升 LLM 性能的创新方法
    大语言模型(LLM)通过其参数储存了大量信息,这些信息主要以密集层中线性矩阵变换的权重形式存在。然而,参数规模的扩大必然导致计算成本和能源消耗的显著增加。这种参数存储方式是否可以通过更高效的键值查找机制来优化?尽管此前已有多项相关研究,但在当前AI架构规模下的实践尚属首次......
  • Weblogic - V10.0.2 ~V10.3.6 - uddi 组件 SSRF 漏洞 - CVE-2014-4210
    0x01:漏洞简介Weblogic的uddi组件存在一个SSRF漏洞。利用该漏洞,攻击者可发送任意HTTP请求,进而对内网中的脆弱组件(redis、fastcgi)进行进一步的攻击。漏洞点:/uddiexplorer/(无需登录即可访问)0x02:影响版本Weblogic10.0.2~Weblogic10.3.60x03:环境搭建环境准备......
  • Hugging Face全面拥抱LangChain:全新官方合作包
    最近HuggingFace官宣发布langchain_huggingface,这是一个由HuggingFace和LangChain共同维护的LangChain合作伙伴包。这个新的Python包旨在将HuggingFace最新功能引入LangChain并保持同步。本系列合集,点击链接查看通过官方包的加持,开发小伙伴们通过简单的api调用......
  • flutter入门系列教程<一>:tab组件的灵活妙用
    文章目录说明区分TabBarView组件TabBarViewTabBar实例需求升级写在中间的tabbar组件封装组件组件说明组件用法示例常规的tabbar封装常规用法说明前提:假设你已初步了解了flutter和dart语言,并且知道怎么创建一个简单的项目;学习本文后,你将掌握:tab组件的用法;组件的......
  • Jetpack架构组件学习(6)——使用Glance实现桌面小组件
    原文地址:Jetpack架构组件学习(6)——使用Glance实现桌面小组件-Stars-One的杂货小窝公司陆续整了几个Compose写的app,有个小组件的功能,顺便试了下Jetpack库里的Glance框架感觉与原来的Remoteview差点意思,不过点击事件的使用比Remoteview要方便不少PS:如果想看Remotevie......