Drive 文档分析与智能搜索
Google Drive 里堆了几千个文档?Claude 能帮你从混乱的知识库中快速找到答案——前提是建立正确的索引和提取流程。
Drive 知识库架构
graph TD
DRIVE[Google Drive] --> EXTRACT[文档提取]
EXTRACT --> PROCESS[内容处理]
PROCESS --> CLAUDE[Claude 分析]
CLAUDE --> OUTPUT[知识输出]
EXTRACT --> E1[Docs 文本导出]
EXTRACT --> E2[PDF 文本提取]
EXTRACT --> E3[Sheets 数据导出]
PROCESS --> P1[分块处理]
PROCESS --> P2[元数据标注]
PROCESS --> P3[时间戳记录]
CLAUDE --> C1[摘要生成]
CLAUDE --> C2[跨文档问答]
CLAUDE --> C3[知识图谱]
OUTPUT --> O1[Claude Projects 知识库]
OUTPUT --> O2[搜索索引]
style CLAUDE fill:#c8e6c9,stroke:#388e3c,stroke-width:2px
style PROCESS fill:#e3f2fd,stroke:#1565c0,stroke-width:2px
Drive 文档分析工具
"""
Google Drive 文档分析与知识库构建
(实际使用需要 Google Drive API 授权)
"""
from dataclasses import dataclass, field
from pathlib import Path
import json
@dataclass
class DriveDocument:
"""Google Drive 文档"""
file_id: str
name: str
mime_type: str
content: str
last_modified: str
owner: str
folder_path: str
size_bytes: int
tags: list[str] = field(default_factory=list)
summary: str = ""
@dataclass
class KnowledgeChunk:
"""知识库分块"""
doc_id: str
doc_name: str
chunk_index: int
content: str
token_estimate: int
class DriveKnowledgeBuilder:
"""Drive 知识库构建器"""
MAX_CHUNK_TOKENS = 2000 # 每块最大 token 数(估算:1 token ≈ 4 字符)
MAX_CONTEXT_FOR_CLAUDE = 180000 # Claude 200K 上下文留余量
@classmethod
def chunk_document(cls, doc: DriveDocument) -> list[KnowledgeChunk]:
"""将文档分块,保持段落完整性"""
paragraphs = [p.strip() for p in doc.content.split('\n\n') if p.strip()]
chunks: list[KnowledgeChunk] = []
current_chunk = []
current_tokens = 0
chunk_idx = 0
for para in paragraphs:
para_tokens = len(para) // 4
if current_tokens + para_tokens > cls.MAX_CHUNK_TOKENS and current_chunk:
chunks.append(KnowledgeChunk(
doc_id=doc.file_id,
doc_name=doc.name,
chunk_index=chunk_idx,
content='\n\n'.join(current_chunk),
token_estimate=current_tokens,
))
current_chunk = [para]
current_tokens = para_tokens
chunk_idx += 1
else:
current_chunk.append(para)
current_tokens += para_tokens
if current_chunk:
chunks.append(KnowledgeChunk(
doc_id=doc.file_id,
doc_name=doc.name,
chunk_index=chunk_idx,
content='\n\n'.join(current_chunk),
token_estimate=current_tokens,
))
return chunks
@classmethod
def build_claude_project_docs(
cls,
documents: list[DriveDocument],
max_total_tokens: int = 50000,
) -> dict:
"""
选择最重要的文档内容,构建 Claude Project 知识库
返回可以上传到 Claude Project 的内容
"""
# 按修改时间排序(最近的优先)
sorted_docs = sorted(documents, key=lambda d: d.last_modified, reverse=True)
selected_content = []
total_tokens = 0
included_docs = []
skipped_docs = []
for doc in sorted_docs:
chunks = cls.chunk_document(doc)
doc_tokens = sum(c.token_estimate for c in chunks)
if total_tokens + doc_tokens <= max_total_tokens:
selected_content.extend(chunks)
total_tokens += doc_tokens
included_docs.append(doc.name)
else:
skipped_docs.append(f"{doc.name} ({doc_tokens} tokens,超出预算)")
return {
"total_chunks": len(selected_content),
"total_tokens_estimate": total_tokens,
"included_documents": included_docs,
"skipped_documents": skipped_docs,
"content": selected_content,
}
@staticmethod
def generate_drive_index(documents: list[DriveDocument]) -> str:
"""生成 Drive 文档索引(上传到 Claude Project 作为导航)"""
lines = [
"# Google Drive 知识库索引",
f"共 {len(documents)} 个文档\n",
"## 文档列表\n",
]
by_folder: dict[str, list[DriveDocument]] = {}
for doc in documents:
folder = doc.folder_path or "根目录"
by_folder.setdefault(folder, []).append(doc)
for folder, docs in sorted(by_folder.items()):
lines.append(f"### {folder}")
for doc in sorted(docs, key=lambda d: d.name):
lines.append(f"- **{doc.name}** (修改于 {doc.last_modified})")
if doc.summary:
lines.append(f" 摘要: {doc.summary}")
lines.append("")
return "\n".join(lines)
class DriveSearchStrategy:
"""Drive 智能搜索策略"""
SEARCH_PROMPTS = {
"跨文档问答": """
基于以下文档内容回答问题:
问题:$question
相关文档:
$documents
要求:
1. 直接回答问题(不要说"根据文档...")
2. 引用来源:回答后注明出处(文档名 + 大致位置)
3. 如果文档中没有答案,明确说明而非猜测
4. 如果不同文档有矛盾,指出矛盾并说明""",
"文档摘要批处理": """
为以下文档生成 50 字以内的摘要(用于构建知识索引):
文档名:$doc_name
文档内容(前500字):
$content
摘要要求:
- 一句话说明文档是什么
- 包含关键时间节点(如有)
- 列出 2-3 个核心主题词""",
"知识差距分析": """
分析以下知识库,找出重要但缺失的内容领域:
现有文档列表:
$doc_list
业务上下文:$business_context
请识别:
1. 已有充分覆盖的领域
2. 覆盖不足的领域(重要但文档少)
3. 建议优先补充的 3 个文档类型""",
}
@classmethod
def get_prompt(cls, strategy: str, **kwargs) -> str:
template = cls.SEARCH_PROMPTS.get(strategy, "")
for key, value in kwargs.items():
template = template.replace(f"${key}", str(value))
return template
# 演示
sample_docs = [
DriveDocument(
"abc123", "Q1 产品路线图 2026.docx",
"application/vnd.openxmlformats-officedocument.wordprocessingml.document",
"## Q1 重点目标\n\n本季度核心目标是完成支付系统重构...\n\n## 功能优先级\n\nP0: 支付稳定性提升\nP1: 用户认证升级\nP2: 报表优化",
"2026-03-15", "pm@company.com", "产品/路线图",
45000, ["产品", "路线图", "Q1"],
"Q1 产品路线图,聚焦支付重构和认证升级"
),
DriveDocument(
"def456", "技术架构决策记录 2025.docx",
"application/vnd.openxmlformats-officedocument.wordprocessingml.document",
"## ADR-001: 微服务拆分策略\n\n背景:单体应用已难以维护...\n\n## ADR-002: 数据库选型\n\n决定使用 PostgreSQL + Redis 组合...",
"2025-12-01", "cto@company.com", "技术/架构",
78000, ["架构", "ADR", "技术决策"],
"技术架构决策记录,包含微服务和数据库选型决策"
),
]
builder = DriveKnowledgeBuilder()
result = builder.build_claude_project_docs(sample_docs, max_total_tokens=30000)
print("=== Drive 知识库构建结果 ===")
print(f" 总块数: {result['total_chunks']}")
print(f" 估算 Tokens: {result['total_tokens_estimate']:,}")
print(f" 已纳入文档: {result['included_documents']}")
print("\n=== Drive 文档索引 ===")
print(builder.generate_drive_index(sample_docs))
print("\n=== 跨文档问答提示词示例 ===")
prompt = DriveSearchStrategy.get_prompt(
"跨文档问答",
question="Q1 最高优先级的功能是什么?为什么这样决策?",
documents="[文档内容]",
)
print(prompt[:300] + "...")
Drive 文档管理最佳实践
| 实践 | 说明 | 工具 |
|---|---|---|
| 统一命名规范 | YYYY-MM 文档类型 主题.扩展名 | Google Drive 命名约定 |
| 文件夹结构清晰 | 按部门/年度/项目三层分类 | Drive 文件夹 |
| 定期摘要上传 | 核心文档摘要放入 Claude Project | Claude Projects |
| 版本管理 | 使用 Drive 原生版本历史 | Drive 版本功能 |
| 共享权限审计 | 季度检查"共享给所有人"的文件 | Drive 权限管理 |
行动清单
- [ ] 整理 Google Drive 文件夹结构:建立"部门/年度/项目"三层分类体系
- [ ] 挑选 5–10 个最常被团队引用的核心文档,摘要后上传到 Claude Project Knowledge Base
- [ ] 为每个核心文档生成 50 字摘要(用上方提示词),构建可快速导航的知识索引
- [ ] 建立"过时文档"处理流程:Drive 中超过 1 年未修改的文件定期归档或删除
- [ ] 用 Claude 跨文档问答替代"全公司搜索邮件":把相关文档内容粘贴给 Claude,直接得到答案
- [ ] 季度检查 Drive 分享设置:确保无敏感文档被设置为"知道链接的人均可访问"
下一章:06-Telegram与WhatsApp机器人/01-Telegram-Bot与Claude-API — 把 Claude 变成随时待命的手机 AI 助理。