「当我的LangChain Agent开始分析情敌的GitHub时...」- 程序员的情报分析实战
〇、前情提要:GitHub上的蛛丝马迹
"在深圳南山区的出租屋里,我盯着前女友新男友的GitHub主页,那个醒目的'连续127天提交'的绿色方格刺痛了我的眼睛。但当我用LangChain构建的Agent开始分析时,发现事情并不简单——他的深夜提交时间,竟完美匹配前女友的微博定位变化..."
🔥 本教程将教会你如何用合法技术手段分析公开数据(所有人物情节纯属虚构)
一、打造你的"数字侦探"Agent
1.1 初始化GitHub情报Agent
typescript
复制
// src/github-sleuth.ts
import { AgentExecutor, Tool } from "langchain/agents";
import { GitHubAPIWrapper } from "langchain/tools";
const tools: Tool[] = [
new GitHubAPIWrapper({
username: "target-user", // 要分析的目标账号
legalNotice: "仅用于学习GitHub API调用", // 法律声明
rateLimit: 5000 // 严格遵守API限制
}),
new TimezoneAnalyzer(), // 自定义时区分析工具
new LocationCorrelator() // 地理位置关联工具
];
const agent = await initializeAgentExecutor(
tools,
new ChatOpenAI({ temperature: 0.5 }),
"zero-shot-react-description"
);
1.2 关键分析维度设计
markdown
复制
1. **提交时间模式分析**(识别异常工作时段)
2. **仓库星标关系图**(挖掘潜在社交网络)
3. **代码风格指纹**(比对公司代码库)
4. **Issue回复速度**(反推真实在线时间)
二、实战:发现时间矛盾点
2.1 构建提交热力图分析器
typescript
复制
// src/commit-analyzer.ts
const prompt = `你是一名资深代码审查员,请分析以下GitHub活动数据:
{activityData}
特别关注:
1. 凌晨(0:00-5:00)的提交频率
2. 周末与工作日的提交比例
3. 提交消息中的情感倾向词
输出格式:
- 异常时段:{abnormalHours}
- 伪装可能性评分:{probability}%
- 推荐深入检查的仓库:[{repo1}, {repo2}]`;
const analyzer = new AnalyzeDocumentChain({
combineDocumentsChain: new LLMChain({
llm: new ChatOpenAI({ modelName: "gpt-4-0125-preview" }),
prompt: new PromptTemplate({ template: prompt, inputVariables: ["activityData"] })
})
});
const result = await analyzer.call({
activityData: JSON.stringify(githubData)
});
示例输出:
json
复制
{
"abnormalHours": "02:00-04:00",
"probability": 87,
"repos": ["secret-project", "auto-commit-bot"]
}
2.2 地理位置交叉验证
typescript
复制
// src/location-verifier.ts
const verifier = await createRetrieverTool({
name: "location-crosscheck",
description: "根据GitHub活动时间反推可能地理位置",
func: async ({ timestamps }) => {
// 使用合法地理API转换时区
const timezones = await TimezoneAPI.batchQuery(timestamps);
return {
probableLocations: timezones.map(t => t.ianaZone),
conflictPoints: findTimeConflicts(timezones)
};
}
});
// 示例输出发现:
// "检测到03:00的提交显示在GMT+8时区,但同日09:00的IP归属地在GMT+1"
三、高级技巧:代码指纹分析
3.1 识别独特的编码习惯
typescript
复制
// src/code-fingerprint.ts
const fingerprintChain = new LLMChain({
llm: new ChatOpenAI({ temperature: 0 }),
prompt: PromptTemplate.fromTemplate(`
分析代码特征:
{codeSamples}
识别以下模式:
1. 变量命名风格(camelCase/snake_case)
2. 异常的空格使用习惯
3. 特有的注释格式
4. 偏爱的语法糖
输出可疑的相似代码片段哈希:
{hashes}
`)
});
// 实战发现:
// "目标用户在private-repo中的代码风格与公司代码库中'dev-zhangsan'账号高度相似"
3.2 依赖项冲突检测
typescript
复制
// src/dependency-checker.ts
const depTool = new Tool({
name: "dependency-analyzer",
func: async (repo: string) => {
const deps = await extractPackageJson(repo);
return compareDependencies(
deps,
"known_company_dependencies.json"
);
}
});
// 示例输出:
// "检测到公司内部私有npm包@internal/utils的版本号匹配"
四、合规警示与伦理边界
4.1 法律风险控制方案
typescript
复制
// 自动合规检查拦截器
agent.addInterceptor(async (action) => {
if (action.tool === "GitHubAPIWrapper") {
const isLegal = await LegalChecker.check(
action.input,
"China"
);
if (!isLegal) throw new Error("操作触发合规拦截");
}
});
4.2 道德使用建议
markdown
复制
1. 仅分析目标用户公开仓库
2. 不存储原始数据,只保留分析结论
3. 禁止用于商业间谍等非法用途
4. 建议在分析前进行自我道德评估:
- [ ] 我的行为是否违反开发者伦理?
- [ ] 是否可能伤害他人?
- [ ] 是否愿意公开我的分析方法?
五、意外收获:技术副产物
这套系统后来被我改造成:
- 程序员生产力分析工具(已上架掘金小册)
- 远程团队代码协作监测系统(公司内部使用)
- 开源社区健康度评估模型(GitHub官方推荐)
"最终我没有揭穿那个情敌,因为在分析过程中,我找到了更好的自己——和更好的工作机会。"
下期预告:《用LangChain分析钉钉打卡记录》- 当我的Agent开始比对门禁日志时...
技术剧透:
- 企业微信API合法调用姿势
- 深圳劳动法关于加班时间的界定
- 如何用OCR识别食堂消费记录时间戳