☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜
应从grok本地日志中提取user_input字段,清洗去重后用sentence-transformers和hdbscan聚类,筛选成员数≥5的top10簇,每簇取最短且含核心词的代表问题。
你需要从grok模型本地运行产生的日志中,快速识别出用户反复提交的相似问题,用这些真实提问来反向优化提示词工程——不是靠猜测,而是让日志自己说话。
准备日志文件并确认格式规范
确保你手头的日志是Grok本地服务输出的原始文本日志,每条记录以ISO时间戳开头(如2024-06-12T08:32:15.789Z),后跟JSON结构体,且包含"user_input"字段。如果日志是二进制、压缩包或混杂了stderr堆栈(非user_input行),需先解压并用grep -v "ERROR\|WARNING\|traceback"过滤掉干扰行。
用head -n 5查看前五行,确认每行都能被jq正常解析:head -n 5 grok.log | jq -r '.user_input' 2>/dev/null | head -n 1。如果报错或返回空,说明日志格式不统一,【必须先用sed或python脚本清洗成单行JSON】,否则后续所有提取都会漏样本。
提取全部user_input字段并去重归一化
方法一:用jq批量抽取+sed轻量清洗
执行jq -r '.user_input | select(type == "string")' grok.log | sed 's/^[[:space:]]*//; s/[[:space:]]*$//; s/[\r\n\t]//g' | grep -v '^$' > raw_inputs.txt。这一步会去掉首尾空格、换行符、制表符,并剔除空行——Grok日志里常有空字符串输入,不剔除会导致后续聚类出现大量“空问题”噪声。
方法二:用Python做语义级归一化(推荐用于中文场景)
新建normalize.py,写入以下代码:
import re, sys
for line in sys.stdin:
line = line.strip()
if not line: continue
line = re.sub(r'[^\w\u4e00-\u9fff\s\.\!\?\,\;\:\'\"]', '', line)
line = re.sub(r'\s+', ' ', line).strip()
if len(line) print(line)
然后运行cat raw_inputs.txt | python normalize.py > normalized_inputs.txt。这步会清除不可见控制字符、合并多余空格,并过滤掉少于4个字符的无效输入(如“好”“??”“ok”),【避免把语气词和碎片输入误判为高频问题】。
按语义相似度聚类并筛选Top10高频簇
第一步:安装sentence-transformers与hdbscan(仅需一次)
pip install sentence-transformers hdbscan numpy
第二步:运行聚类脚本cluster_questions.py
脚本核心逻辑:加载normalized_inputs.txt → 用all-MiniLM-L6-v2模型生成句向量 → HDBSCAN聚类(min_cluster_size=3, min_samples=2)→ 输出每个簇的中心句与成员数。注意:不要用KMeans,它强制划分且需预设K值;HDBSCAN能自动识别离群点和自然簇数量。
第三步:提取结果中成员数≥5的簇,按数量降序取前10组,每组只保留最短且最具代表性的原始输入(即该簇内字符数最少、同时包含核心关键词的那条)。
执行python cluster_questions.py --input normalized_inputs.txt --output top10_clusters.json。输出文件top10_clusters.json每项形如{"representative": "怎么让Grok解释数学公式步骤", "count": 17, "examples": ["如何分步解释公式", "能不能一步步推导这个式子", "请详细拆解计算过程"]}











