小白从零开始勇闯人工智能:LangChain 入门指南(上)
引言
LangChain 是一个强大的框架,主要用于简化基于大语言模型的应用开发。它像乐高积木一样,将各种组件(模型、提示模板、输出解析器等)组合起来,让新手能快速搭建出功能丰富的 AI 应用。本篇文章将从零开始,一步步学习的LangChain 的核心概念与用法。
1、基础:与模型对话
在开始使用 LangChain 之前,我们需要先学会如何与一个具体的模型对话。这里我们使用阿里云的“通义千问”模型(通过 ChatOpenAI 接口调用,因为它兼容 OpenAI 的 API 格式)。首先安装必要的库:
pip install langchain langchain-openai
通过LangChain框架调用qwen-plus模型,构建包含系统角色设定和用户提问的消息列表,调用模型生成回答并打印输出。
from langchain_openai import ChatOpenAI
model = ChatOpenAI(
model="qwen-plus",
openai_api_key="你的API_KEY", # 替换为你的真实密钥
openai_api_base="https://dashscope.aliyuncs.com/compatible-mode/v1",
temperature=1.2, # 控制随机性,越高越有创造力
max_tokens=300 # 最多生成300个token
)
from langchain.schema.messages import HumanMessage, SystemMessage
messages = [
SystemMessage(content="请你作为我的数学课助教,用通俗易懂且直接的语言帮我解释数学原理。"),
HumanMessage(content="什么是勾股定理?"),
]
response = model.invoke(messages)
print(response.content)
ChatOpenAI 是 LangChain 中用于调用兼容 OpenAI API 的模型的类。我们指定了模型名、API 密钥和基础 URL。
SystemMessage 和 HumanMessage 是两种消息类型,分别代表系统设定和用户输入。LangChain 支持多种消息角色,模拟真实对话。
model.invoke(messages) 发送消息给模型,并返回响应。

2、提示模板(Prompt Templates)
在实际应用中,我们往往需要动态生成提示词,而不是写死固定的字符串。LangChain 提供了多种提示模板,让我们能像填空一样构造消息。
1、使用独立的 SystemMessagePromptTemplate 和 HumanMessagePromptTemplate
通过LangChain的提示模板功能,分别定义了系统消息和人类消息的模板:系统模板指定将输入语言翻译成输出语言并按用户要求调整风格,人类模板包含待翻译文本和风格要求。随后使用`format`方法填充模板中的变量,为系统模板指定源语言和目标语言均为汉语,最后打印出填充后的具体消息对象。
from langchain.prompts import (
SystemMessagePromptTemplate,
HumanMessagePromptTemplate,
)
# 定义系统消息模板
system_template_text = "你是一位专业的翻译,能够将{input_language}翻译成{output_language},并且输出文本会根据用户要求的任何语言风格进行调整。请只输出翻译后的文本,不要有任何其它内容。"
system_prompt_template = SystemMessagePromptTemplate.from_template(system_template_text)
# 查看模板中的变量
print(system_prompt_template.input_variables) # 输出:['input_language', 'output_language']
# 定义人类消息模板
human_template_text = "文本:{text}\n语言风格:{style}"
human_prompt_template = HumanMessagePromptTemplate.from_template(human_template_text)
print(human_prompt_template.input_variables) # 输出:['text', 'style']
# 填充模板,生成具体的消息
system_prompt = system_prompt_template.format(input_language="汉语", output_language="汉语")
human_prompt = human_prompt_template.format(
text="勿以善小而不为,勿以恶小而为之",
style="白话文"
)
print(system_prompt)
print(human_prompt)
然后我们可以将这两个消息传给模型:
from langchain_openai import ChatOpenAI
model = ChatOpenAI(
model="qwen-plus",
openai_api_key="你的API_KEY",
openai_api_base="https://dashscope.aliyuncs.com/compatible-mode/v1"
)
response = model.invoke([system_prompt, human_prompt])
print(response.content)
为了批量处理多个翻译任务,我们可以循环:
input_variables = [
{"input_language": "汉语", "output_language": "汉语", "text": "勿以善小而不为,勿以恶小而为之。", "style": "白话文"},
{"input_language": "法语", "output_language": "英语", "text": "Je suis désolé pour ce que tu as fait", "style": "古英语"},
{"input_language": "俄语", "output_language": "意大利语", "text": "Сегодня отличная погода", "style": "网络用语"},
{"input_language": "韩语", "output_language": "日语", "text": "너 정말 짜증나", "style": "口语"},
]
for input in input_variables:
response = model.invoke([
system_prompt_template.format(input_language=input["input_language"], output_language=input["output_language"]),
human_prompt_template.format(text=input["text"], style=input["style"])
])
print(response.content)

