构建智能文本处理流水线
简单demo测试并行测试
python
import asyncio
import time
from langchain_core.runnables import RunnableParallel, RunnableLambda
# 模拟耗时任务(同步写法,RunnableLambda 直接支持)
def task(name: str, delay: float):
print(f"[{name}] 开始执行,需要 {delay}s")
time.sleep(delay) # 模拟耗时
print(f"[{name}] 执行完成!")
return f"{name} 结果"
# 包装成 LangChain 链
chainA = RunnableLambda(lambda _: task("摘要任务", 2))
chainB = RunnableLambda(lambda _: task("关键词任务", 1.5))
chainC = RunnableLambda(lambda _: task("情感分析", 1))
# 并行执行
parallel_chain = RunnableParallel(
摘要=chainA,
关键词=chainB,
情感=chainC
)
async def main():
start = time.time()
# 执行并行链
result = await parallel_chain.ainvoke("输入文本")
print("\n最终结果:", result)
print(f"总耗时:{time.time() - start:.2f}s")
asyncio.run(main())
需求分析
构建一个智能文本处理流水线,实现以下功能:
-
文本预处理:清理输入文本
-
多维度分析(并行执行):
-
摘要生成
-
关键词提取
-
情感分析
-
语言检测
-
-
结果整合:将所有分析结果整合为结构化报告
python
import asyncio
from datetime import datetime
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser, JsonOutputParser
from langchain_core.runnables import (
RunnableLambda,
RunnableParallel,
RunnablePassthrough
)
import os
from dotenv import load_dotenv
# ========== 1. 初始化模型 ==========
load_dotenv()
api_key = os.getenv("DASHSCOPE_API_KEY")
base_url = os.getenv("DASHSCOPE_BASE_URL") or "https://dashscope.aliyuncs.com/compatible-mode/v1"
model_name = os.getenv("DASHSCOPE_MODEL_NAME") or "qwen-max"
model = ChatOpenAI(
api_key=api_key,
base_url=base_url,
model=model_name,
temperature=0,
)
# ========== 2. 文本预处理 ==========
def preprocess_text(text: str) -> dict:
cleaned = text.strip()
cleaned = " ".join(cleaned.split()) # 规范化空白
return {
"text": cleaned,
"original_length": len(text),
"cleaned_length": len(cleaned),
"timestamp": datetime.now().isoformat()
}
# ========== 3. 各分析链 ==========
# 摘要链
summary_prompt = ChatPromptTemplate.from_template(
"请用50字以内总结以下文本的核心内容:\n\n{text}"
)
summary_chain = (
(lambda x: {"text": x["text"]})
| summary_prompt
| model
| StrOutputParser()
)
# 关键词链
keywords_prompt = ChatPromptTemplate.from_template(
"""提取以下文本的5个关键词,以JSON数组格式返回:
文本:{text}
只返回JSON数组,格式如:["关键词1", "关键词2", ...]"""
)
keywords_chain = (
(lambda x: {"text": x["text"]})
| keywords_prompt
| model
| JsonOutputParser()
)
# 情感分析链(这里用双花括号转义 JSON 示例)
sentiment_prompt = ChatPromptTemplate.from_template(
"""分析以下文本的情感倾向,返回JSON格式:
{{
"sentiment": "positive/negative/neutral",
"confidence": 0.0-1.0,
"reason": "简要说明原因"
}}
文本:{text}"""
)
sentiment_chain = (
(lambda x: {"text": x["text"]})
| sentiment_prompt
| model
| JsonOutputParser()
)
# 语言检测链(同样转义 JSON 示例)
language_prompt = ChatPromptTemplate.from_template(
"""检测以下文本的语言,返回JSON格式:
{{
"language": "语言名称",
"code": "语言代码(如zh、en)",
"confidence": 0.0-1.0
}}
文本:{text}"""
)
language_chain = (
(lambda x: {"text": x["text"]})
| language_prompt
| model
| JsonOutputParser()
)
# ========== 4. 并行分析 ==========
parallel_analysis = RunnableParallel({
"summary": summary_chain,
"keywords": keywords_chain,
"sentiment": sentiment_chain,
"language": language_chain,
"metadata": RunnablePassthrough(), # 透传预处理信息
})
# ========== 5. 报告整合 ==========
def format_report(analysis_results: dict) -> dict:
return {
"report": {
"generated_at": datetime.now().isoformat(),
"text_info": {
"original_length": analysis_results["metadata"]["original_length"],
"cleaned_length": analysis_results["metadata"]["cleaned_length"],
},
"analysis": {
"summary": analysis_results["summary"],
"keywords": analysis_results["keywords"],
"sentiment": analysis_results["sentiment"],
"language": analysis_results["language"],
},
}
}
# ========== 6. 整体流水线 ==========
text_analysis_pipeline = (
RunnableLambda(preprocess_text)
| parallel_analysis
| RunnableLambda(format_report)
).with_config(run_name="TextAnalysisPipeline")
# ========== 7. 运行 & 事件调试 ==========
async def main():
sample_text = """
人工智能(Artificial Intelligence,简称AI)是计算机科学的一个分支,
它试图理解智能的本质,并生产出一种新的能以人类智能相似的方式做出反应的智能机器。
近年来,随着深度学习技术的突破,AI在图像识别、自然语言处理、游戏对弈等领域
取得了显著成就,正在深刻改变着人类的生活和工作方式。
"""
print("=" * 60)
print("开始文本分析...")
print("=" * 60)
async for event in text_analysis_pipeline.astream_events(
sample_text,
version="v2",
):
if event["event"] == "on_chain_start":
print(f"▶ 开始: {event.get('name', 'unknown')}")
elif event["event"] == "on_chain_end":
if event.get("name") == "TextAnalysisPipeline":
result = event["data"]["output"]
print("\n" + "=" * 60)
print("分析报告")
print("=" * 60)
report = result["report"]
print(f"\n📊 文本信息:")
print(f" 原始长度: {report['text_info']['original_length']} 字符")
print(f" 清理后长度: {report['text_info']['cleaned_length']} 字符")
print(f"\n📝 摘要:")
print(f" {report['analysis']['summary']}")
print(f"\n🏷️ 关键词:")
print(f" {', '.join(report['analysis']['keywords'])}")
print(f"\n😊 情感分析:")
sentiment = report["analysis"]["sentiment"]
print(f" 倾向: {sentiment['sentiment']}")
print(f" 置信度: {sentiment['confidence']}")
print(f" 原因: {sentiment['reason']}")
print(f"\n🌍 语言检测:")
lang = report["analysis"]["language"]
print(f" 语言: {lang['language']} ({lang['code']})")
print(f" 置信度: {lang['confidence']}")
if __name__ == "__main__":
asyncio.run(main())
运行效果
python
============================================================
开始文本分析...
============================================================
▶ 开始: TextAnalysisPipeline
▶ 开始: preprocess_text
▶ 开始: RunnableParallel<summary,keywords,sentiment,language,metadata>
▶ 开始: RunnableSequence
▶ 开始: RunnableSequence
▶ 开始: RunnableSequence
▶ 开始: RunnableSequence
▶ 开始: RunnablePassthrough
▶ 开始: RunnableLambda
▶ 开始: RunnableLambda
▶ 开始: RunnableLambda
▶ 开始: RunnableLambda
▶ 开始: format_report
============================================================
分析报告
============================================================
📊 文本信息:
原始长度: 175 字符
清理后长度: 153 字符
📝 摘要:
人工智能旨在创造能像人类一样反应的智能机器,近年来在多个领域取得显著成就,改变着人们的生活和工作。
🏷️ 关键词:
, 人工智能, , 人工智能, 深度, 人工智能, 深度学习, , 人工智能, 深度学习, 图像识别, 自然语言, 人工智能, 深度学习, 图像识别, 自然语言处理, 改变, 人工智能, 深度学习, 图像识别, 自然语言处理, 改变生活
😊 情感分析:
倾向: positive
置信度: 0.95
原因: 文本中提到了人工智能领域取得的显著成就以及它对人类生活和工作方式带来的积极变化,整体语气乐观向上。
🌍 语言检测:
语言: 中文 (zh)
置信度: 1.0