前置提醒:这条路线假设你会 Python 基础(变量、函数、字典、异常)。没学过的话,先去走 Python 路线的前 7 课,回来会轻松很多。
大模型应用到底在干什么
你以为的 AI 应用:一个很聪明的模型。
实际上的 AI 应用:一个把材料整理好、递给模型、再把模型的话整理成程序能用的数据的流水线。
模型本身是个黑盒 API:你发一段文字,它回一段文字。就这么简单。所有"看起来很聪明"的产品,聪明之处几乎都在黑盒外面——你怎么组织上下文、怎么约束输出、怎么接工具、怎么处理失败。
先不用 LangChain,看看原始形态
from openai import OpenAI
client = OpenAI(api_key="sk-...", base_url="https://api.deepseek.com")
resp = client.chat.completions.create(
model="deepseek-chat",
messages=[
{"role": "system", "content": "你是一个简洁的助手,回答不超过两句话。"},
{"role": "user", "content": "什么是 API?"},
],
)
print(resp.choices[0].message.content)
三种 role 必须分清:
system:给模型立人设和规则,优先级最高,用户看不见user:用户说的话assistant:模型之前说过的话(多轮对话时要把历史带上)
一个关键事实:模型没有记忆
每次调用都是全新的。它能"记得"上一轮,只是因为你把上一轮的内容又发了一遍:
messages = [
{"role": "system", "content": "你是助手"},
{"role": "user", "content": "我叫小明"},
{"role": "assistant", "content": "你好小明"},
{"role": "user", "content": "我叫什么?"}, # 靠上面两条它才知道
]
所谓"记忆功能",本质上就是替你管理这个列表。理解这一点,后面的 Memory 一课就没有任何神秘感了。
token 与成本
模型按 token 计费,不是按字数。粗略换算:1 个英文单词≈1.3 token,1 个汉字≈0.6~1 token。输入和输出分别计价,通常输出更贵。
这意味着两条工程准则:
- 别把无关内容一股脑塞进上下文。 贵、慢,而且会稀释模型的注意力,效果反而变差。
- 上下文有长度上限。 对话长到一定程度必须裁剪或摘要,否则直接报错。
LangChain 解决什么问题
上面那段代码已经能用了,为什么还要 LangChain?
因为真实应用里你会反复遇到同样几件麻烦事:换个模型厂商要重写一遍调用代码、提示词里拼变量、把模型输出的文字解析成 JSON、管理对话历史、把文档切块检索、让模型调用工具。LangChain 把这些固化成标准零件,你负责拼装。
代价是多一层抽象。学习时的正确心态是:先知道它底下就是上面那段 HTTP 调用,抽象漏了的时候你才知道去哪找问题。
环境准备
pip install langchain langchain-openai python-dotenv
API key 写进 .env 文件,永远不要硬编码在代码里(一旦提交到 GitHub 就等于公开了,有机器人专门扫这个):
OPENAI_API_KEY=sk-xxxx
OPENAI_BASE_URL=https://api.deepseek.com
from dotenv import load_dotenv
load_dotenv() # 读取 .env 到环境变量
记得把 .env 写进 .gitignore。
关于版本
LangChain 迭代很快,网上大量教程是旧版写法。本课程用 LCEL(表达式语言)风格,也就是用 | 把组件串起来的那种写法。如果你搜到的代码里出现 LLMChain(...)、initialize_agent(...),那是旧接口,不要照抄。遇到不确定的写法,直接问 AI 私教或查官方文档的当前版本页面。
10 秒自测
为什么模型"能记住"你上一句说了什么?
因为你每次请求都把完整的历史消息一起发过去了。模型本身无状态,记忆是应用层做出来的。