在人工智能的浪潮中,大型语言模型(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或大型语言有任何模型疑问或想法,欢迎在评论区留言与我交流!
个人观点,仅供参考
标签:prompt,template,ChatOpenAI,langchain,LLM,output,组件,import From: https://www.cnblogs.com/o-O-oO/p/18688542原创 WedO实验君 人工智能微客