引言

  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)

  模型会按照示例的格式输出:

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