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 来构建可复用的提示词模板。

Tutorial 3: Prompt Templates