用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() | 无特殊访问权限 | 不能访问实例或类属性 |
评论