- 🔀 变体生成:使用大模型生成 10-20 个语义相似但表述不同的问句
- 🔍 并行搜索:同时调用多个大模型(千问、豆包等)进行网页搜索
- 📊 引用收集:自动提取并存储每次搜索的引用源
- 📈 行为分析:统计每个模型对各域名的引用概率,发现引用偏好
- 🪵 日志系统:支持可配置的日志级别,方便调试和监控
- 🌐 Web 界面:基于 Gradio 的可视化操作界面
pip install openai python-dotenvpip install -r requirements.txt这会安装所有依赖:openai, python-dotenv, gradio, matplotlib, pandas
复制 .env.example 为 .env,填入你的 API 密钥:
cp .env.example .env编辑 .env:
# API 配置
DOUBAO_API_KEY=xxx
DOUBAO_BASE_URL=https://ark.cn-beijing.volces.com/api/v3
DOUBAO_MODEL_ID=doubao-seed-1-6-250615
QIANWEN_API_KEY=xxx
QIANWEN_BASE_URL=https://dashscope.aliyuncs.com/api/v2/apps/protocols/compatible-mode/v1
QIANWEN_MODEL_ID=qwen3-max
# 存储配置(可选)
SQLITE_DB_PATH=./geoinsight/db/citations.db
# 日志级别(可选):DEBUG, INFO, WARNING, ERROR
LOG_LEVEL=INFOpython analysis/run_analysis.py "帮我找几家东莞实木家具厂商" --variants 15 --models qianwen,doubao启用调试模式(输出详细日志):
python analysis/run_analysis.py "问题" --debug# 启动 Web 界面
bash webapp/run.sh
# 或
python webapp/app.py然后在浏览器访问 http://localhost:7860
运行完成后会自动输出分析报告:
📊 模型引用统计:
qianwen:
总引用数:45
独立域名:18
查询次数:15
🌐 热门引用域名 (跨模型):
s.1688.com: 12 次
zhuanlan.zhihu.com: 8 次
🎯 引用概率分布 (按模型):
【qianwen】 (共 45 个引用)
26.67% s.1688.com █████ (12)
17.78% zhuanlan.zhihu.com ███ (8)
python analysis/run_analysis.py "原始问题" \
--variants 15 \ # 生成变体数量 (10-20)
--models qianwen,doubao \ # 使用的搜索模型
--variant-model qianwen \ # 用于生成变体的模型
--system-prompt "你是专业助理" # 系统提示词
--debug # 启用调试模式(详细日志)- 📝 输入问句:支持多行输入
- 🔢 变体数量:滑块调节 5-20 个
- ✅ 模型选择:多选框选择要对比的模型
- 📊 可视化图表:
- 模型引用统计柱状图
- 热门域名分布条形图
- 📋 变体列表:表格展示生成的问句变体
- 📄 详细报告:完整的文字分析报告
- 💡 示例问句:一键填充示例
使用 SQLite 存储分析数据,路径可通过 .env 中的 SQLITE_DB_PATH 配置。
runs: 分析运行记录variants: 问句变体results: 模型调用结果citations: 引用源记录
from geoinsight.core.analyzer import Analyzer
analyzer = Analyzer(run_id)
analyzer.print_report()
# 获取域名统计
stats = analyzer.get_domain_stats()
# 获取引用概率
probs = analyzer.get_citation_probability()支持通过 .env 配置日志级别:
LOG_LEVEL=DEBUG # 输出详细日志,包括 API 调用、数据库操作
LOG_LEVEL=INFO # 输出关键步骤(默认)
LOG_LEVEL=WARNING # 只输出警告和错误或在命令行启用调试模式:
python analysis/run_analysis.py "问题" --debug# 运行所有测试
python tests/run_tests.py
# 运行单个测试
python -m unittest tests.test_variant_generator
# 运行单个测试用例
python -m unittest tests.test_analyzer.TestAnalyzer.test_full_pipeline_small注意: 测试会真实调用 API,消耗配额。
- 在
geoinsight/models/创建新模型类:
from .chat_base import ChatBase
class ChatKimi(ChatBase):
def __init__(self):
super().__init__(
api_key_key='KIMI_API_KEY',
base_url_key='KIMI_BASE_URL',
model_id_key='KIMI_MODEL_ID'
)- 在
.env中添加配置:
KIMI_API_KEY=xxx
KIMI_BASE_URL=https://api.moonshot.cn/v1
KIMI_MODEL_ID=moonshot-v1-8k- 在
analysis/run_analysis.py和webapp/app.py的model_map中注册:
model_map = {
'qianwen': ChatQianwen,
'doubao': ChatDoubao,
'kimi': ChatKimi, # 新增
}- 在
webapp/app.py的AVAILABLE_MODELS中添加显示名称:
AVAILABLE_MODELS = {
'千问 (Qwen)': 'qianwen',
'豆包 (Doubao)': 'doubao',
'Kimi': 'kimi', # 新增
}| 变量名 | 说明 | 默认值 |
|---|---|---|
DOUBAO_API_KEY |
豆包 API 密钥 | 必填 |
DOUBAO_BASE_URL |
豆包 API 地址 | 必填 |
DOUBAO_MODEL_ID |
豆包模型 ID | 必填 |
QIANWEN_API_KEY |
千问 API 密钥 | 必填 |
QIANWEN_BASE_URL |
千问 API 地址 | 必填 |
QIANWEN_MODEL_ID |
千问模型 ID | 必填 |
SQLITE_DB_PATH |
数据库文件路径 | ./geoinsight/db/citations.db |
LOG_LEVEL |
日志级别 | INFO |
GeoInsight/
├── analysis/
│ └── run_analysis.py # 命令行分析入口
├── webapp/
│ ├── app.py # Web 界面主程序
│ └── run.sh # 启动脚本
├── geoinsight/
│ ├── db/
│ │ ├── schema.sql
│ │ └── database.py
│ ├── models/
│ │ ├── chat_base.py
│ │ ├── chat_qianwen.py
│ │ └── chat_doubao.py
│ ├── core/
│ │ ├── variant_generator.py
│ │ ├── search_runner.py
│ │ ├── citation_collector.py
│ │ └── analyzer.py
│ ├── utils.py
│ └── __init__.py
├── tests/
├── requirements.txt # 项目依赖
├── .env
├── .env.example
├── README.md
├── CONTRIBUTING.md
└── CHANGELOG.md
- API 配额:测试和运行会消耗 API 配额,注意控制变体数量
- 并发限制:某些模型有并发限制,
max_workers不宜过大 - 数据清理:定期清理数据库避免过大
- 日志文件:调试完成后建议将
LOG_LEVEL改回INFO - Web 界面:默认监听 0.0.0.0:7860,生产环境注意防火墙设置
Apache-2.0 license
