1. LangChain 快速入门:用通义千问构建你的第一个 AI 应用
最近在开发 AI 应用时,我发现 LangChain 这个框架确实能大幅提升开发效率。作为一个专门用于构建大语言模型应用的框架,它通过组件化和链式调用的方式,让原本复杂的 AI 应用开发变得简单直观。今天我就以通义千问为例,带大家快速上手 LangChain 的核心用法。
LangChain 的核心价值在于它提供了一套标准化的组件和流程。想象一下,如果你要开发一个 AI 应用,通常需要处理提示词模板、模型调用、输出解析等一系列繁琐的工作。而 LangChain 把这些都封装成了可复用的模块,开发者只需要像搭积木一样把它们组合起来就行。下面我们就从环境配置开始,一步步构建一个能实际运行的 AI 应用。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与安装
2.1 基础环境配置
在开始之前,确保你的 Python 环境是 3.8 或更高版本。我推荐使用虚拟环境来管理依赖:
bash复制python -m venv langchain-env
source langchain-env/bin/activate # Linux/Mac
# 或者
langchain-env\Scripts\activate # Windows
2.2 安装核心依赖
LangChain 采用模块化设计,核心包只包含基础功能,特定模型的支持需要额外安装:
bash复制pip install langchain langchain-community
对于通义千问模型,我们还需要安装专门的适配器:
bash复制pip install langchain-qwq
注意:不同模型的安装包名称不同。比如 OpenAI 的是
langchain-openai,Hugging Face 的是langchain-huggingface。务必根据你要使用的模型选择正确的包。
2.3 获取 API 密钥
使用通义千问需要先在阿里云 DashScope 平台申请 API Key:
- 访问 DashScope 官网
- 注册/登录账号
- 在控制台创建 API Key
- 记录下这个 Key,我们稍后会用到
3. 构建第一个 AI 应用
3.1 初始化模型
让我们从最简单的例子开始 - 让 AI 用三句话解释一个技术概念。首先创建模型实例:
python复制import os
from langchain_community.chat_models.tongyi import ChatTongyi
# 设置 API Key
os.environ["DASHSCOPE_API_KEY"] = "你的API_KEY"
# 创建模型实例
model = ChatTongyi(model="qwen-plus")
这里有几个关键点需要注意:
qwen-plus是通义千问的付费版本,性能更强。免费用户可以使用qwen-turbo- API Key 建议通过环境变量设置,不要硬编码在代码中
- 模型初始化参数会根据不同提供商而变化,比如 OpenAI 需要传
temperature等参数
3.2 设计提示词模板
LangChain 提供了强大的提示词模板功能:
python复制from langchain_core.prompts import ChatPromptTemplate
prompt = ChatPromptTemplate.from_messages([
("system", "你是一个精通{topic}的资深技术专家。"),
("user", "请用三句话解释一下什么是{concept}。")
])
这个模板有几个特点:
- 使用
{variable}语法定义变量,实际调用时传入具体值 - 支持多角色对话,这里使用了 system 和 user 两个角色
- system 消息用于设定 AI 的角色和专业背景
- user 消息是实际要问的问题
提示:system 消息对输出质量影响很大。好的 system prompt 应该明确 AI 的角色、专业领域和回答风格。
3.3 构建处理链
LangChain 最强大的功能就是能将各个组件连接成链:
python复制from langchain_core.output_parsers import StrOutputParser
output_parser = StrOutputParser()
chain = prompt | model | output_parser
这个 | 操作符链式调用是 LangChain 的特色,它表示数据流动的方向:
- 首先将输入传给 prompt 模板进行填充
- 然后将完整的 prompt 传给模型
- 最后用输出解析器处理模型返回的结果
3.4 调用模型获取结果
现在我们可以用两种方式获取 AI 的回答:
一次性获取完整响应:
python复制response = chain.invoke({
"topic": "Python",
"concept": "列表"
})
print(response)
流式输出(逐字显示):
python复制for chunk in chain.stream({
"topic": "人工智能",
"concept": "神经网络"
}):
print(chunk, end="", flush=True)
流式输出特别适合需要实时显示结果的场景,比如聊天应用。
4. 核心组件深度解析
4.1 模型初始化详解
不同模型的初始化方式略有差异。以通义千问为例,主要参数包括:
python复制model = ChatTongyi(
model="qwen-plus", # 模型名称
temperature=0.7, # 控制随机性 (0-1)
top_p=0.9, # 核采样参数
max_tokens=1024 # 最大输出长度
)
关键参数说明:
temperature:值越高输出越随机,适合创意任务;值越低输出越确定,适合事实性问题top_p:控制生成多样性的另一种方式,与 temperature 配合使用max_tokens:限制响应长度,防止生成过长内容
4.2 提示词模板进阶用法
LangChain 支持更复杂的提示词设计:
python复制from langchain_core.prompts import (
ChatPromptTemplate,
SystemMessagePromptTemplate,
HumanMessagePromptTemplate
)
# 分别创建系统消息和用户消息模板
system_template = SystemMessagePromptTemplate.from_template(
"你是一位专注于{field}的{role},回答时请使用{style}风格。"
)
human_template = HumanMessagePromptTemplate.from_template(
"请解释{concept},并给出{example_count}个实际例子。"
)
# 组合成完整提示词
prompt = ChatPromptTemplate.from_messages([
system_template,
human_template
])
# 使用示例
chain.invoke({
"field": "编程教育",
"role": "高级讲师",
"style": "生动有趣",
"concept": "Python装饰器",
"example_count": 2
})
这种结构化设计让复杂提示词更易维护,特别适合需要频繁调整提示词的项目。
4.3 输出解析器的妙用
除了简单的字符串解析,LangChain 还支持:
JSON 输出解析:
python复制from langchain_core.output_parsers import JsonOutputParser
parser = JsonOutputParser()
chain = prompt | model | parser # 输出会自动转为字典
结构化数据解析:
python复制from langchain_core.pydantic_v1 import BaseModel, Field
from langchain_core.output_parsers import PydanticOutputParser
class Answer(BaseModel):
definition: str = Field(description="概念定义")
examples: list[str] = Field(description="示例列表")
importance: str = Field(description="重要性说明")
parser = PydanticOutputParser(pydantic_object=Answer)
chain = prompt | model | parser # 输出会转为 Answer 对象
这些高级解析器能确保模型输出符合预期的数据结构,大大简化后续处理。
5. 实战技巧与常见问题
5.1 性能优化建议
批量处理请求:
python复制inputs = [
{"topic": "Python", "concept": "列表"},
{"topic": "Java", "concept": "接口"},
{"topic": "Go", "concept": "协程"}
]
# 批量调用提高效率
responses = chain.batch(inputs)
缓存重复请求:
python复制from langchain.cache import InMemoryCache
from langchain.globals import set_llm_cache
set_llm_cache(InMemoryCache()) # 启用内存缓存
5.2 错误处理最佳实践
处理速率限制:
python复制import time
from tenacity import retry, stop_after_attempt, wait_exponential
@retry(
stop=stop_after_attempt(3),
wait=wait_exponential(multiplier=1, min=4, max=10)
)
def safe_invoke(chain, input):
try:
return chain.invoke(input)
except Exception as e:
print(f"Error: {e}, retrying...")
raise
response = safe_invoke(chain, {"topic": "Python", "concept": "生成器"})
处理超长上下文:
python复制from langchain.text_splitter import RecursiveCharacterTextSplitter
splitter = RecursiveCharacterTextSplitter(
chunk_size=2000,
chunk_overlap=200
)
texts = splitter.split_text(long_document)
for text in texts:
response = chain.invoke({"text": text})
# 处理分段结果
5.3 调试技巧
查看实际发送的提示词:
python复制print(prompt.format(topic="Python", concept="装饰器"))
记录完整交互过程:
python复制from langchain.callbacks import FileCallbackHandler
from langchain.schema import LLMResult
handler = FileCallbackHandler("log.txt")
chain.invoke(
{"topic": "Python", "concept": "迭代器"},
config={"callbacks": [handler]}
)
6. 扩展应用场景
6.1 构建问答系统
python复制qa_prompt = ChatPromptTemplate.from_messages([
("system", "根据以下上下文回答问题。如果不知道就说不知道。\n上下文:{context}"),
("user", "问题:{question}")
])
qa_chain = qa_prompt | model | StrOutputParser()
response = qa_chain.invoke({
"context": "LangChain是一个用于构建大语言模型应用的框架...",
"question": "LangChain的主要功能是什么?"
})
6.2 实现多轮对话
python复制from langchain.memory import ConversationBufferMemory
memory = ConversationBufferMemory()
chain_with_memory = (
{"input": lambda x: x["input"], "history": lambda x: x["history"]}
| prompt
| model
| output_parser
)
# 第一轮
response1 = chain_with_memory.invoke(
{"input": "解释一下Python的生成器"},
config={"memory": memory}
)
# 第二轮(能记住之前的对话)
response2 = chain_with_memory.invoke(
{"input": "它和迭代器有什么区别?"},
config={"memory": memory}
)
6.3 文档摘要生成
python复制summarize_prompt = ChatPromptTemplate.from_template(
"用100字左右总结以下文本的核心内容:\n\n{text}"
)
summarize_chain = summarize_prompt | model | StrOutputParser()
summary = summarize_chain.invoke({
"text": "这里是需要摘要的长篇文章..."
})
在实际项目中,我发现 LangChain 的真正威力在于它的模块化设计。一旦掌握了基础组件的用法,就能像搭积木一样快速构建出各种复杂的 AI 应用。比如最近我做的一个项目,就用 LangChain 实现了从文档加载、文本分割、向量存储到问答检索的完整流程,整个过程只用了不到 200 行代码。
对于刚接触 LangChain 的开发者,我的建议是从小项目开始,先熟悉核心组件的用法,再逐步尝试更复杂的功能。遇到问题时,多查阅官方文档(现在已经有很完善的中文版了),同时关注 LangChain 的 GitHub 仓库,这个项目更新非常活跃,几乎每周都有新功能加入。
