LangChain作为当前最热门的大语言模型应用开发框架,为开发者提供了便捷的工具链和标准化的流程管理。我在实际项目中多次使用LangChain构建企业级AI应用,发现其模块化设计能显著降低开发门槛。下面我将从实战角度分享完整的开发流程。
LangChain采用"乐高积木"式的组件化思想,将大模型应用开发中的常见环节抽象为可插拔的模块。这种设计带来三个显著优势:
|)清晰展现数据处理流向以文档问答场景为例,传统开发需要手动处理文本分块、向量化、相似度匹配等复杂逻辑,而LangChain通过预置组件将这些流程标准化,开发者只需关注业务逻辑的实现。
建议使用Python 3.8+环境,通过virtualenv或conda创建隔离环境。基础安装包包含核心框架和社区维护的模型适配器:
bash复制pip install langchain langchain-community
不同模型需要额外安装对应的适配器:
bash复制# 通义千问
pip install langchain-qwq
# OpenAI
pip install langchain-openai
# Hugging Face
pip install langchain-huggingface
注意:生产环境建议固定依赖版本,避免因框架更新导致兼容性问题。例如使用
pip install langchain==0.1.0指定版本。
以通义千问为例,需要先设置API密钥环境变量:
python复制import os
os.environ["DASHSCOPE_API_KEY"] = "your_api_key_here" # 替换为实际密钥
模型实例化时可通过参数指定具体版本:
python复制from langchain_community.chat_models.tongyi import ChatTongyi
model = ChatTongyi(
model="qwen-plus", # 模型版本
temperature=0.7, # 控制输出随机性
max_tokens=1024 # 限制响应长度
)
关键参数说明:
temperature:值越大输出越随机(0~1范围)top_p:核采样概率阈值(0~1范围)max_tokens:单次响应最大token数LangChain提供结构化模板管理,支持多角色对话设定:
python复制from langchain_core.prompts import ChatPromptTemplate
prompt = ChatPromptTemplate.from_messages([
("system", "你是一位专注{topic}领域15年的首席技术专家。"),
("user", "请用通俗易懂的方式解释{concept},并给出3个实际应用示例。")
])
模板中的{topic}和{concept}是占位变量,实际调用时动态注入。角色类型说明:
| 角色类型 | 对应类 | 作用 | 出现顺序 |
|---|---|---|---|
| system | SystemMessage | 设定AI角色和专业背景 | 首位 |
| user | HumanMessage | 用户提问内容 | 中间位 |
| ai | AIMessage | 模型历史回复 | 多轮对话时使用 |
将各组件通过管道操作符连接:
python复制from langchain_core.output_parsers import StrOutputParser
chain = prompt | model | StrOutputParser()
这个链的执行流程相当于:
批量调用(适合确定型任务):
python复制response = chain.invoke({
"topic": "机器学习",
"concept": "随机森林"
})
流式调用(适合交互式场景):
python复制for chunk in chain.stream({
"topic": "Web开发",
"concept": "RESTful API"
}):
print(chunk, end="", flush=True) # 模拟打字机效果
流式调用的优势在于:
实际业务中往往需要组合多个功能模块。例如构建一个带审核机制的问答系统:
python复制from langchain.chains import SequentialChain
# 定义子链1:生成原始回答
answer_chain = prompt | model | StrOutputParser()
# 定义子链2:内容安全审核
safety_check_prompt = ChatPromptTemplate.from_template(
"请检查以下内容是否包含不当信息:\n{text}"
)
safety_chain = safety_check_prompt | model | StrOutputParser()
# 组合成顺序链
full_chain = SequentialChain(
chains=[answer_chain, safety_chain],
input_variables=["topic", "concept"]
)
缓存策略:
python复制from langchain.cache import InMemoryCache
from langchain.globals import set_llm_cache
set_llm_cache(InMemoryCache()) # 启用内存缓存
超时控制:
python复制model = ChatTongyi(
model="qwen-plus",
request_timeout=30 # 设置30秒超时
)
批量处理:
python复制inputs = [
{"topic": "Python", "concept": "装饰器"},
{"topic": "数据库", "concept": "事务隔离"}
]
chain.batch(inputs) # 批量处理提高吞吐量
完善的错误处理应包括:
python复制from tenacity import retry, stop_after_attempt
@retry(stop=stop_after_attempt(3)) # 重试3次
def safe_invoke(chain, inputs):
try:
return chain.invoke(inputs)
except Exception as e:
print(f"调用失败: {str(e)}")
return "服务暂时不可用"
常见异常类型:
RateLimitError:API调用频率超限TimeoutError:请求超时APIConnectionError:网络连接问题建议采用分层配置:
示例config.yaml:
yaml复制model:
name: "qwen-plus"
params:
temperature: 0.7
max_tokens: 1024
关键监控指标:
日志记录示例:
python复制import logging
logging.basicConfig(
filename='llm_app.log',
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s'
)
logger = logging.getLogger(__name__)
def log_invocation(inputs, response):
logger.info(
f"Input: {inputs} | "
f"Response: {response[:100]}... | "
f"Token Usage: {response.usage}"
)
输入过滤:
python复制import re
def sanitize_input(text):
return re.sub(r'[<>{}]', '', text) # 移除特殊字符
输出审查:
python复制sensitive_keywords = ["暴力", "仇恨言论", "敏感词"]
def check_safety(text):
return any(keyword in text for keyword in sensitive_keywords)
| 错误现象 | 可能原因 | 解决方案 |
|---|---|---|
| 返回内容截断 | max_tokens设置过小 | 增大参数值或优化prompt |
| 响应速度慢 | 网络延迟或模型负载高 | 启用缓存/设置超时/重试机制 |
| 输出不符合预期 | prompt设计不合理 | 优化角色设定和指令清晰度 |
| API调用失败 | 密钥无效或额度耗尽 | 检查密钥/监控使用量 |
python复制print(prompt.format(topic="AI", concept="深度学习"))
python复制import http.client
http.client.HTTPConnection.debuglevel = 1
python复制from langchain_community.llms import Ollama
local_llm = Ollama(model="llama2")
我在实际项目中发现,合理的temperature设置(0.3~0.7)能在创造性和稳定性间取得最佳平衡。对于需要精确答案的场景,建议设为0.3以下;创意生成类任务可适当提高到0.8左右。