-
他们讨论的是哪些方面(食物与服务)? -
他们对每个人的感受有多强烈 -
他们为什么会有这种感觉
cleaned = clean_text (text)
prompt = build_prompt (cleaned)
response = llm.invoke (prompt)
result = parse_response (response)
return result
result = await chain.ainvoke({ "text" : text})
-
更易于阅读:思路清晰明了。 -
更易于修改:可以轻松更换组件。 -
更易于测试:每个部件都是独立的。 -
速度更快:内置异步支持和批量处理功能
用户提供类似“狗不理披萨店”的查询。我们使用 Google Places API 将其转换为一个place_id不会改变的稳定标识符。
这是 LCEL 的优势所在。每份审核报告都会经过我们的流程处理:
多条评论并行处理(多亏了abatch()),我们返回包含情感分数、方面和解释的结构化数据。
"" "
LCEL 链:(预处理) -> prompt -> llm -> Pydantic 解析器
" ""
# 步骤 1:创建 Pydantic 输出解析器
parser = PydanticOutputParser(pydantic_object=ReviewSentiment)
# 步骤 2:定义系统提示
system = (
"您是一位精准的情感分析师。 "
"返回一个严格匹配给定模式的 JSON 对象。\n"
"{format_instructions}\n"
"评分:negative=-1..-0.05,neutral≈-0.05..0.05,positive=0.05..1.0。\n"
"保持理由简洁。如果存在,则提取方面;否则返回空列表。"
)
# 步骤 3:创建提示模板
prompt = ChatPromptTemplate.from_messages([
( "system" , system ),
( "user" , “分析以下评论的情感。\n”
“语言提示:{language_hint}\n”
“文本:```
{text}
```” ),
])
# 步骤 4:初始化 LLM
llm = build_llm(model_name)
# 步骤 5:预处理步骤
pre = RunnableLambda(
lambda x : {
"text" : normalize_text( x [ "text" ]),
"language_hint" : x.get( "language_hint" ),
"format_instructions" : parser.get_format_instructions(),
}
)
# 步骤 6:使用管道运算符构建链 chain
= pre | prompt | llm | parser
return chain
lambda x: {
"text" : normalize_text(x[ "text" ]),
"language_hint" : x. get ( "language_hint" ),
"format_instructions" : parser.get_format_instructions(),
}
)
( "system" , system),
( "user" , "分析情感..." )
])
-
系统消息设置上下文和角色 -
用户消息包含实际数据 -
模板会自动处理变量替换。
-
从LLM答题中提取文本 -
解析 JSON -
根据您的 Pydantic 模型进行验证 -
返回一个类型化的 Python 对象
positive = "positive"
neutral = "neutral"
negative = "negative"
class AspectSentiment ( BaseModel ):
aspect: str = Field(..., description= "提及的方面/主题" )
label: SentimentLabel
score: float = Field(..., ge= -1.0 , le= 1.0 )
class ReviewSentiment ( BaseModel ):
text: str
language: Optional [ str ] = None
label: SentimentLabel
score: float = Field(..., ge= -1.0 , le= 1.0 )
rationale: str = Field(..., description= "简短解释" )
aspects: List [AspectSentiment] = Field(default_factory= list )
-
自动验证:立即检测出无效数据。 -
类型提示:您的 IDE 知道该预期是什么 -
JSON 模式生成:解析器使用此信息来告知 LLM 要返回的格式。 -
结构保证:您始终能获得预期格式的数据
chain = build_sentiment_chain (payload.model_name)
inputs = [
{"text": t, "language_hint" : payload.language_hint}
for t in payload.texts ]
#
并行处理所有评论!
results: List[ReviewSentiment] = await chain.abatch ( inputs)
return results
-
并行执行:所有评论同时处理 -
速率限制:自动遵守 API 限制。 -
错误处理:个别故障不会导致批处理停止。 -
进度跟踪:您可以监控正在发生的事情。
“返回一个严格符合给定模式的 JSON 对象。\n ”
“{format_instructions} \n ”
“评分:负面=-1..-0.05,中性≈-0.05..0.05,正面=0.05..1.0。\n ”
“保持理由简洁。如果存在,则提取相关方面;否则返回空列表。”
-
角色定义:“您是一位精准的情感分析师”——这有助于模型采用正确的角色。 -
格式要求:明确指定要返回的格式。 -
评分指南:明确的评分范围可避免出现歧义分数。 -
输出指南:告诉模型何时提取方面以及解释的长度。
"语言提示:{language_hint} \n "
"文本:`""
{text}
`""
result2 = analyze(text2) # 等待 2 秒
# 总计:4 秒
analyze(text1), # 立即开始
analyze(text2) # 立即开始
)
# 总计:约 2 秒(并行)
-
批量处理:通过同时处理多个项目来降低开销。 -
模型选择:gpt-4o-mini价格比其他方法便宜 10 倍gpt-4o,而且非常适合情感分析。 -
提示优化:更短的提示 = 更低的成本。 -
缓存:缓存相同评论的结果,以避免重复的 API 调用。
管道运算符 ( |) 创建了一个清晰的流程,易于理解和修改。每个组件都是独立的,这使得测试和调试更加容易。
使用 Pydantic 模型可PydanticOutputParser确保您始终获得预期格式的数据。这可以消除一大类错误。
现代 AI 应用需要高效地处理多个请求。LCEL 内置的异步支持让这一切变得自然而然。
提示的细微改动都可能显著影响输出质量。花时间完善提示——这是值得的。
API 可能会出现故障,网络可能会超时。务必妥善处理错误,并向用户提供有意义的反馈。
-
Google Places 客户端:处理外部 API 调用 -
LCEL链:管理人工智能处理 -
FastAPI:处理 HTTP 请求和响应 -
Pydantic:确保每一步的数据验证
-
尝试不同的提示,看看它们如何影响输出 -
尝试不同的LLM模型以了解它们的优势。 -
在此基础上构建您自己的功能 -
部署到生产环境,看看它在负载下的性能如何。
往期推荐

