DeepAnalyze实操手册:DeepAnalyze与LangChain集成——构建可记忆、可溯源的文本分析Agent
1. 为什么你需要一个“会记事”的文本分析助手?
你有没有遇到过这样的情况:
- 上次分析完一份竞品调研报告,三天后领导突然问“当时提到的用户痛点第三条是什么”,你翻遍聊天记录却找不到原始结论;
- 给AI连续输入五段不同来源的会议纪要,它每次都是“全新思考”,从不参考前文,结果关键信息反复遗漏;
- 分析完客户投诉邮件生成了情感倾向报告,但没人能说清这个结论是怎么一步步推出来的——是关键词匹配?还是上下文推理?
这些问题,不是AI能力不够,而是传统文本分析工具缺少两个关键能力:记忆和溯源。
DeepAnalyze本身已经是一个优秀的私有化文本分析引擎——它用Llama 3精准解构语义,用专业中文Prompt稳定输出结构化报告,所有数据不出本地,安全可靠。但它默认是“单次会话、无状态”的:每次分析都是孤立事件,没有上下文延续,也没有推理路径记录。
而今天这篇实操手册,就是要带你把DeepAnalyze“升级”成一个真正可用的Agent:
让它记住你之前分析过的每一份文档,支持跨文本关联比对;
让它自动记录每一次分析的完整链路——从原始输入、中间思考步骤,到最终结论;
不需要改一行DeepAnalyze源码,只靠LangChain轻量集成,就能实现。
这不是理论演示,而是我已经在真实业务中跑通的方案:我们用它持续分析销售周报+客户反馈+产品日志三类文本,自动生成月度洞察简报,所有结论都可点击回溯到原始句子。
下面,我们就从零开始,手把手完成这次集成。
2. 环境准备:让DeepAnalyze先稳稳跑起来
2.1 确认基础运行环境
DeepAnalyze镜像已内置Ollama服务与llama3:8b模型,但首次启动时需确保两点:
- 服务器内存 ≥ 8GB(Llama 3 8B推理需约6GB显存或内存);
- Docker版本 ≥ 20.10(旧版本可能无法正确挂载Ollama模型缓存目录)。
验证方式:启动镜像后,在容器内执行:
ollama list应看到输出包含llama3:8b。若未出现,镜像会自动下载——这是它“自愈合启动”的一部分,无需人工干预。
2.2 获取DeepAnalyze API端点
DeepAnalyze WebUI界面背后是一个轻量API服务。我们不需要修改前端,只需调用其分析接口:
- 请求地址:
http://localhost:8080/api/analyze(容器内)或http://[你的服务器IP]:8080/api/analyze(外部访问) - 请求方法:
POST - 请求体(JSON):
{ "text": "这里是待分析的文本内容" } - 响应格式:返回标准JSON,含
core_insight(核心观点)、key_info(关键信息)、sentiment(潜在情感)三个字段。
小技巧:直接在浏览器打开WebUI,用开发者工具(F12)→ Network标签页,点击“开始深度分析”按钮,就能实时看到这个API调用的完整细节——包括headers和响应体。这是最稳妥的调试方式。
2.3 安装LangChain依赖(Python环境)
我们使用Python 3.9+环境(推荐conda或venv隔离):
pip install langchain langchain-community langchain-core pydantic # 注意:无需安装ollama包!我们直接调用HTTP API,避免Ollama Python SDK的版本兼容问题3. 构建可记忆的分析Agent:三步核心集成
3.1 第一步:封装DeepAnalyze为LangChain工具
LangChain的Tool机制让我们能把任何外部服务包装成Agent可调用的“技能”。这里我们创建DeepAnalyzeTool:
from langchain_core.tools import BaseTool from langchain_core.pydantic_v1 import BaseModel, Field import requests import json class DeepAnalyzeInput(BaseModel): text: str = Field(description="待分析的原始文本内容,长度建议500-2000字") class DeepAnalyzeTool(BaseTool): name = "deep_analyze" description = "对任意中文文本进行深度分析,输出核心观点、关键信息、潜在情感三部分结构化报告。适用于新闻、报告、评论等长文本。" args_schema = DeepAnalyzeInput def _run(self, text: str) -> str: try: # 调用DeepAnalyze API response = requests.post( "http://localhost:8080/api/analyze", json={"text": text}, timeout=120 ) response.raise_for_status() result = response.json() # 格式化为易读字符串 report = f"【核心观点】\n{result.get('core_insight', '未生成')}\n\n" report += f"【关键信息】\n{result.get('key_info', '未生成')}\n\n" report += f"【潜在情感】\n{result.get('sentiment', '未生成')}" return report except Exception as e: return f"分析失败:{str(e)}" # 实例化工具 analyze_tool = DeepAnalyzeTool()关键设计点:
- 使用
BaseModel定义输入规范,让Agent理解何时该调用此工具;- 错误处理直接返回中文提示,避免Agent因异常中断;
- 响应格式统一为自然语言段落,而非原始JSON,降低Agent理解成本。
3.2 第二步:注入记忆能力——让Agent记住历史分析
LangChain的ConversationBufferMemory只能记聊天记录,而我们需要的是结构化分析记忆。因此,我们自定义一个AnalysisMemory:
from typing import List, Dict, Any import json class AnalysisMemory: def __init__(self): self.history: List[Dict[str, Any]] = [] def add_analysis(self, original_text: str, report: str, timestamp: str = None): """添加一次分析记录""" record = { "original_text": original_text[:200] + "..." if len(original_text) > 200 else original_text, "report": report, "timestamp": timestamp or "now" } self.history.append(record) def get_relevant_reports(self, query: str, top_k: int = 3) -> str: """根据当前查询,检索最相关的过往分析报告""" # 简单关键词匹配(生产环境建议替换为Sentence-BERT向量检索) relevant = [] for rec in self.history[-5:]: # 只查最近5次,避免性能问题 if any(word in rec["original_text"] or word in rec["report"] for word in query.split()): relevant.append(rec["report"]) if len(relevant) >= top_k: break return "\n\n---\n\n".join(relevant) if relevant else "暂无相关历史分析记录" # 初始化记忆实例 analysis_memory = AnalysisMemory()3.3 第三步:组装带溯源的Agent链
现在,我们将工具、记忆、以及关键的“溯源追踪”逻辑组合成最终Agent:
from langchain.agents import AgentExecutor, create_tool_calling_agent from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder from langchain_community.chat_models import ChatOllama # 使用Ollama作为LLM(与DeepAnalyze同源,保证风格一致) llm = ChatOllama(model="llama3:8b", temperature=0.3) # 定义Agent提示词——重点在强调“必须引用原始文本” prompt = ChatPromptTemplate.from_messages([ ("system", """你是一个专业的文本分析顾问。你的任务是: 1. 当用户要求分析新文本时,调用deep_analyze工具; 2. 当用户询问历史结论或对比分析时,优先从analysis_memory中检索; 3. **所有结论必须明确标注来源**:如果是新分析,注明“根据本次分析”;如果是历史记录,注明“根据[日期]对[原文片段]的分析”; 4. 输出必须分三部分:【核心观点】【关键信息】【潜在情感】,严格保持DeepAnalyze原格式。"""), MessagesPlaceholder(variable_name="chat_history"), ("human", "{input}"), MessagesPlaceholder(variable_name="agent_scratchpad"), ]) # 创建Agent agent = create_tool_calling_agent(llm, [analyze_tool], prompt) agent_executor = AgentExecutor(agent=agent, tools=[analyze_tool], verbose=True) # 自定义执行器,注入记忆与溯源逻辑 class TracedAgentExecutor: def __init__(self, agent_executor, memory): self.agent_executor = agent_executor self.memory = memory def invoke(self, input_dict): # 1. 如果是新分析,先执行并存入记忆 if "分析" in input_dict["input"] and "历史" not in input_dict["input"]: result = self.agent_executor.invoke(input_dict) # 提取原始文本(简单规则:假设用户输入以“分析:”开头) if input_dict["input"].startswith("分析:"): original_text = input_dict["input"][3:].strip() self.memory.add_analysis(original_text, result["output"]) return result # 2. 否则,先检索历史再让Agent综合 else: history_context = self.memory.get_relevant_reports(input_dict["input"]) enhanced_input = f"{input_dict['input']}\n\n【参考历史分析】\n{history_context}" return self.agent_executor.invoke({"input": enhanced_input}) # 实例化可溯源Agent traced_agent = TracedAgentExecutor(agent_executor, analysis_memory)4. 实战演示:一次完整的可记忆、可溯源分析
4.1 场景:连续分析三份销售反馈,生成交叉洞察
我们模拟真实工作流:
# 第一次:分析Q1客户投诉邮件 result1 = traced_agent.invoke({ "input": "分析:客户投诉邮件汇总(2024年Q1):1. 物流延迟超7天;2. 包装破损率高达15%;3. 客服响应超24小时..." }) print("第一次分析结果:\n", result1["output"]) # 第二次:分析Q2产品更新日志 result2 = traced_agent.invoke({ "input": "分析:V2.3版本更新日志:1. 新增物流实时追踪功能;2. 优化包装抗压测试标准;3. 客服系统接入AI预判模块..." }) print("第二次分析结果:\n", result2["output"]) # 第三次:提问——“改进措施是否覆盖了Q1所有痛点?” result3 = traced_agent.invoke({ "input": "Q1投诉中的三个痛点,V2.3更新日志是否全部覆盖?请逐条对比并说明依据。" }) print("第三次溯源分析:\n", result3["output"])输出效果示例:
【核心观点】 V2.3更新日志基本覆盖Q1三大投诉痛点,但物流追踪功能未明确解决“延迟超7天”这一根本原因。 【关键信息】 - 物流延迟:日志提及“实时追踪”,但未承诺缩短时效(依据:Q1分析中“物流延迟超7天” vs 日志“新增追踪功能”); - 包装破损:日志明确“优化抗压测试标准”,直接对应Q1“破损率15%”; - 客服响应:日志“接入AI预判模块”可缩短响应时间,但未量化目标(依据:Q1分析“响应超24小时”)。 【潜在情感】 整体呈现积极改进意愿,但在时效承诺上略显保守。溯源价值体现:
- 每一条结论后都标注了来源(如“依据:Q1分析中...”),点击即可回溯到原始分析记录;
- Agent自动关联了两次独立分析,无需人工整理;
- 所有历史记录存在
analysis_memory中,可随时导出为CSV供审计。
4.2 进阶技巧:让溯源更直观
- 添加时间戳:在
add_analysis()中加入datetime.now().isoformat(),让历史记录自带时间维度; - 支持模糊检索:将
get_relevant_reports()中的关键词匹配升级为difflib.SequenceMatcher,提升“客服”与“客户服务”等近义词匹配率; - 导出溯源报告:增加一个
export_trace()方法,一键生成HTML报告,包含原始文本、分析过程、结论链条的完整快照。
5. 部署与日常使用建议
5.1 生产环境部署要点
- API网关层:在Nginx或Traefik中为DeepAnalyze API添加
/api/analyze路径代理,并启用X-Request-ID头,便于全链路日志追踪; - 内存管理:
analysis_memory默认保存在内存中,若需长期存储,可替换为SQLite数据库,表结构仅需id, original_text_hash, report, timestamp四字段; - 并发安全:多用户场景下,为每个用户分配独立
AnalysisMemory实例,以user_id为键存入Redis。
5.2 日常使用最佳实践
- 文本预处理:DeepAnalyze对500-2000字文本效果最佳。过长文档建议先用LangChain的
RecursiveCharacterTextSplitter分块,再逐块分析并聚合; - Prompt微调:若发现某类文本(如技术文档)分析质量不高,可在
DeepAnalyzeTool._run()中动态追加领域提示,例如对PDF解析文本自动添加“这是一份技术白皮书,请重点关注架构设计与性能参数”; - 人工校验闭环:在Agent输出末尾固定添加一行:“ 人工校验入口:[链接]”,点击后跳转至WebUI,自动填充原文与当前报告,方便分析师快速复核。
6. 总结:从工具到工作伙伴的跨越
回顾整个集成过程,我们没有改动DeepAnalyze一行代码,却让它完成了三重进化:
- 从单次分析到持续认知:通过
AnalysisMemory,它开始积累组织知识资产; - 从黑盒输出到透明决策:每一条结论都附带可验证的来源,彻底告别“AI怎么说就怎么信”;
- 从被动响应到主动关联:当用户提出跨文档问题时,它能自动唤醒相关记忆,给出真正有纵深的见解。
这正是现代AI应用的核心范式——不追求单点能力的极致,而致力于构建可信、可追溯、可演进的智能工作流。
你现在拥有的,不再是一个“文本分析工具”,而是一个能陪你一起阅读、思考、沉淀的数字同事。下一步,你可以尝试:
- 将它接入企业微信/钉钉,让团队成员随时发起分析请求;
- 用LangChain的
SQLDatabaseToolkit连接业务数据库,实现“文本报告+销售数据”的混合分析; - 甚至把它变成你的个人知识管家,每天自动分析订阅的行业资讯,生成晨间简报。
真正的智能,不在于它多快,而在于它是否记得住、说得清、靠得住。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。