采用 LangChain 调用 LLM 大语言模型
任务介绍
本项目是一个基于 LangChain 框架的大语言模型(LLM)调用示例,主要功能是:
- 多模型支持:统一接口调用多种大语言模型,包括 OpenAI 和主流国产模型
- 翻译服务:构建一个可配置的多语言翻译服务
- Web 服务部署:将 LangChain 链部署为 FastAPI Web 服务,提供 HTTP API 接口
任务细节
1. 支持的模型类型
项目支持以下 5 种大语言模型:
| 模型类型 | 提供商 | 模型示例 | API 端点 |
|---|---|---|---|
| OpenAI | OpenAI | gpt-4-turbo, gpt-3.5-turbo | OpenAI 官方 API |
| 通义千问 (Qwen) | 阿里云 DashScope | qwen-turbo, qwen-plus, qwen-max | DashScope 兼容接口 |
| DeepSeek | 阿里云百炼 | deepseek-v3, deepseek-r1 | DashScope 兼容接口 |
| 月之暗面 (Moonshot) | Moonshot AI | moonshot-v1-8k, moonshot-v1-32k | Moonshot API |
| 百度文心一言 | 百度千帆 | ernie-4.0-8k, ernie-3.5-8k | 百度千帆 API |
2. 核心功能
- 统一接口调用:所有模型通过 OpenAI 兼容接口调用,无需安装额外的集成包
- 灵活配置 :通过修改
MODEL_TYPE变量即可切换不同模型 - 代理支持:可选的代理配置,支持访问需要代理的模型服务
- 追踪功能:可选的 LangSmith 追踪,用于监控和调试
- 输出解析 :使用
StrOutputParser将模型输出解析为纯文本字符串 - Web 服务:通过 FastAPI 和 LangServe 将链部署为 RESTful API
3. 技术栈
- LangChain:大语言模型应用开发框架
- FastAPI:现代 Python Web 框架
- LangServe:LangChain 的服务部署工具
- Uvicorn:ASGI 服务器
代码逻辑简略介绍
整体架构
环境配置 → 模型初始化 → 构建链 → 部署服务
代码流程
1. 环境配置阶段(第 28-53 行)
-
代理配置(可选):
- 通过
USE_PROXY开关控制是否使用代理 - 支持 HTTP/HTTPS 代理设置
- 使用国产模型时通常不需要代理
- 通过
-
LangSmith 追踪配置(可选):
- 通过
ENABLE_LANGSMITH_TRACING开关控制 - 用于监控和调试 LangChain 调用链
- 需要配置
LANGCHAIN_API_KEY
- 通过
2. 模型初始化阶段(第 55-103 行)
- 根据
MODEL_TYPE变量选择不同的模型 - 每种模型配置对应的 API Key 和 base_url
- 使用
ChatOpenAI类统一封装,通过base_url参数适配不同平台
关键代码逻辑:
python
if MODEL_TYPE == 'qwen':
model = ChatOpenAI(
model='qwen-turbo',
api_key=os.getenv('DASHSCOPE_API_KEY'),
base_url='https://dashscope.aliyuncs.com/compatible-mode/v1'
)
3. 链构建阶段(第 159-165 行)
-
Prompt 模板 :使用
ChatPromptTemplate定义翻译任务的提示模板- System 消息:定义翻译任务和目标语言
- User 消息:待翻译的文本内容
-
输出解析器 :使用
StrOutputParser将模型返回的AIMessage对象解析为字符串 -
链组合 :使用管道操作符
|组合各个组件prompt_template | model | parser
链的执行流程:
- 输入字典
{'language': 'English', 'text': '...'} - Prompt 模板填充变量,生成完整的消息列表
- 模型处理消息,返回
AIMessage对象 - 解析器提取
AIMessage.content,返回纯文本字符串
4. 服务部署阶段(第 168-181 行)
- FastAPI 应用:创建 FastAPI 应用实例
- 路由注册 :使用
add_routes将链注册为 API 端点- 路径:
/chainDemo - 自动生成 OpenAPI 文档
- 路径:
- 服务启动 :使用 Uvicorn 启动 Web 服务器
- 地址:
http://localhost:8000 - 可通过 HTTP POST 请求调用翻译服务
- 地址:
使用示例
本地调用
python
result = chain.invoke({
'language': 'English',
'text': '我下午还有一节课,不能去打球了。'
})
# 输出:I have another class this afternoon, so I can't go play ball.
API 调用
bash
curl -X POST "http://localhost:8000/chainDemo/invoke" \
-H "Content-Type: application/json" \
-d '{
"input": {
"language": "English",
"text": "我下午还有一节课,不能去打球了。"
}
}'
软件调用

