采用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)
相关推荐
lusasky7 小时前
AgentScope、LangChain、AutoGen 全方位对比 + 混用可行性指南
microsoft·langchain
前端阿森纳20 小时前
从产品经理视角拆解 LangChain 的抽象设计
langchain·llm·aigc
大模型真好玩1 天前
LangGraph1.0速通指南(一)—— LangGraph1.0 核心概念、点、边
人工智能·langchain·agent
阿里云云原生1 天前
AgentRun Sandbox SDK 正式开源!集成 LangChain 等主流框架,一键开启智能体沙箱新体验
阿里云·langchain·开源·serverless·agentarun
、、、、南山小雨、、、、1 天前
最简单的LangChain和RAG
langchain
路边草随风1 天前
langchain agent动态变更系统prompt
人工智能·python·langchain·prompt
Jack___Xue1 天前
LangChain实战快速入门笔记(六)--LangChain使用之Agent
笔记·langchain·unix
大模型教程2 天前
使用Langchain4j和Ollama3搭建RAG系统
langchain·llm·ollama
Elwin Wong2 天前
本地运行LangChain Agent用于开发调试
人工智能·langchain·大模型·llm·agent·codingagent
FreeCode2 天前
智能体设计模式解析:ReAct模式
设计模式·langchain·agent