当 AI 遇上福尔摩斯:基于 LangChain 打造智能案件分析系统
发表于 2025-1-2 · 作者:[Andrew]
“当你排除了所有的不可能,剩下的,不管多么难以置信,都一定是真相。” —— 夏洛克·福尔摩斯
引言
在贝克街221B,福尔摩斯用他敏锐的观察力和缜密的推理解开一个个谜题。而今天,我们将借助人工智能的力量,让这位传奇侦探的方法在数字时代重现光彩。本文将详细介绍如何使用 LangChain 框架和通义千问大模型构建一个智能案件分析系统,展示 AI 如何成为现代的福尔摩斯。
🔍 系统概览
核心技术栈
- LangChain: 0.0.350+
- DashScope: 1.10.0+
- Flask: 2.0.1
- SQLAlchemy: 1.4.23
- MySQL: 8.0+
处理流程
当一个案件文档到达我们的数字化贝克街221B时,会经历以下分析过程:
-
文件接收与预处理
- 多格式文件支持(txt, pdf, doc, docx)
- 智能编码识别
- 文本规范化处理
-
AI 驱动的演绎分析
- 提示词工程
- LLM 调用链
- 结构化输出解析
-
信息提取与整理
- 实体识别
- 关系抽取
- 时间线构建
-
知识图谱构建
- 实体关系可视化
- 案件线索追踪
- 交互式探索
🛠️ LangChain 实现细节
1. 自定义 LLM 实现
我们通过继承 LangChain 的基类来实现通义千问的接入:
from langchain.llms.base import LLM
from typing import Any, List, Optional
class DashScopeLLM(LLM):
"""通义千问 LLM 实现"""
api_key: str
model_name: str = "qwen-plus"
temperature: float = 0.7
top_p: float = 0.8
max_tokens: int = 8000 # 通义千问的最大token限制
@property
def _llm_type(self) -> str:
return "dashscope"
def _call(
self,
prompt: str,
stop: Optional[List[str]] = None,
run_manager: Optional[Any] = None,
**kwargs: Any,
) -> str:
"""核心调用实现"""
messages = [{"role": "user", "content": prompt}]
response = dashscope.Generation.call(
model=self.model_name,
messages=messages,
api_key=self.api_key,
result_format='message',
temperature=self.temperature,
top_p=self.top_p,
max_tokens=self.max_tokens,
**kwargs,
)
if response.status_code == 200:
return response.output.choices[0].message.content
else:
raise Exception(f"API调用失败: {response.code} - {response.message}")
2. 提示词工程
使用 LangChain 的 PromptTemplate 来构建结构化的提示词:
from langchain.prompts import PromptTemplate
from langchain.output_parsers import ResponseSchema, StructuredOutputParser
# 定义输出模式
response_schemas = [
ResponseSchema(name="characters", description="提取的人物信息列表"),
ResponseSchema(name="cases", description="提取的案件信息列表"),
ResponseSchema(name="appearances", description="提取的出场信息列表")
]
output_parser = StructuredOutputParser.from_response_schemas(response_schemas)
# 创建提示词模板
template = """
系统指令:你是一个专业的案件分析助手,擅长从案件文档中提取关键信息。
用户输入:{user_input}
请分析以上内容,提取关键信息,包括:
1. 所有出现的人物及其特征
2. 案件的基本信息(时间、地点、性质等)
3. 人物与案件的关联关系
{format_instructions}
"""
prompt = PromptTemplate(
template=template,
input_variables=["user_input"],
partial_variables={"format_instructions": output_parser.get_format_instructions()}
)
3. 构建推理链
使用 LangChain 的新式管道操作符来构建推理链:
from langchain_core.runnables import RunnablePassthrough
# 构建处理链
chain = prompt | llm | output_parser
# 执行推理
result = chain.invoke({
"user_input": case_content
})
4. 错误处理与重试机制
实现智能的错误处理和重试逻辑:
from tenacity import retry, stop_after_attempt, wait_exponential
@retry(
stop=stop_after_attempt(3),
wait=wait_exponential(multiplier=1, min=4, max=10)
)
def analyze_with_retry(content: str) -> dict:
"""带重试机制的分析函数"""
try:
result = chain.invoke({"user_input": content})
validate_output(result) # 验证输出格式
return result
except Exception as e:
logger.error(f"分析失败: {str(e)}")
raise
📊 数据模型设计
实体关系模型
使用 SQLAlchemy 实现的核心数据模型:
from sqlalchemy import create_engine, Column, Integer, String, ForeignKey, JSON
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship
Base = declarative_base()
class Character(Base):
"""人物模型"""
__tablename__ = 'characters'
id = Column(String(50), primary_key=True)
name = Column(String(100), nullable=False)
age = Column(String(50))
residence = Column(String(200))
occupation = Column(String(100))
cases_involved = Column(JSON)
appearances = relationship("Appearance", back_populates="character")
class Case(Base):
"""案件模型"""
__tablename__ = 'cases'
id = Column(String(50), primary_key=True)
time = Column(String(100))
location = Column(String(200))
reporter = Column(String(100))
detective = Column(String(100))
evidence = Column(JSON)
status = Column(String(50))
🎯 实际应用案例
案例:红发会奇案分析
1. 原始输入
威尔逊先生今天来到贝克街221B,他说自己在红发会工作,每周能获得4英镑的报酬,
只需要在办公室抄写大英百科全书...
2. AI 分析结果
{
"characters": [
{
"id": "char_wilson",
"name": "Jabez Wilson",
"occupation": "当铺老板",
"cases_involved": ["case_red_headed_league"]
},
{
"id": "char_clay",
"name": "John Clay",
"occupation": "助手(伪装身份)",
"cases_involved": ["case_red_headed_league"]
}
],
"cases": [
{
"id": "case_red_headed_league",
"time": "1890年秋",
"location": "伦敦市区",
"status": "已破获"
}
]
}
3. 生成的关系图谱
💡 技术亮点
-
LangChain 创新应用
- 自定义 LLM 实现
- 结构化输出控制
- 链式处理流程
-
智能分析能力
- 多维度信息提取
- 关系网络构建
- 时间线梳理
-
系统可靠性
- 多重错误处理
- 智能重试机制
- 数据一致性保证
🚀 未来优化方向
-
向量化存储
- 使用 LangChain 的向量存储接口
- 实现相似案件检索
- 构建案件知识库
-
对话能力增强
- 添加记忆组件
- 实现多轮推理
- 支持追问和澄清
-
可视化升级
- 交互式时间线
- 动态关系图谱
- 证据链可视化
结语
通过将福尔摩斯的演绎法与 LangChain 框架相结合,我们不仅创造了一个智能的案件分析工具,更展示了 AI 技术在专业领域应用的无限可能。这个项目证明,当经典遇上现代,当人类智慧遇上人工智能,我们能够创造出更加强大的分析工具。
技术栈:
- 🌐 Flask + SQLAlchemy
- 🤖 LangChain + DashScope
- 📊 MySQL
- 🎨 HTML5 + CSS3 + JavaScript
参考资源:
标签: #AI
#LangChain
#福尔摩斯
#案件分析
#数据可视化
#通义千问
欢迎在评论区分享您的想法和建议!如果您对某个技术点特别感兴趣,也可以留言讨论。