关键设计模式
- 统一接口模式 :所有模型通过
ChatOpenAI统一接口,通过base_url适配不同平台 - 链式组合模式:使用管道操作符组合 Prompt、Model、Parser
- 配置驱动模式:通过环境变量和配置变量控制行为
- 服务化模式:将链封装为 Web 服务,提供标准化 API
总结
本项目展示了如何使用 LangChain 框架:
- 统一调用多种大语言模型
- 构建可复用的翻译链
- 将链部署为 Web 服务
代码结构清晰,配置灵活,易于扩展和维护,是学习 LangChain 框架的实用示例。
完整代码(含注释,可以解开注释,看输出结果)
python
"""
LangChain 调用 LLM 示例 - 支持 OpenAI 和国产模型
支持的模型:
1. OpenAI: gpt-4-turbo, gpt-3.5-turbo 等
2. 通义千问(Qwen): qwen-turbo, qwen-plus, qwen-max 等
3. 智谱AI(GLM): glm-4-plus, glm-4, glm-3-turbo 等
4. DeepSeek: deepseek-v3, deepseek-r1
5. 月之暗面(Moonshot): moonshot-v1-8k, moonshot-v1-32k 等
6. 百度文心一言: ernie-4.0-8k, ernie-3.5-8k 等
使用方法:
1. 修改 MODEL_TYPE 变量选择要使用的模型
2. 设置对应模型的 API Key
3. 运行脚本即可
注意:所有国产模型都通过 OpenAI 兼容接口调用,无需安装额外的包
"""
import os
from fastapi import FastAPI
from langchain_core.messages import SystemMessage, HumanMessage
from langchain_openai import ChatOpenAI
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langserve import add_routes
# ========== 模型配置:选择要使用的模型 ==========
# 选项:'openai', 'qwen', 'zhipu', 'deepseek', 'moonshot', 'baidu'
MODEL_TYPE = 'qwen' # 修改这里来切换不同的模型
# 根据选择的模型类型进行配置
if MODEL_TYPE == 'openai':
# OpenAI 模型
os.environ['OPENAI_API_KEY'] = 'your-openai-api-key' # 请替换为您的 API Key
model = ChatOpenAI(model='gpt-4-turbo')
elif MODEL_TYPE == 'qwen':
# 通义千问(阿里云 DashScope)
os.environ['DASHSCOPE_API_KEY'] = '请输入自己的密钥' # 请替换为您的 API Key
model = ChatOpenAI(
model='qwen-turbo', # 可选:qwen-turbo, qwen-plus, qwen-max, qwen-max-longcontext
api_key=os.getenv('DASHSCOPE_API_KEY'),
base_url='https://dashscope.aliyuncs.com/compatible-mode/v1'
)
elif MODEL_TYPE == 'deepseek':
# DeepSeek(通过阿里云百炼)
os.environ['DASHSCOPE_API_KEY'] = 'your-dashscope-api-key' # 请替换为您的 API Key
model = ChatOpenAI(
model='deepseek-v3', # 可选:deepseek-v3, deepseek-r1
api_key=os.getenv('DASHSCOPE_API_KEY'),
base_url='https://dashscope.aliyuncs.com/compatible-mode/v1'
)
elif MODEL_TYPE == 'moonshot':
# 月之暗面(Moonshot)
os.environ['MOONSHOT_API_KEY'] = 'your-moonshot-api-key' # 请替换为您的 API Key
model = ChatOpenAI(
model='moonshot-v1-8k', # 可选:moonshot-v1-8k, moonshot-v1-32k, moonshot-v1-128k
api_key=os.getenv('MOONSHOT_API_KEY'),
base_url='https://api.moonshot.cn/v1'
)
elif MODEL_TYPE == 'baidu':
# 百度文心一言(千帆)
os.environ['BAIDU_API_KEY'] = 'your-baidu-api-key' # 请替换为您的 API Key
model = ChatOpenAI(
model='ernie-4.0-8k', # 可选:ernie-4.0-8k, ernie-3.5-8k, ernie-turbo-8k
api_key=os.getenv('BAIDU_API_KEY'),
base_url='https://qianfan.baidubce.com/v2'
)
else:
raise ValueError(f"不支持的模型类型: {MODEL_TYPE}")
# 准备prompt
#msg = [
# SystemMessage(content = '请将以下的内容翻译成意大利语'),
# HumanMessage(content = '你好,请问你要去哪里?')
#]
# 普通正常输出
# result = model.invoke(msg)
# print(result)
# 结果展示
# content='Ciao, dove vai?'
# additional_kwargs={'refusal': None}
# response_metadata={
# 'token_usage':
# {
# 'completion_tokens': 6,
# 'prompt_tokens': 31,
# 'total_tokens': 37,
# 'completion_tokens_details': None,
# 'prompt_tokens_details': {'audio_tokens': None, 'cached_tokens': 0}},
# 'model_name': 'qwen-turbo',
# 'system_fingerprint': None,
# 'id': 'chatcmpl-c3692cee-4922-41be-99fa-d65420870fc2',
# 'service_tier': None,
# 'finish_reason': 'stop',
# 'logprobs': None
# }
# id='lc_run--0bdba41e-113a-4f02-9869-55015309b4bb-0'
# usage_metadata={
# 'input_tokens': 31,
# 'output_tokens': 6,
# 'total_tokens': 37,
# 'input_token_details':
# {
# 'cache_read': 0
# },
# 'output_token_details': {}
# }
# 简单的解析响应数据
# 创建返回的数据解析器
parser = StrOutputParser()
# print(parser.invoke(result))
# 直接解析输出:Ciao, dove vai?
# print(chain.invoke(msg))
# Ciao, dove vai?
# 定义模板
prompt_template = ChatPromptTemplate.from_messages([
('system', '请将下面的内容翻译成{language}'),
('user', "{text}")
])
# 得到链
chain = prompt_template | model | parser
# print(chain.invoke({'language': 'English', 'text': '我下午还有一节课,不能去打球了。'}))
# 把我们的程序部署成服务
# 创建fastAPI的应用
app = FastAPI(title = '我的Langchain服务', version='V1.0', description='使用Langchain翻译任何语句的服务器')
add_routes(
app,
chain,
path = "/chainDemo"
)
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="localhost", port=8000)