[LangChain]Chat models and prompts

0 Useful Docs

1 Setup

1
pip install langchain

installation guide

2 LangSmith

在使用LangChain构建的应用程序中,许多都会包含多个步骤以及多次调用语言模型(LLM)。LangSmith能够检查链或agent内部具体发生了什么。

注册并登录后,确保设置环境变量以开始记录跟踪:

1
2
3
export LANGSMITH_TRACING="true"
export LANGSMITH_API_KEY="..."
export LANGSMITH_PROJECT="default" # 或者任何其他项目名称

若在notebook环境中,则可以通过以下代码设置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import getpass
import os

try:
from dotenv import load_dotenv
load_dotenv()
except ImportError:
pass

os.environ["LANGSMITH_TRACING"] = "true"

if "LANGSMITH_API_KEY" not in os.environ:
os.environ["LANGSMITH_API_KEY"] = getpass.getpass(prompt="输入您的LangSmith API密钥(可选):")
if "LANGSMITH_PROJECT" not in os.environ:
project_name = getpass.getpass(prompt='输入您的LangSmith项目名称(默认为"default"):')
os.environ["LANGSMITH_PROJECT"] = project_name if project_name else "default"
if "OPENAI_API_KEY" not in os.environ:
os.environ["OPENAI_API_KEY"] = getpass.getpass(prompt="输入您的OpenAI API密钥(如果使用OpenAI则必须):")

3 Using Language Models

LangChain支持多种不同的语言模型,可以单独使用这些语言模型,它们可以根据需要互换使用。chat model

1
2
3
# install package
pip install -qU "langchain[openai]" # openai
pip install -qU dashscope # Qwen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import getpass
import os
# openai
if not os.environ.get("OPENAI_API_KEY"):
os.environ["OPENAI_API_KEY"] = getpass.getpass("Enter API key for OpenAI: ")

from langchain.chat_models import init_chat_model

model = init_chat_model("gpt-4o-mini", model_provider="openai")

# qwen
from langchain_community.chat_models import ChatTongyi

tongyi_chat = ChatTongyi(
model="qwen-max",
# top_p="...",
# api_key="...",
# other params...
)

首先,可以直接使用模型。聊天模型(ChatModels)是LangChain运行体(Runnables)的实例,它们提供了一个标准接口以供交互。若要简单调用模型,可以通过.invoke方法传入消息列表。

1
2
3
4
5
6
7
8
from langchain_core.messages import HumanMessage, SystemMessage

messages = [
SystemMessage("Translate the following from English into Italian"),
HumanMessage("hi!"),
]

model.invoke(messages)

API参考:HumanMessage | SystemMessage

若已启用LangSmith,则能够看到此次运行已被记录到LangSmith中,并可以查看相应的LangSmith trace。LangSmith报告提供了token使用情况、延迟时间、标准模型参数(如temperature设置)及其他相关信息。

需要注意的是,聊天模型接收 message 对象作为输入,并生成消息对象作为输出。除了文本内容外,消息对象还传达了对话 roles ,并保存了重要数据,例如工具调用和token使用计数。

LangChain同样支持通过字符串或OpenAI格式进行聊天模型输入。以下是等效的方式:

1
2
3
4
5
model.invoke("Hello")

model.invoke([{"role": "user", "content": "Hello"}])

model.invoke([HumanMessage("Hello")])

streaming

由于聊天模型是Runnables,它们提供了一个标准接口,该接口包括异步和流模式调用。这使我们能够从聊天模型中流式传输单个令牌:

  • 使用这种机制可以实现实时信息更新,允许在处理复杂请求或长对话时逐步显示结果。
  • 异步和流式处理的引入提高了应用程序的响应速度和效率,尤其适合需要即时反馈的场景。
1
2
for token in model.stream(messages):
print(token.content, end="|")

更多信息参考https://python.langchain.com/docs/how_to/chat_streaming/

4 Prompt Templates

当前我们直接将消息列表传递给语言模型。通常,消息列表是由用户输入和应用程序逻辑组合构建的。应用程序逻辑通常会获取用户的原始输入,并将其转换成一个准备传递给语言模型的消息列表。常见的转换包括添加系统消息或使用用户输入来填充模板。

在LangChain中,Prompt templates这一概念旨在帮助进行此类转换。提示模板接收用户的原始输入,并返回准备好传递给语言模型的数据(即prompt)。

下面创建一个提示模板,它将接收两个用户变量:

  • language:要翻译文本的目标语言
  • text:要翻译的文本
1
2
3
4
5
6
7
from langchain_core.prompts import ChatPromptTemplate

system_template = "Translate the following text into {language}"

prompt_template = ChatPromptTemplate.from_messages(
[("system", system_template), ("user", "{text}")]
)

API参考:ChatPromptTemplate

该模板接受一个字典作为参数

1
2
3
prompt = prompt_template.invoke({"language": "Italian", "text": "hi!"})

prompt
1
prompt.to_message()
1
2
response = model.invoke(prompt)
print(response.content)

[LangChain]Chat models and prompts
https://erlsrnby04.github.io/2025/03/29/LangChain-Chat-models-and-prompts/
作者
ErlsrnBy04
发布于
2025年3月29日
许可协议