2、使用 ChatPromptTemplate 组合多个消息
更方便的方式是使用 ChatPromptTemplate.from_messages(),将多条消息模板组合在一起:
from langchain.prompts import ChatPromptTemplate
prompt_template = ChatPromptTemplate.from_messages([
("system", "你是一位专业的翻译,能够将{input_language}翻译成{output_language},并且输出文本会根据用户要求的任何语言风格进行调整。请只输出翻译后的文本,不要有任何其它内容。"),
("human", "文本:{text}\n语言风格:{style}"),
])
print(prompt_template.input_variables) # ['input_language', 'output_language', 'text', 'style']
# 填充模板,生成 PromptValue
prompt_value = prompt_template.invoke({
"input_language": "汉语",
"output_language": "汉语",
"text": "勿以善小而不为,勿以恶小而为之。",
"style": "白话文"
})
print(prompt_value.messages) # 包含 SystemMessage 和 HumanMessage
接着可以直接用 model.invoke(prompt_value) 获取结果,也可以批量处理:
for input in input_variables:
response = model.invoke(prompt_template.invoke(input))
print(response.content)
3、少量示例提示模板
有时我们需要给模型提供几个例子,让它模仿这些例子的输出格式。LangChain 提供了 FewShotChatMessagePromptTemplate 来轻松实现。
我们通过LangChain构建了一个少样本学习提示模板,首先定义了示例消息模板,然后提供了两个客户信息格式化的具体示例,接着利用FewShotChatMessagePromptTemplate将这些示例整合,并与新的请求模板组合成最终提示模板。最后,用新的客户信息填充模板并调用invoke方法,生成了包含示例和当前请求的完整消息列表。
from langchain_openai import ChatOpenAI
from langchain.prompts import FewShotChatMessagePromptTemplate, ChatPromptTemplate
# 定义示例中每一条消息的模板(human 和 ai 对)
example_prompt = ChatPromptTemplate.from_messages([
("human", "格式化以下客户信息:\n姓名 -> {customer_name}\n年龄 -> {customer_age}\n 城市 -> {customer_city}"),
("ai", "##客户信息\n- 客户姓名:{formatted_name}\n- 客户年龄:{formatted_age}\n- 客户所在地:{formatted_city}")
])
# 提供几个示例
examples = [
{
"customer_name": "张三",
"customer_age": "27",
"customer_city": "长沙",
"formatted_name": "张三",
"formatted_age": "27岁",
"formatted_city": "湖南省长沙市"
},
{
"customer_name": "李四",
"customer_age": "42",
"customer_city": "广州",
"formatted_name": "李四",
"formatted_age": "42岁",
"formatted_city": "广东省广州市"
},
]
# 构建 few-shot 模板
few_shot_template = FewShotChatMessagePromptTemplate(
example_prompt=example_prompt,
examples=examples,
)
# 最终的 prompt 由 few-shot 示例 + 新的用户请求组成
final_prompt_template = ChatPromptTemplate.from_messages([
few_shot_template,
("human", "{input}"),
])
# 填充新的输入
final_prompt = final_prompt_template.invoke({
"input": "格式化以下客户信息:\n姓名 -> 王五\n年龄 -> 31\n 城市 -> 郑州'"
})
print(final_prompt.messages)
example_prompt 定义了每个示例中人类消息和 AI 回复的格式。
examples 列表提供了两个具体示例。
FewShotChatMessagePromptTemplate 将这些示例转换为具体的消息列表(依次为 human1, ai1, human2, ai2)。
最后将 few-shot 示例与新的用户请求拼接,形成完整的提示。
然后调用模型:
model = ChatOpenAI(
model="qwen-plus",
openai_api_key="你的API_KEY",
openai_api_base="https://dashscope.aliyuncs.com/compatible-mode/v1"
)
response = model.invoke(final_prompt)
print(response.content)
模型会按照示例的格式输出:

更多推荐


所有评论(0)