Tutorial 2: LLM 与 Chat Models
LLM vs Chat Models
LangChain 支持两种类型的语言模型:
类型 |
输入 |
输出 |
适用场景 |
|---|---|---|---|
LLM |
字符串 |
字符串 |
文本补全、简单生成 |
Chat Model |
消息列表 |
消息对象 |
对话、复杂交互 |
现代应用推荐使用 Chat Models,因为它们更强大且支持更丰富的交互模式。
使用 Chat Models
基本用法
from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage, SystemMessage, AIMessage
# 初始化 Chat Model
chat = ChatOpenAI(
model="gpt-4o-mini",
temperature=0.7, # 创造性程度 0-1
max_tokens=1000 # 最大输出长度
)
# 构建消息
messages = [
SystemMessage(content="你是一个专业的自媒体内容创作者"),
HumanMessage(content="帮我写一个关于AI编程的文章标题")
]
# 调用模型
response = chat.invoke(messages)
print(response.content)
消息类型
from langchain_core.messages import (
SystemMessage, # 系统指令,设定角色和行为
HumanMessage, # 用户输入
AIMessage, # AI 回复
ToolMessage, # 工具调用结果
)
# 多轮对话示例
messages = [
SystemMessage(content="你是自媒体写作助手"),
HumanMessage(content="我想写一篇关于Python的文章"),
AIMessage(content="好的!Python是个很好的主题。你想侧重哪个方面?"),
HumanMessage(content="侧重于初学者入门")
]
response = chat.invoke(messages)
流式输出
# 流式输出,适合长文本生成
for chunk in chat.stream(messages):
print(chunk.content, end="", flush=True)
使用不同的模型提供商
OpenAI
from langchain_openai import ChatOpenAI
chat = ChatOpenAI(model="gpt-4o")
Anthropic (Claude)
from langchain_anthropic import ChatAnthropic
chat = ChatAnthropic(model="claude-3-5-sonnet-20241022")
本地模型 (Ollama)
from langchain_community.chat_models import ChatOllama
chat = ChatOllama(model="llama3.2")
实战:自媒体标题生成器
from langchain_openai import ChatOpenAI
from langchain_core.messages import SystemMessage, HumanMessage
class TitleGenerator:
def __init__(self):
self.chat = ChatOpenAI(model="gpt-4o-mini", temperature=0.8)
self.system_prompt = """你是一个专业的自媒体标题创作专家。
你擅长创作吸引眼球、引发好奇心的标题。
标题要求:
1. 简洁有力,不超过20个字
2. 包含数字或疑问能增加点击率
3. 避免标题党,保持内容相关性
"""
def generate(self, topic: str, count: int = 5) -> list[str]:
messages = [
SystemMessage(content=self.system_prompt),
HumanMessage(content=f"请为主题「{topic}」生成{count}个标题,每行一个")
]
response = self.chat.invoke(messages)
titles = response.content.strip().split("\n")
return [t.strip() for t in titles if t.strip()]
# 使用示例
generator = TitleGenerator()
titles = generator.generate("Python自动化办公")
for i, title in enumerate(titles, 1):
print(f"{i}. {title}")
输出示例:
1. 5个Python技巧,让你的办公效率提升10倍
2. 还在手动处理Excel?Python帮你一键搞定
3. 程序员都在用的办公自动化神器,你还不知道?
4. 从入门到精通:Python自动化办公完全指南
5. 每天节省2小时!Python办公自动化实战
模型参数详解
参数 |
说明 |
推荐值 |
|---|---|---|
temperature |
控制输出随机性,越高越有创意 |
创意写作: 0.7-0.9 |
max_tokens |
最大输出 token 数 |
根据需求设置 |
top_p |
核采样参数 |
通常保持默认 |
frequency_penalty |
降低重复词出现频率 |
0-1 |
presence_penalty |
鼓励谈论新话题 |
0-1 |
下一步
在下一个教程中,我们将学习如何使用 Prompt Templates 来构建可复用的提示词模板。