用LCEL搭建构建一个简单的LLM应用

Pt1—用LCEL搭建构建一个简单的LLM应用

环境配置

LangSmith 环境配置

# 基本环境变量
LangSmith_Key_API = "lsv2_ptxxx"
Deepseek_Key_API = "sk-xxx"

# 1. 安装必要库
# pip install langsmith

# 2. 配置环境变量
import os
os.environ["LANGCHAIN_API_KEY"] = LangSmith_Key_API
os.environ["LANGCHAIN_TRACING_V2"] = "true"
os.environ["LANGCHAIN_PROJECT"] = "lineaLLMwithLCEL"

# 3. LangSmith追踪开启

LangChain 环境配置

# 1. 安装必要库
# pip install langchain langchain-openai

# 2. 配置环境变量
os.environ["DEEPSEEK_API_KEY"] = Deepseek_Key_API

语言模型基础调用

核心概念

  • ChatModel: 对话模型,接收消息列表,返回消息
  • Message类型:
    • SystemMessage: 系统提示,指导AI的行为
    • HumanMessage: 用户输入
    • AIMessage: AI的回复

基本代码示例

from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage, SystemMessage

# 1. 创建模型实例(DeepSeek模型)
model = ChatOpenAI(
    base_url="https://api.deepseek.com/v1",
    api_key=os.environ["DEEPSEEK_API_KEY"],
    model="deepseek-chat",  # 或 "deepseek-reasoner"(深度思考模式)
)

# 2. 准备对话消息
messages = [
    SystemMessage(content="将以下内容从英语翻译成意大利语"),
    HumanMessage(content="你好,世界!"),
]

# 3. 调用模型
response = model.invoke(messages)
print(response.content)  # 输出: Ciao, mondo!

# 4. 调用成本分析
print(f"输入Token: {response.usage_metadata['input_tokens']}")
print(f"输出Token: {response.usage_metadata['output_tokens']}")
print(f"总Token: {response.usage_metadata['total_tokens']}")

OutputParsers(输出解析器)

功能说明

OutputParser 用于解析模型的输出,提取需要的信息。StrOutputParser 是最简单的输出解析器,专门提取模型回复中的文本内容。

使用示例

from langchain_core.output_parsers import StrOutputParser

# 创建解析器
parser = StrOutputParser()

# 不使用管道操作符
result = model.invoke(messages)
parsed_result = parser.invoke(result)
print(parsed_result)

# 使用管道操作符(推荐)
chain = model | parser
result = chain.invoke(messages)
print(result)

Prompt Template(提示模板)

功能说明

PromptTemplate 是用于生成提示的模板,允许创建可重用的提示结构,包含变量占位符,运行时被实际值替换。

使用示例

from langchain_core.prompts import ChatPromptTemplate

# 1. 定义系统提示模板
system_template = "将以下内容从英语翻译成{语言}"
user_template = "{内容}"

# 2. 创建完整的提示模板
prompt_template = ChatPromptTemplate.from_messages([
    ("system", system_template),
    ("user", user_template)
])

# 3. 使用模板
prompt_value = prompt_template.invoke({
    "语言": "意大利语",
    "内容": "你好,世界!"
})

LCEL(LangChain表达式语言)

核心思想

将LLM应用构建为一系列可组合的组件,通过管道操作符(|)连接。每个组件接收输入,产生输出,输出作为下一个组件的输入。

完整示例

from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser

# 1. 创建各个组件
model = ChatOpenAI(
    base_url="https://api.deepseek.com/v1",
    api_key=os.environ["DEEPSEEK_API_KEY"],
    model="deepseek-chat"
)

prompt_template = ChatPromptTemplate.from_messages([
    ("system", "将以下内容从英语翻译成{语言}"),
    ("user", "{内容}")
])

parser = StrOutputParser()

# 2. 链接组件
chain = prompt_template | model | parser

# 3. 调用链
result = chain.invoke({
    "语言": "日本语",
    "内容": "hello,world"
})

print(f"翻译结果: {result}")  # 输出: こんにちは、世界

使用LangServe服务

功能说明

LangServe 是LangChain的部署工具,可以将LangChain应用快速转换为REST API服务。

服务器创建 (server.py)

#!/usr/bin/env python
from fastapi import FastAPI
from langserve import add_routes
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_openai import ChatOpenAI

# 1. 创建模型组件
model = ChatOpenAI(
    base_url="https://api.deepseek.com/v1",
    api_key=os.environ["DEEPSEEK_API_KEY"],
    model="deepseek-chat"
)

# 2. 创建提示模板
prompt_template = ChatPromptTemplate.from_messages([
    ("system", "将以下内容从英语翻译成{语言}"),
    ("user", "{内容}")
])

# 3. 创建解析器
parser = StrOutputParser()

# 4. 创建处理链
chain = prompt_template | model | parser

# 5. 创建FastAPI应用
app = FastAPI(
    title="翻译服务API",
    version="1.0",
    description="一个简单的翻译服务,使用LangChain构建",
)

# 6. 添加路由
add_routes(
    app,
    chain,
    path="/translate",  # API路径
)

# 7. 运行服务器
if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="localhost", port=8000)

运行服务器

python server.py

客户端调用

from langserve import RemoteRunnable

# 创建远程调用对象
remote_chain = RemoteRunnable("http://localhost:8000/translate/")

# 调用远程服务
result = remote_chain.invoke({
    "language": "french",
    "text": "How are you?"
})

print(f"翻译结果: {result}")  # 输出: Comment allez-vous ?

重要概念说明

路由(Routes)

路由是Web开发中的核心概念,将特定的URL路径映射到具体的处理函数。简单说,路由就是网络的"导航系统"。

Uvicorn

Uvicorn 是一个ASGI(异步服务器网关接口)Web服务器,专门用于运行Python异步Web应用。它是Python Web应用的"发动机",负责接收HTTP请求、调用代码、返回响应。

Playground测试界面

运行服务器后,在浏览器中打开:http://localhost:8000/translate/playground/
这是一个交互式界面,可以:

  • 输入JSON格式的参数
  • 点击"Execute"运行
  • 查看实时输出结果

Python数据结构对比

结构 有序性 可变性 唯一性 存储方式
集合 无序 可变 元素唯一 存储唯一值
列表 有序 可变 允许重复 按序存储
元组 有序 不可变 允许重复 按序存储
字典 无序 可变 键唯一 键值映射

类方法 vs 实例方法 vs 静态方法

类型 第一个参数 调用方式 能访问什么 不能访问什么
实例方法 self obj.method() 实例属性、其他实例方法 通常不能直接访问类属性
类方法 cls ClassName.method() 类属性、其他类方法 不能访问实例属性
静态方法 ClassName.method() 无特殊访问权限 不能访问实例或类属性

评论