微信扫码
添加专属顾问
探索LangChain如何通过高级架构提升AI应用处理复杂任务的能力。核心内容:1. LangChain系列文章的高级架构设计要点2. 环境配置和API密钥的设置方法3. 工具链(ToolChain)模式在AI应用中的实践示例
大家好,我是胡十一!这是我们LangChain系列的最后一篇,今天要分享的是更高级的架构设计:如何用工具链组织复杂任务,以及如何处理超大型文档。这些技术能让你的AI应用更加强大!
要运行本文示例,需要以下环境配置:
pip install langchain langchain-openai langchain-community python-dotenv
pip install faiss-cpu unstructured
OPENAI_API_KEY=你的阿里云API密钥
mkdir -p data
echo "这是测试长文档..." > data/long_document.txt
当我们的AI应用变得越来越复杂,简单的单模型调用已经不够用了。比如:
这时候,我们需要更高级的架构设计,让AI能够处理复杂任务。
工具链是一种强大的设计模式,可以将多个工具按特定顺序组合使用:
import os
from typing importList, Dict, Any, Callable, Optional
from langchain_core.tools import Tool
from dotenv import load_dotenv
import logging
from datetime import datetime
from collections import Counter
# 配置日志
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s',
handlers=[
logging.FileHandler(f'toolchain_debug_{datetime.now().strftime("%Y%m%d_%H%M%S")}.log'),
logging.StreamHandler()
]
)
logger = logging.getLogger(__name__)
# 加载环境变量
load_dotenv()
classToolChain:
"""工具链基类,用于管理工具的执行流程"""
def__init__(self, name: str):
self.name = name
self.tools: List[Tool] = []
self.conditions: List[Callable] = []
self.metadata: Dict[str, Any] = {}
defadd_tool(self, tool: Tool, condition: Optional[Callable] = None):
"""添加工具到链中"""
self.tools.append(tool)
self.conditions.append(condition or (lambda x: True))
defexecute(self, input_data: Any) -> Any:
"""执行工具链"""
result = input_data
for tool, condition inzip(self.tools, self.conditions):
if condition(result):
try:
logger.info(f"执行工具: {tool.name}")
result = tool.func(result)
logger.info(f"工具 {tool.name} 执行完成")
except Exception as e:
logger.error(f"工具 {tool.name} 执行失败: {str(e)}")
raise
return result
defget_tools(self) -> List[Tool]:
"""获取工具链中的所有工具"""
returnself.tools
# 示例:文本处理工具链
classTextProcessingChain(ToolChain):
"""文本处理工具链"""
def__init__(self):
super().__init__("text_processing")
self.add_tool(
Tool(
name="text_statistics",
description="统计文本的基本信息",
func=self.text_statistics
),
condition=lambda x: isinstance(x, str)
)
self.add_tool(
Tool(
name="format_text",
description="格式化文本",
func=self.format_text
),
condition=lambda x: isinstance(x, str)
)
deftext_statistics(self, text: str) -> str:
"""文本统计工具"""
try:
char_count = len(text)
word_count = len(text.split())
line_count = len(text.splitlines())
words = text.lower().split()
word_freq = Counter(words).most_common(3)
result = f"""文本统计结果:
- 字符数: {char_count}
- 词数: {word_count}
- 行数: {line_count}
- 最常用词: {', '.join(f'{word}({count}次)' for word, count in word_freq)}"""
return result
except Exception as e:
returnf"统计错误: {str(e)}"
defformat_text(self, text: str) -> str:
"""文本格式化工具"""
try:
# 简单示例:转换为大写
return text.upper()
except Exception as e:
returnf"格式化错误: {str(e)}"
# 使用示例
text_chain = TextProcessingChain()
result = text_chain.execute("这是一个示例文本。这是第二句话。这是测试文本。")
print(result)
这个例子展示了工具链的核心思想:
使用工具链的好处是什么?
这种架构特别适合复杂的多步骤任务,比如数据分析流程、自动化报告生成等。
处理大型文档时,我们可以使用Map-Reduce模式:先将文档分割成小块,然后并行处理每个块,最后合并结果。
from langchain_openai import ChatOpenAI
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.document_loaders import TextLoader
from dotenv import load_dotenv
import json
import os
import time
from typing importList, Dict, Any
# 加载环境变量
load_dotenv()
classMapReduceDocumentAnalyzer:
"""使用 Map-Reduce 链的文档分析器类,用于分析长文档"""
def__init__(self,
model_name: str = "qwen-turbo",
api_base: str = "https://dashscope.aliyuncs.com/compatible-mode/v1",
temperature: float = 0.1,
chunk_size: int = 4000,
chunk_overlap: int = 500):
# 初始化LLM
self.analyze_llm = ChatOpenAI(
model=model_name,
openai_api_base=api_base,
temperature=temperature,
model_kwargs={"response_format": {"type": "json_object"}}
)
# 设置文本分割器
self.text_splitter = RecursiveCharacterTextSplitter(
chunk_size=chunk_size,
chunk_overlap=chunk_overlap,
separators=["\n## ", "\n### ", "\n\n", "\n", "。", ",", " "]
)
defprocess_document(self, document_path: str) -> Dict[str, Any]:
"""处理文档的主方法"""
# 加载文档
loader = TextLoader(document_path, encoding="utf-8")
documents = loader.load()
# 分割文档
splits = self.text_splitter.split_documents(documents)
print(f"文档被分割为 {len(splits)} 个块")
# MAP阶段: 处理每个文档块
map_results = []
for i, doc inenumerate(splits):
print(f"处理文档块 {i+1}/{len(splits)}...")
# 构建提示词
prompt = f"""
请分析以下文档片段,找出所有关键信息点:
{doc.page_content}
以JSON格式返回结果:
{{
"key_points": [
{{
"topic": "主题",
"content": "内容摘要",
"importance": "high/medium/low"
}}
]
}}
"""
# 调用LLM分析
result = self.analyze_llm.invoke(prompt).content
map_results.append(result)
# REDUCE阶段: 合并所有结果
reduce_prompt = f"""
请整合以下分析结果,去除重复点,按重要性排序:
{json.dumps(map_results, ensure_ascii=False, indent=2)}
返回最终整合后的JSON结果:
{{
"key_points": [
{{
"topic": "主题",
"content": "内容摘要",
"importance": "high/medium/low"
}}
],
"summary": "整体摘要"
}}
"""
final_result = self.analyze_llm.invoke(reduce_prompt).content
return json.loads(final_result)
# 使用示例
analyzer = MapReduceDocumentAnalyzer()
results = analyzer.process_document("data/long_document.txt")
print(json.dumps(results, ensure_ascii=False, indent=2))
Map-Reduce模式的强大之处:
这种模式特别适合分析长篇论文、报告、法律文件等大型文档。
Refine Chain是另一种处理大型文档的方法,它通过迭代优化来生成最终结果:
from langchain_openai import ChatOpenAI
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.document_loaders import TextLoader
from dotenv import load_dotenv
import json
# 加载环境变量
load_dotenv()
classRefineDocumentAnalyzer:
"""使用 Refine 链的文档分析器类,用于分析长文档"""
def__init__(self,
model_name: str = "qwen-turbo",
api_base: str = "https://dashscope.aliyuncs.com/compatible-mode/v1",
temperature: float = 0.1,
chunk_size: int = 4000,
chunk_overlap: int = 500):
# 初始化LLM
self.analyze_llm = ChatOpenAI(
model=model_name,
openai_api_base=api_base,
temperature=temperature,
model_kwargs={"response_format": {"type": "json_object"}}
)
# 设置文本分割器
self.text_splitter = RecursiveCharacterTextSplitter(
chunk_size=chunk_size,
chunk_overlap=chunk_overlap,
separators=["\n## ", "\n### ", "\n\n", "\n", "。", ",", " "]
)
defprocess_document(self, document_path: str) -> dict:
"""处理文档的主方法"""
# 加载文档
loader = TextLoader(document_path, encoding="utf-8")
documents = loader.load()
# 分割文档
splits = self.text_splitter.split_documents(documents)
print(f"文档被分割为 {len(splits)} 个块")
# 处理第一个文档块
print(f"处理初始文档块 1/{len(splits)}...")
initial_prompt = f"""
请分析以下文档片段:
{splits[0].page_content}
以JSON格式返回关键信息:
{{
"key_points": [
{{
"topic": "主题",
"content": "内容摘要"
}}
],
"summary": "初步摘要"
}}
"""
current_result = self.analyze_llm.invoke(initial_prompt).content
# 依次处理剩余文档块,每次都基于前一次的结果进行精炼
for i, doc inenumerate(splits[1:], 2):
print(f"精炼处理文档块 {i}/{len(splits)}...")
refine_prompt = f"""
已有分析结果:
{current_result}
请基于新的文档片段更新分析结果:
{doc.page_content}
返回更新后的JSON结果,保持相同格式但内容更完整准确。
"""
current_result = self.analyze_llm.invoke(refine_prompt).content
return json.loads(current_result)
# 使用示例
analyzer = RefineDocumentAnalyzer()
results = analyzer.process_document("data/long_document.txt")
print(json.dumps(results, ensure_ascii=False, indent=2))
Refine Chain的优势:
这种模式适合需要连贯性的摘要、报告生成等任务,特别是在分析需要逐步理解深化的专业文档时。
最后一个示例是对话分析器,它能从对话中提取关键信息:
from langchain_openai import ChatOpenAI
from dotenv import load_dotenv
import json
load_dotenv()
classConversationAnalyzer:
"""对话分析器,用于分析对话内容并提取关键信息"""
def__init__(self,
model_name: str = "qwen-plus",
api_base: str = "https://dashscope.aliyuncs.com/compatible-mode/v1",
temperature: float = 0.2):
self.llm = ChatOpenAI(
model=model_name,
openai_api_base=api_base,
temperature=temperature,
model_kwargs={"response_format": {"type": "json_object"}}
)
defanalyze_conversation(self, conversation: list) -> dict:
"""分析对话并提取关键信息"""
# 格式化对话
formatted_conversation = ""
for i, msg inenumerate(conversation):
role = "用户"if msg["role"] == "user"else"助手"
formatted_conversation += f"{role}: {msg['content']}\n\n"
# 构建分析提示词
prompt = f"""
请分析以下对话内容:
{formatted_conversation}
请以JSON格式提取以下信息:
1. 用户意图和需求
2. 情感倾向
3. 关键问题和回答
4. 未解决的问题
5. 后续行动建议
返回格式:
{{
"user_intent": "用户主要意图",
"sentiment": "正面/负面/中性",
"key_qa": [
{{
"question": "关键问题",
"answer": "对应回答",
"is_solved": true/false
}}
],
"unsolved_issues": ["未解决问题1", "未解决问题2"],
"next_steps": ["建议1", "建议2"]
}}
"""
# 调用LLM分析
result = self.llm.invoke(prompt).content
return json.loads(result)
# 使用示例
analyzer = ConversationAnalyzer()
conversation = [
{"role": "user", "content": "你好,我想了解如何使用LangChain构建AI应用"},
{"role": "assistant", "content": "您好!LangChain是一个强大的框架,可以帮助构建基于大语言模型的应用。您有特定的应用场景吗?"},
{"role": "user", "content": "我想做一个能回答公司内部文档问题的AI助手"},
{"role": "assistant", "content": "这是一个很好的应用场景!您需要使用LangChain的RAG(检索增强生成)功能。首先需要处理文档,然后构建向量数据库..."},
{"role": "user", "content": "这听起来很复杂,有没有简单点的方法?而且我担心成本问题"}
]
result = analyzer.analyze_conversation(conversation)
print(json.dumps(result, ensure_ascii=False, indent=2))
对话分析器的应用场景:
这个工具对于需要处理大量对话数据的企业特别有价值,可以大大提高客户服务效率。
在这个系列的最后一篇中,我们探索了LangChain的高级架构:
这些高级架构让我们能够构建更复杂、更强大的AI应用,处理更大规模的数据和更复杂的任务。
希望这个系列对你有所帮助!接下来,就看你如何将这些技术应用到实际项目中了。如果有问题,欢迎在评论区留言!
53AI,企业落地大模型首选服务商
产品:场景落地咨询+大模型应用平台+行业解决方案
承诺:免费POC验证,效果达标后再合作。零风险落地应用大模型,已交付160+中大型企业
2026-07-05
AI Agent 慢在哪?Node.js 探针把模型、工具和服务链路一次串起来
2026-07-05
拆解LangChain刚开源的OpenWiki:如何落地个人Wiki知识库
2026-07-01
LangGraph Runtime 是什么?一文讲清Runtime与Context的作用与用法!
2026-06-26
拆解Agent Harness的11大核心组件与工程实践(附下载)
2026-06-05
让 Agent 快速上生产:基于 OceanBase 和 LangChain 打造的智能体系统解决方案发布
2026-05-19
90% 的 Agent 失败,不是框架不行,而是卡在 5 个工程问题
2026-05-14
用两行代码将 AgentRun 集成到你的应用
2026-05-06
LangChain 深度智能体(Deep Agents)入门
2026-04-19
2026-04-08
2026-05-06
2026-05-19
2026-05-14
2026-06-05
2026-07-05
2026-06-26
2026-07-01
2026-07-05
2026-03-26
2025-11-03
2025-10-29
2025-07-14
2025-07-13
2025-07-05
2025-06-26
2025-06-13
欢迎您使用【53AI 官方网站】(以下简称“本网站”或“我们”)。本《会员服务协议》(以下简称“本协议”)是您(以下简称“会员”或“用户”)与【深圳市博思协创网络科技有限公司】之间关于注册、登录及使用本网站会员服务所订立的法律协议。
在您注册或登录前,请务必审慎阅读、充分理解各条款内容,特别是免除或限制责任的条款、知识产权条款、争议解决条款等。此类条款将以加粗形式提示您注意。 当您通过微信公众号授权、手机验证码验证或其他方式成功登录本网站时,即视为您已完全理解并同意接受本协议的全部内容。
一、 定义
本网站:指由【深圳市博思协创网络科技有限公司】运营的,域名为【53ai.com】的网站及相关移动端页面。
会员服务:指本网站向注册会员提供的知识库文章查阅、内容检索及其他相关增值服务。
知识库内容:指本网站发布的包括但不限于文字、图表、数据、研究报告、行业分析等数字化内容资源。
二、 账号注册与登录
登录方式:本网站支持以下登录方式,您可根据实际情况选择:
微信公众号授权登录:您同意将您的微信OpenID信息授权给本网站,用于创建或关联会员账号。
手机验证码登录:您需提供真实有效的手机号码,并通过短信验证码完成身份验证与登录/注册。
账号安全:您的账号仅限您本人使用,禁止赠与、借用、租用、转让或售卖。因您保管不善导致的账号被盗、密码泄露等损失,由您自行承担。
实名认证:根据相关法律法规要求,我们可能要求您在特定功能下完成实名认证。如您拒绝提供,可能无法使用部分或全部服务。
未成年人保护:若您未满18周岁,请在法定监护人的陪同下阅读本协议,并在征得监护人同意后使用本服务。
三、 服务内容与规范
知识库查阅权限:会员登录后,有权按照其会员等级对应的权限范围,在线浏览、检索本网站知识库中的相关文章及内容。
服务变更:我们有权根据业务发展需要,调整、变更或终止部分服务内容,并将以网站公告、公众号消息等方式提前通知。
禁止行为:您在使用服务时不得实施以下行为:
利用技术手段批量爬取、下载、转存知识库内容;
将知识库内容用于商业目的或未经授权地向第三方传播;
干扰本网站正常运行或侵犯其他用户合法权益;
发布违法违规信息或从事违反公序良俗的活动。
四、 知识产权声明
权利归属:本网站知识库中的排版设计、软件代码等内容的知识产权均归【公司全称】或原权利人所有,受《中华人民共和国著作权法》等法律保护。
有限许可:本网站授予会员一项非独占、不可转让、不可转授权的普通许可,仅限于个人学习、研究之目的在线查阅知识库内容。
侵权追责:未经书面许可,任何单位或个人不得以任何形式复制、转载、摘编、镜像、汇编或以其他方式使用上述内容。一经发现,我们保留追究其法律责任的权利。
五、 个人信息保护
我们重视对您个人信息的保护。关于我们如何收集、使用、存储和保护您的个人信息,请单独阅读 《隐私政策》。
您通过微信公众号授权或手机号验证所提供的信息,我们将严格按照《个人信息保护法》的规定处理,仅用于身份识别、服务提供及安全验证等必要用途。
您可以随时通过网站设置或联系客服行使查阅、更正、删除个人信息及撤回授权同意的权利。
六、 免责声明
内容准确性:知识库内容仅供参考,不构成专业建议。我们不对其完整性、准确性、时效性作任何明示或暗示的保证,您应自行判断并承担使用风险。
不可抗力:因自然灾害、政策法规变化、网络故障、第三方平台接口异常(如微信接口维护、运营商短信通道故障)等不可抗力导致的服务中断或延迟,我们不承担违约责任。
第三方链接:本网站可能包含指向第三方网站的链接,该等网站的内容和服务不受我们控制,请您自行甄别风险。
七、 违约责任
如您违反本协议约定,我们有权视情节采取警告、限制功能、暂停服务、注销账号等措施,并保留要求赔偿损失的权利。
如因您的违约行为导致我们遭受行政处罚、第三方索赔或商誉损失,您应承担全部赔偿责任(包括但不限于罚款、赔偿金、律师费、公证费等)。
八、 法律适用与争议解决
本协议的订立、执行和解释均适用中华人民共和国大陆地区法律。
因本协议产生的或与本协议有关的任何争议,双方应友好协商解决;协商不成的,任何一方均可向【公司所在地】有管辖权的人民法院提起诉讼。
九、 其他
本协议构成双方就本服务达成的完整协议,取代此前任何口头或书面约定。
本协议任一条款被认定为无效或不可执行的,不影响其他条款的效力。
我们对本协议享有最终解释权,并在法律允许的范围内保留随时修改的权利。修改后的协议一经公布即生效,继续使用服务即视为同意修订内容。