1.1 前言
网络上到处是cursor的使用技巧,cursor确实是很好的AI工具,能很大的提高效率,但其他工具也有可取之处。我最近一直在使用cline,从它官网的博客中学到了很多使用AI的技巧,我发现很多技巧都是通用的,用此文章总结并分享。
1.2 cline是什么和模型选择
cline是一个vscode AI编码插件。
主要特点:
- 计划模式和行动模式
 - 可以使用不同模型,清晰看到上下文和计费
 - mcp支持,有mcp市场
 
目前两种模式的最佳模型: deepseek-r1用于计划,claude3.5/3.7用于行动
更好性价比:使用deepseek-v3替换claude,将claude作为可靠后备
v3的问题在于上下文只有64K,在长文件下连续问几个问题就会超出,经常需要另开会话
当上下文进度条接近70-80%时:创建markdown文件记录目前为止的关键决策和进度,然后重新开始
claude上下文有200k,而且支持操作计算机、图像解析,目前确实是编码最佳模型,但奈何太贵了
(cursor 20美元一个月,这时候反而很有性价比,因为能一直用claude,它调教的也好用)
1.3 计划模式和行为模式
1.3.1 基本流程
- 在研究时从开放性问题开始:我想这样做可行吗?有哪些方式来实现它?各种方式的优缺点?
 - 完成初步研究后,就告诉模型具体该怎么做,我充当设计者,模型是实现者
 - 模型实现完成后,必须测试代码是否真的有效
 
1.3.2 关于上下文
在编码之前花时间计划和提供背景时,AI的输出会变得更加精确
把AI输出想象成枪里的子弹,你提供的背景越多,枪管就越长------枪管越长意味着准确性越高
限制上下文就像缩短枪管以节省金属一样------你为了节省而牺牲了准确性
另外,只补充必要的上下文,而不是让AI在全局查找,这样也能提高准确性
1.3.3 以计划模式启动,再切换到行动模式
计划模式:收集背景,读取相关文件,分解需求并制定计划
行动模式:根据计划的上下文简化实施,按照既定计划执行
技巧:
- 在计划模式探索边缘情况、遇到意外的复杂性时切换回计划模式;
 - 计划不是一次性的事情,复杂的项目通常需要多个计划,让AI编写此次计划的markdown文件,作为将来可以参考的上下文;
 
虽然计划让人感觉很慢,感觉什么都没做。但事实是:
1. 产出的质量会增加数倍!
2. 从长远来看可以节省时间,因为会生成更易于维护的代码,尽早发现边缘情况
1.4 自定义指令
自定义指令可以理解成是每次和AI对话时,它都会读取的一段信息。
我会把和AI沟通中经常出现的错误行为或不理想的回答写在自定义指令中规避。
以下是自定义指令示例参考:
            
            
              txt
              
              
            
          
          以下内容是最高优化级,没有任何质疑:
1. 说中文
2. 当前是windows系统
3. 忽略TypeScript错误:any
4. 使用函数式编程而不是class
        1.5 MCP是什么,以及怎么在cline安装
MCP全称Model Context Protocol模型上下文协议,它提供了一种连接人工智能系统和不同数据源的方法,白话讲就是让AI能连接到各种不同的软件或系统,直接进行操作。
如果你没有使用cline安装过mcp,建议任意选择一个mcp安装体验一下,它是通过提示词方式引导安装,我第一次通过提示安装mcp还是感觉挺震撼的,当然后续安装就不需要这样麻烦了,手动更快。
mcp服务器一般都是python或node写的,安装方式有所不同,我下面讲的是手动安装方法:
python编写的mcp:
- pip install uv -i 
https://mirrors.aliyun.com/pypi/simple/ - pip install [mcp名称]
 - 配置cline_mcp_settings.json,举例:
 
            
            
              css
              
              
            
          
          {
    "mcpServers": {
        "github.com/modelcontextprotocol/servers/tree/main/src/git": {
            "command": "python",
            "args": ["-m", "mcp_server_git"],
            "env": {},
            "disabled": false,
            "autoApprove": []
        }
    }
}
        node编写的mcp:
- 先把mcp仓库clone到本地,建议在一个统一目录管理
 - 按照要求安装依赖并执行构建
 - 配置cline_mcp_settings.json指向构建后的文件,举例:
 
            
            
              json
              
              
            
          
          "github.com/tavily-ai/tavily-mcp": {
  "command": "node",
  "args": [
    "d:/SysFolder/Desktop/cline/tavily-mcp/build/index.js"
  ],
  "env": {
    "TAVILY_API_KEY": "123123"
  },
  "disabled": false,
  "autoApprove": []
},
        注意:目前在windows系统还不能用npx方式调用mcp服务器,得用node,相关issues回答
