cycle-agent:一段用于信息搜集与研究的sh脚本

0 阅读3分钟

简介与详细介绍

我们平时在想要收集某个领域具体信息或者问大模型某个具体的问题时,通常会在浏览器端直接将问题发送给大模型,但通常此时大模型的输出只是一个大纲,信息不够全面,这时候还需要复制某一个需要了解的信息,粘贴到输入框中,告诉它详细介绍一下这一点,这样才能逐渐的了解这个事物所有的信息。在这样做了一段时间以后,再想要获取其他大纲中的某段信息的时候,上下文就已经被污染了,可能此时就需要重开一个对话了。

为了解决这个问题,受残差链接与大模型架构的启发,本人基于claude命令行写了一段循环优化的脚本:

#!/bin/bash

set -euo pipefail

# ============ config ============
MAX_ITERATIONS=5
INITIAL_DESCRIPTION="${1:-}"

if [ -z "$INITIAL_DESCRIPTION" ]; then
    echo "prompt should not be empty"
    exit 1
fi

if [ -n "${2:-}" ]; then
    MAX_ITERATIONS="$2"
fi

echo "━━━ 迭代精炼 ━━━"
echo "  描述: $INITIAL_DESCRIPTION"
echo "  轮次: $MAX_ITERATIONS 轮"
echo ""

# ============ 统一循环 ============
for i in $(seq 1 "$MAX_ITERATIONS"); do

    echo "━━━ 第 ${i}/${MAX_ITERATIONS} 轮 ━━━"

    # 构造提示词
    if [ "$i" -eq 1 ]; then
        PROMPT="用户初始描述:${INITIAL_DESCRIPTION}
请根据上述描述生成完整的章节内容。为了章节更完美,可以适当的删减、增加和修改。
直接输出最终内容,并将内容保存到 result.md 文件中。"
    else
        PROMPT="用户初始描述:${INITIAL_DESCRIPTION}
请读取 result.md 中的内容,在此基础上进一步细化和完善,输出更详细、更结构化的版本。可以适当的删减、增加和修改,使章节更完美。
直接输出最终内容,并将内容保存到 result.md 文件中。"
    fi

    # 执行 Claude
    START_TS=$(date +%s)
    echo "$PROMPT" | claude -p --output-format text --effort high --dangerously-skip-permissions || {
        echo "❌ 第 $i 轮失败,退出" >&2
        exit 1
    }
    END_TS=$(date +%s)
    DURATION=$((END_TS - START_TS))

    echo "✔ 完成(${DURATION}s)"
    echo ""

done

echo "━━━ 迭代结束 ━━━"
echo "结果: ./result.md"

该程序主要是循环对一个md文件进行持续优化,在最初始的时候,拼接上用户的诉求,也就是输入,然后在拼接上设定的prompt,发送给claude命令行,等待一段时间,就会在执行目录的result.md文件下看到第一轮的结果。第一轮输入给claude的提示词如下:

"用户初始描述:${INITIAL_DESCIPTION}
请根据上述描述生成完整的章节内容。为了章节更完美,可以适当的删减、增加和修改。
直接输出最终内容,并将内容保存到 result.md 文件中。"

第二轮是基于第一轮的结果进行优化,结合用户的输入持续优化result.md文件中的内容。第二轮没有在第一轮的上下文中继续运行,而是重开了一个上下文,能保证不被其他文本所影响。第二轮以及之后用户的提示词如下:

"用户初始描述:${INITIAL_DESCRIPTION}
请读取 result.md 中的内容,在此基础上结合用户的输入进一步细化和完善,输出更详细、更结构化的版本。可以适当的删减、增加和修改,使章节更完美。
直接输出最终内容,并将内容保存到 result.md 文件中。"

脚本比较简单,除了用户的输入以外,还可以控制最大迭代次数,默认为5次。文档可以看:github.com/hhk-png/cyc…

最开始,脚本尝试过在脚本中控制所生成的结果文件,获取文件的变化率等信息,但是后来发现claude code本身携带的工具完全可以处理这些东西,只用修改一下提示词就可以达到目的。

直接使claude命令行还可以直接复用claude code的harness工程。

claude命令行虽然可以返回结果,但是如果调用了工具就产生了多轮对话,命令行返回的是最后一轮的返回结果,就导致无法将信息收集完整,所以脚本采取的方案是让claude直接去更新特定的文件。

测试

测试的时候使用的输入是 "目标检测都有哪些损失函数,介绍一下" ,迭代了三次,结果为存放在了github上:github.com/hhk-png/cyc…

从测试结果来看,用该脚本收集一些已有的信息,效果较好,想系统学习某个领域的知识时,用这种方法收集数据应该还不错。

这种方法对于做数学题这些东西是否有效,是否可以提升正确率