采用Langchain调用LLM完成简单翻译任务

采用 LangChain 调用 LLM 大语言模型

任务介绍

本项目是一个基于 LangChain 框架的大语言模型(LLM)调用示例,主要功能是:

  1. 多模型支持:统一接口调用多种大语言模型,包括 OpenAI 和主流国产模型
  2. 翻译服务:构建一个可配置的多语言翻译服务
  3. 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

链的执行流程

  1. 输入字典 {'language': 'English', 'text': '...'}
  2. Prompt 模板填充变量,生成完整的消息列表
  3. 模型处理消息,返回 AIMessage 对象
  4. 解析器提取 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": "我下午还有一节课,不能去打球了。"
    }
  }'
软件调用

关键设计模式

  1. 统一接口模式 :所有模型通过 ChatOpenAI 统一接口,通过 base_url 适配不同平台
  2. 链式组合模式:使用管道操作符组合 Prompt、Model、Parser
  3. 配置驱动模式:通过环境变量和配置变量控制行为
  4. 服务化模式:将链封装为 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)
相关推荐
Miku163 小时前
LangGraph+BrightData+PaperSearch的研究助理
爬虫·langchain·mcp
汗流浃背了吧,老弟!14 小时前
基于 LangChain 和 Hugging Face 的 RAG 问答系统实现
langchain
wshzd14 小时前
LLM之Agent(二十九)|LangChain 1.0核心组件介绍
前端·javascript·langchain
zhangbaolin15 小时前
深度智能体-人机回环
langchain·大模型·人机交互·深度智能体
g32308631 天前
langchain langGraph 中streaming 流式输出 stream_mode
langchain·langgraph
zhangbaolin1 天前
深度智能体的中间件
中间件·langchain·大模型·深度智能体
小程故事多_801 天前
LangGraph系列:多智能体终极方案,ReAct+MCP工业级供应链系统
人工智能·react.js·langchain
世界那么哒哒1 天前
LangChain v1.0+ 如何构建自定义中间件来拦截和控制 Agent 执行过程
langchain·agent
serve the people2 天前
Prompts for Chat Models in LangChain
java·linux·langchain