1.5.1 创建一个自己的mcp服务器
每个人都可以根据需要自己创建mcp,这不是一个很困难的事情,因为可以用AI创建mcp
以我的文生图mcp举例:
实现思路,相当简单(利用开源免费的图像生成API):
输入一段描述,并将描述插入到以下链接的{prompt}部分:

最后输出你的画面描述以及链接就结束了。
具体代码:
            
            
              ts
              
              
            
          
          #!/usr/bin/env node
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
import { CallToolRequestSchema, ErrorCode, ListToolsRequestSchema, McpError } from '@modelcontextprotocol/sdk/types.js';
// 配置常量
const DEFAULT_WIDTH = 1024;
const DEFAULT_HEIGHT = 1024;
const IMAGE_API_BASE_URL = 'https://image.pollinations.ai/prompt';
// 图片生成参数类型
interface ImageGenerationArgs {
    prompt_zh: string;
    width?: number;
    height?: number;
}
// 验证图片生成参数
const isValidImageGenerationArgs = (args: unknown): args is ImageGenerationArgs => {
    if (!args || typeof args !== 'object') return false;
    
    const { prompt_zh, width, height } = args as ImageGenerationArgs;
    
    if (!prompt_zh || typeof prompt_zh !== 'string') return false;
    if (width && (typeof width !== 'number' || width < 1)) return false;
    if (height && (typeof height !== 'number' || height < 1)) return false;
    
    return true;
};
/**
 * 创建并配置MCP服务器
 * @returns 配置好的Server实例
 */
const createServer = () => {
    // 初始化服务器
    const server = new Server(
        {
            name: 'image-generation-mcp',
            version: '0.1.0',
        },
        {
            capabilities: {
                tools: {}, // 工具配置将在下面注册
            },
        }
    );
    // 注册可用工具列表
    server.setRequestHandler(ListToolsRequestSchema, async () => ({
        tools: [
            {
                name: 'generate_image',
                description: '将中文描述转换为详细画面并生成图片链接',
                inputSchema: {
                    type: 'object',
                    properties: {
                        prompt_zh: {
                            type: 'string',
                            description: '中文场景描述',
                        },
                        width: {
                            type: 'number',
                            description: `图片宽度(可选,默认${DEFAULT_WIDTH})`,
                            minimum: 1,
                        },
                        height: {
                            type: 'number',
                            description: `图片高度(可选,默认${DEFAULT_HEIGHT})`,
                            minimum: 1,
                        },
                    },
                    required: ['prompt_zh'],
                },
            },
        ],
    }));
    // 处理工具调用请求
    server.setRequestHandler(CallToolRequestSchema, async (request) => {
        if (request.params.name !== 'generate_image') {
            throw new McpError(ErrorCode.MethodNotFound, `未知工具: ${request.params.name}`);
        }
        // 验证参数格式
        if (!isValidImageGenerationArgs(request.params.arguments)) {
            throw new McpError(ErrorCode.InvalidParams, '请求参数格式错误,请检查输入参数');
        }
        // 解构参数并设置默认值
        const { prompt_zh, width = DEFAULT_WIDTH, height = DEFAULT_HEIGHT } = request.params.arguments;
        // 构建图片URL
        const queryParams = new URLSearchParams({
            width: width.toString(),
            height: height.toString(),
            enhance: 'true',
            private: 'true',
            nologo: 'true',
            safe: 'true',
            model: 'flux',
        });
        const imageUrl = `${IMAGE_API_BASE_URL}/${encodeURIComponent(prompt_zh)}?${queryParams}`;
        return {
            content: [
                {
                    type: 'text',
                    text: JSON.stringify(
                        {
                            description: prompt_zh,
                            imageUrl: imageUrl,
                        },
                        null,
                        4
                    ),
                },
            ],
        };
    });
    return server;
};
async function main() {
    const server = createServer();
    const transport = new StdioServerTransport();
    await server.connect(transport);
}
// 启动服务
main().catch((error) => {
    console.error('main error: ', error);
    process.exit(1);
});
        1.6 最后如果文章帮到你了,可以给我点个赞
另外,cline还有一个Cline Memory Bank的高级用法,有兴趣可以了解下,思路是通用的。
如果你有使用AI或cline更好的技巧,欢迎一起交流学习!
参考文章:
2025-03-29:发布文章