分类: 站长笔记

虚拟人生记录,站长思维沉淀

  • 开放AI Node API库:无缝接入OpenAI的利器

    如果你希望在TypeScript或JavaScript中方便地访问OpenAI的REST API,那么这个库为你提供了便捷的解决方案。它是基于我们的OpenAPI规范使用Stainless生成的。

    要学习如何使用OpenAI API,请查看我们的API参考文档文档

    安装

    npm install --save openai
    # 或者
    yarn add openai

    使用

    你可以在api.md文件中找到这个库的完整API。下面的代码演示了如何使用聊天完成API开始工作。

    import OpenAI from 'openai';
    
    const openai = new OpenAI({
      apiKey: '你的API密钥', // 默认为process.env["OPENAI_API_KEY"]
    });
    
    async function main() {
      const completion = await openai.chat.completions.create({
        messages: [{ role: 'user', content: '说这是一个测试' }],
        model: 'gpt-3.5-turbo',
      });
    
      console.log(completion.choices);
    }
    
    main();

    流式响应

    我们支持使用Server Sent Events (SSE) 进行流式响应。

    import OpenAI from 'openai';
    
    const openai = new OpenAI();
    
    async function main() {
      const stream = await openai.chat.completions.create({
        model: 'gpt-4',
        messages: [{ role: 'user', content: 'Say this is a test' }],
        stream: true,
      });
      for await (const part of stream) {
        process.stdout.write(part.choices[0]?.delta?.content || '');
      }
    }
    
    main();

    如果你需要取消流,你可以从循环中break,或者调用stream.controller.abort()

    请求和响应类型

    这个库包含了所有请求参数和响应字段的TypeScript定义。你可以像下面这样导入并使用它们:

    import OpenAI from 'openai';
    
    const openai = new OpenAI({
      apiKey: '你的API密钥', // 默认为process.env["OPENAI_API_KEY"]
    });
    
    async function main() {
      const params: OpenAI.Chat.ChatCompletionCreateParams = {
        messages: [{ role: 'user', content: 'Say this is a test' }],
        model: 'gpt-3.5-turbo',
      };
      const completion: OpenAI.Chat.ChatCompletion = await openai.chat.completions.create(params);
    }
    
    main();

    每个方法、请求参数和响应字段的文档都可在文档字符串中找到,并将在大多数现代编辑器中悬停时显示。

    [!IMPORTANT]
    此SDK的先前版本使用了Configuration类。请参阅v3到v4的迁移指南

    文件上传

    与文件上传对应的请求参数可以以多种不同的形式传递:

    • File(或具有相同结构的对象)
    • fetch Response(或具有相同结构的对象)
    • fs.ReadStream
    • 我们的toFile助手的返回值
    import fs from 'fs';
    import fetch from 'node-fetch';
    import OpenAI, { toFile } from 'openai';
    
    const openai = new OpenAI();
    
    // 如果你有Node `fs`,我们建议使用`fs.createReadStream()`:
    await openai.files.create({ file: fs.createReadStream('input.jsonl'), purpose: 'fine-tune' });
    
    // 或者,如果你有Web `File` API,你可以传递一个`File`实例:
    await openai.files.create({ file: new File(['my bytes'], 'input.jsonl'), purpose: 'fine-tune' });
    
    // 你也可以传递一个`fetch` `Response`:
    await openai.files.create({ file: await fetch('https://somesite/input.jsonl'), purpose: 'fine-tune' });
    
    // 最后,如果上述方法都不方便,你可以使用我们的`toFile`助手:
    await openai.files.create({
      file: await toFile(Buffer.from('my bytes'), 'input.jsonl'),
      purpose: 'fine-tune',
    });
    await openai.files.create({
      file: await toFile(new Uint8Array([0, 1, 2]), 'input.jsonl'),
      purpose: 'fine-tune',
    });

    处理错误

    当库无法连接到API,或者API返回非成功状态码(即4xx或5xx响应)时,将抛出APIError的子类:

    async function main() {
      const fineTune = await openai.fineTunes
        .create({ training_file: 'file-XGinujblHPwGLSztz8cPS8XY' })
        .catch((err) => {
          if (err instanceof OpenAI.APIError) {
            console.log(err.status); // 400
            console.log(err.name); // BadRequestError
    
            console.log
    
    (err.headers); // {server: 'nginx', ...}
          } else {
            throw err;
          }
        });
    }
    
    main();

    错误代码如下:

    状态码 错误类型
    400 BadRequestError
    401 AuthenticationError
    403 PermissionDeniedError
    404 NotFoundError
    422 UnprocessableEntityError
    429 RateLimitError
    大于等于500 InternalServerError
    N/A APIConnectionError

    Azure OpenAI

    关于如何在Azure OpenAI中使用这个库的示例可以在这里找到。

    请注意,在Azure OpenAI API和OpenAI API之间存在API形状和行为的细微差异,因此在Azure OpenAI中使用这个库可能会导致不正确的类型,可能会导致错误。

    请查看@azure/openai,这是Microsoft提供的一个Azure特定的SDK。

    重试

    默认情况下,某些错误将被自动重试2次,使用短暂的指数退避。默认情况下,将重试连接错误(例如,由于网络连接问题),409冲突,429速率限制以及>=500内部错误。

    你可以使用maxRetries选项来配置或禁用这个功能:

    // 配置所有请求的默认值:
    const openai = new OpenAI({
      maxRetries: 0, // 默认为2
    });
    
    // 或者,按请求配置:
    await openai.chat.completions.create({ messages: [{ role: 'user', content: 'How can I get the name of the current day in Node.js?' }], model: 'gpt-3.5-turbo' }, {
      maxRetries: 5,
    });

    超时

    默认情况下,请求会在10分钟后超时。你可以使用timeout选项来配置它:

    // 配置所有请求的默认值:
    const openai = new OpenAI({
      timeout: 20 * 1000, // 20秒(默认为10分钟)
    });
    
    // 重写每个请求:
    await openai.chat.completions.create({ messages: [{ role: 'user', content: 'How can I list all files in a directory using Python?' }], model: 'gpt-3.5-turbo' }, {
      timeout: 5 * 1000,
    });

    在超时时,会抛出APIConnectionTimeoutError

    请注意,超时的请求将默认重试两次

    自动分页

    OpenAI API中的列表方法是分页的。你可以使用for await … of语法来遍历所有页面中的项目:

    async function fetchAllFineTuningJobs(params) {
      const allFineTuningJobs = [];
      // 自动获取更多页面。
      for await (const job of openai.fineTuning.jobs.list({ limit: 20 })) {
        allFineTuningJobs.push(job);
      }
      return allFineTuningJobs;
    }

    或者,你可以一次只请求一页:

    let page = await openai.fineTuning.jobs.list({ limit: 20 });
    for (const job of page.data) {
      console.log(job);
    }
    
    // 提供用于手动分页的便捷方法:
    while (page.hasNextPage()) {
      page = page.getNextPage();
      // ...
    }

    高级用法

    访问原始响应数据(例如,标头)

    通过APIPromise类型上的.asResponse()方法,你可以访问由fetch()返回的“原始”Response

    你也可以使用.withResponse()方法获取原始的Response以及解析后的数据。

    const openai = new OpenAI();
    
    const response = await openai.chat.completions
      .create({ messages: [{ role: 'user', content: 'Say this is a test' }], model: 'gpt-3.5-turbo' })
      .asResponse();
    console.log(response.headers.get('X-My-Header'));
    console.log(response.statusText); // 访问底层的Response对象
    
    const { data: completions, response: raw } = await openai.chat.completions
      .create({ messages: [{ role: 'user', content: 'Say this is a test' }], model: 'gpt-3.5-turbo' })
      .withResponse();
    console.log(raw.headers.get('X-My-Header'));
    console.log(completions.choices);

    配置HTTP(S)代理(例如,用于代理)

    默认情况下,这个库使用一个稳定的代理来处理所有http/https请求,以重用TCP连接,消除许多TCP和TLS握手,并从大多数请求中刮去大约100ms。

    如果你想禁用或自定义此行为,例如使用代理访问API,你可以传递一个用于所有请求的httpAgent,例如:

    import http from 'http';
    import HttpsProxyAgent from 'https-proxy-agent';
    
    // 配置所有请求的默认值:
    const openai = new OpenAI({
      httpAgent: new HttpsProxyAgent(process.env.PROXY_URL),
    });
    
    // 或者,按请求配置:
    await openai.models.list({
      baseURL: 'http://localhost:8080/test-api',
      httpAgent: new http.Agent({ keepAlive: false }),
    })

    语义版本

    这个包通常试图遵循SemVer约定,尽管某些不向后兼容的更改可能作为次要版本发布:

    1. 只影响静态类型的更改,不影响运行时行为。
    2. 影响库内部的更改,技术上是公共的,但不是为外部使用或记录的。 (如果你依赖这些内部变更,请在GitHub上提出问题告诉我们)
    3. 我们不希望在实际上影响绝大多数用户的情况下进行的更改。

    我们认真对待向后兼容

    性,并努力确保你可以放心升级。

    我们渴望听到你的反馈,请在GitHub上打开一个问题,提出问题、错误或建议。

    要求

    支持TypeScript >= 4.5。

    以下运行时环境受支持:

    • Node.js 16 LTS或更高版本(非EOL版本)。
    • Deno v1.28.0或更高版本,使用import OpenAI from "npm:openai"
      暂时不支持Deno Deploy。
    • Cloudflare Workers。
    • Vercel Edge Runtime。

    如果你对其他运行时环境感兴趣,请在GitHub上打开或投票提出问题。

  • 探秘Whisper:开放AI的通用语音识别模型

    在数字化时代,语音识别技术越来越受到重视。开放AI的Whisper模型是一种通用语音识别模型,它经过大规模的多样化音频数据训练,不仅可以执行多语言语音识别,还能进行语音翻译和语言识别等多项任务。

    探索Whisper的技术

    Whisper采用了Transformer序列到序列模型,它经过多项语音处理任务的训练,包括多语言语音识别、语音翻译、口语语言识别和语音活动检测。这些任务被联合表示为要由解码器预测的令牌序列,使得单一模型可以替代传统语音处理流程中的许多阶段。多任务训练格式使用一组特殊的令牌,这些令牌充当任务指示符或分类目标。

    设置与使用

    Whisper的训练和测试使用Python 3.9.9和PyTorch 1.10.1完成,但代码库预计与Python 3.8-3.11和较新的PyTorch版本兼容。代码库还依赖于一些Python包,最重要的是OpenAI的tiktoken,用于其快速的分词器实现。你可以使用以下命令下载和安装(或更新)Whisper的最新版本:

    pip install -U openai-whisper

    或者,以下命令将获取并安装此存储库的最新提交,以及其Python依赖项:

    pip install git+https://github.com/openai/whisper.git 

    要将包更新到此存储库的最新版本,请运行:

    pip install --upgrade --no-deps --force-reinstall git+https://github.com/openai/whisper.git

    此外,你需要安装命令行工具ffmpeg,这在大多数包管理器中都可以找到。

    # 在Ubuntu或Debian上
    sudo apt update && sudo apt install ffmpeg
    
    # 在Arch Linux上
    sudo pacman -S ffmpeg
    
    # 在MacOS上使用Homebrew(https://brew.sh/)
    brew install ffmpeg
    
    # 在Windows上使用Chocolatey(https://chocolatey.org/)
    choco install ffmpeg
    
    # 在Windows上使用Scoop(https://scoop.sh/)
    scoop install ffmpeg

    如果需要,你还需要安装rust,以便在tiktoken未为你的平台提供预构建的安装包时使用。如果在上述pip install命令期间看到安装错误,请按照Getting started页面的指导安装Rust开发环境。此外,你可能需要配置PATH环境变量,例如export PATH="$HOME/.cargo/bin:$PATH"。如果安装失败并出现No module named 'setuptools_rust'的错误,你需要安装setuptools_rust,例如通过运行:

    pip install setuptools-rust

    可用模型和语言

    Whisper提供五种模型大小,其中四种具有仅英语版本,提供速度和准确性的权衡。以下是可用模型的名称、近似内存需求和相对速度。

    大小 参数数量 仅英语模型 多语言模型 需要VRAM 相对速度
    微小 39 M tiny.en tiny ~1 GB ~32x
    基础 74 M base.en base ~1 GB ~16x
    小型 244 M small.en small ~2 GB ~6x
    中型 769 M medium.en medium ~5 GB ~2x
    大型 1550 M N/A large ~10 GB 1x

    对于仅用于英语应用的.en模型,特别是对于tiny.enbase.en模型,性能更好。我们观察到,对于small.enmedium.en模型,差异变得不那么显著。

    Whisper的性能因语言而异。下图显示了Fleurs数据集在large-v2模型下的语言单词错误率(WER)分布(数字越小,性能越好)。有关其他模型和数据集对应的WER分数,可以在附录D.1、D.2和D.4中找到。此外,更多的BLEU(双语评估助手)分数可以在附录D.3中找到。这些都可以在论文中找到。

    命令行使用

    以下命令将转录音频文件的语音,使用medium模型:

    whisper audio.flac audio.mp3 audio.wav --model medium

    默认设置(选择small模型)在英语转录方面表现良好。如果要转录包含非英语语音的音频文件,可以使用--language选项指定语言:

    whisper japanese.wav --
    
    language Japanese

    添加--task translate将把语音翻译成英语:

    whisper japanese.wav --language Japanese --task translate

    运行以下命令查看所有可用选项:

    whisper --help

    请查看tokenzier.py以获取所有可用语言的列表。

    Python使用

    在Python中也可以进行转录:

    import whisper
    
    model = whisper.load_model("base")
    result = model.transcribe("audio.mp3")
    print(result["text"])

    在内部,transcribe()方法会读取整个文件并使用30秒滑动窗口处理音频,对每个窗口执行自回归序列到序列的预测。

    以下是whisper.detect_language()whisper.decode()的示例用法,它们提供更低级别的访问模型的方法。

    import whisper
    
    model = whisper.load_model("base")
    
    # 加载音频并填充/修整以适应30秒
    audio = whisper.load_audio("audio.mp3")
    audio = whisper.pad_or_trim(audio)
    
    # 制作对数梅尔频谱图并将其移到与模型相同的设备上
    mel = whisper.log_mel_spectrogram(audio).to(model.device)
    
    # 检测口音
    _, probs = model.detect_language(mel)
    print(f"Detected language: {max(probs, key=probs.get)}")
    
    # 解码音频
    options = whisper.DecodingOptions()
    result = whisper.decode(model, mel, options)
    
    # 打印识别文本
    print(result.text)

    更多示例

    请使用? Show and tell类别在讨论中分享更多Whisper的示例用法和第三方扩展,例如网络演示、与其他工具的集成、不同平台的端口等。

    许可协议

    Whisper的代码和模型权重在MIT许可下发布。详细信息请参阅LICENSE

    关键词:

  • 如何充分利用大型语言模型

    如何充分利用大型语言模型

    大型语言模型的工作原理

    大型语言模型是将文本映射到文本的函数。给定一个文本输入字符串,大型语言模型会预测接下来应该出现的文本。

    大型语言模型的魔力在于,通过在大量文本上进行训练以最小化预测误差,这些模型最终学会了对这些预测有用的概念。例如,它们学会了:

    • 如何拼写
    • 语法如何工作
    • 如何改写
    • 如何回答问题
    • 如何进行对话
    • 如何用多种语言写作
    • 如何编写代码
    • 等等

    所有这些功能都不是明确编程的,它们都是在训练过程中产生的结果。

    GPT-3支持数百种软件产品,包括生产力应用程序、教育应用程序、游戏等等。

    如何控制大型语言模型

    在所有输入中,对大型语言模型影响最大的是文本提示。

    大型语言模型可以通过以下几种方式进行提示以生成输出:

    • 指令: 告诉模型你想要什么
    • 完成: 引导模型完成你想要的文本的开头
    • 演示: 向模型展示你想要的内容,可以是提示中的一些示例,也可以是精细调整训练数据集中的成百上千个示例

    下面分别展示了每种方式的示例。

    指令提示

    遵循指令的模型(例如text-davinci-003或以text-开头的任何模型)专门设计用于遵循指令。在提示的顶部(或底部,或两者兼有)编写你的指令,模型将尽力遵循指令,然后停止。指令可以很详细,所以不要害怕写一段明确详细的输出要求。

    例如指令提示:

    提取下面引用中的作者姓名。
    
    “有些人理论认为,智能种族在扩展到外太空之前就会灭绝。如果他们正确,那么夜空的寂静就是坟墓的寂静。”
    ― Ted Chiang, 《呼吸》

    输出:

    Ted Chiang

    完成提示示例

    完成式提示利用了大型语言模型试图编写它认为最有可能出现的文本的方式。为了引导模型,尝试开始一个模式或句子,这个模式或句子将由你想要看到的输出来完成。与直接指令相比,这种方式需要更多的关心和实验。此外,模型不一定知道何时停止,因此通常需要停止序列或后处理来截断生成的文本,以确保输出符合预期。

    例如完成提示:

    “有些人理论认为,智能种族在扩展到外太空之前就会灭绝。如果他们正确,那么夜空的寂静就是坟墓的寂静。”
    ― Ted Chiang, 《呼吸》
    
    这句话的作者是

    输出:

     Ted Chiang

    演示提示示例(少样本学习)

    与完成式提示类似,演示可以向模型展示你想要它做什么。这种方法有时被称为少样本学习,因为模型从提示中提供的少数示例中学习。

    例如演示提示:

    引用:
    “当理性思维一次又一次地被迫面对不可能时,它别无选择,只能适应。”
    ― N.K. Jemisin, 《第五季》
    作者: N.K. Jemisin
    
    引用:
    “有些人理论认为,智能种族在扩展到外太空之前就会灭绝。如果他们正确,那么夜空的寂静就是坟墓的寂静。”
    ― Ted Chiang, 《呼吸》
    作者:

    输出:

     Ted Chiang

    细调提示示例

    通过足够多的训练示例,你可以对自定义模型进行细调。在这种情况下,指令变得不必要,因为模型可以从提供的训练数据中学习任务。但是,包含分隔符序列(例如->###或任何不常出现在输入中的字符串)可以帮助告诉模型提示何时结束以及输出何时开始。如果没有分隔符序列,模型有可能继续详细阐述输入文本,而不是开始生成你想要看到的答案。

    例如,细调提示示例(用于已在类似提示完成对中进行自定义训练的模型):

    “有些人理论认为,智能种族在扩展到外太空之前就会灭绝。如果他们正确,那么夜空的寂静就是坟墓的寂静。”
    ― Ted Chiang, 《呼吸》
    
    ###

    输出:

     Ted Chiang

    代码能力

    大型语言模型不仅在文本方面表现出色,还在代码方面表现出色。OpenAI的专用代码模型称为[Codex](https

    ://openai.com/blog/openai-codex)。

    Codex支持超过70个产品,包括:

    • GitHub Copilot(在VS Code和其他IDE中自动完成代码)
    • Pygma(将Figma设计转化为代码)
    • Replit(具有“解释代码”按钮等功能)
    • Warp(带有AI命令搜索的智能终端)
    • Machinet(编写Java单元测试模板)

    请注意,与遵循指令的文本模型(例如text-davinci-002)不同,Codex没有经过训练以遵循指令。因此,设计良好的提示需要更多的关注。

    更多提示建议

    有关更多提示示例,请访问OpenAI Examples

    总的来说,输入提示是改进模型输出的最佳杠杆。你可以尝试一些技巧,如:

    • 提供更明确的指令。 例如,如果你希望输出是逗号分隔的列表,可以要求它返回逗号分隔的列表。如果你希望它在不知道答案时说“我不知道”,可以告诉它’如果你不知道答案,请说“我不知道”。’
    • 提供更好的示例。 如果你在提示中展示示例,请确保你的示例多样且高质量。
    • 要求模型像专家一样回答。 明确要求模型产生高质量的输出,或者产生像专家写的输出一样的输出,可以诱使模型提供更高质量的答案,因为模型认为专家会写的答案。例如,“以下答案是正确的、高质量的,由专家撰写。”
    • 提示模型写下解释其推理的一系列步骤。 例如,在最终答案之前,以“让我们一步一步地思考”之类的方式引导模型给出其推理的解释。提示模型在最终答案之前解释其推理的步骤可以增加最终答案一致且正确的可能性。
  • 开启OpenAI的力量:全面指南

    OpenAI正在用其先进的技术和强大的API彻底改变人工智能的世界。在这份全面指南中,我们将探索OpenAI的令人难以置信的潜力,以及如何利用其能力来增强你的项目和应用。无论你是开发者、研究员,还是只是对人工智能感兴趣,这份指南都将为你提供有关OpenAI的提供和资源的宝贵见解。

    开始使用OpenAI

    在我们深入探讨OpenAI的精彩世界之前,让我们确保你拥有必要的工具来开始。你需要一个OpenAI账户和一个API密钥,你可以通过创建一个免费账户来轻松获取。一旦你获得了API密钥,你就可以解锁OpenAI的可能性。

    最近的更新和亮点 ? ✨

    随时关注OpenAI的最新发展和增强功能:

    探索OpenAI的能力

    OpenAI提供了广泛的工具和资源,以下是一些要探索的关键领域:

    API使用

    处理速率限制

    在使用OpenAI API时,管理速率限制至关重要。了解如何有效地处理速率限制并优化你的API使用,参考我们的指南:如何处理速率限制

    GPT模型

    格式化输入到ChatGPT模型

    发现将输入格式化为ChatGPT模型的最佳实践,以获得最准确和相关的响应:如何格式化输入到ChatGPT模型

    嵌入

    文本比较示例

    了解如何使用嵌入进行文本比较,以及它的应用领域:文本比较示例

    DALL-E

    生成和编辑图像

    探索如何使用DALL·E生成和编辑图像的方法:如何生成和编辑DALL·E图像

    Whisper

    Whisper提示指南

    深入了解如何使用Whisper进行提示以生成文本:Whisper提示指南

    相关OpenAI资源

    除了这里的代码示例,你还可以从以下资源中了解有关OpenAI API的信息:

    相关网络资源

    人们正在编写出色的工具和论文来改善GPT的输出。以下是一些我们看到的很棒的工具:

    提示库和工具

    • Guidance:来自Microsoft的一个便捷的Python库,使用Handlebars模板来交错生成、提示和逻辑控制。
    • LangChain:一个流行的Python/JavaScript库,用于链接语言模型提示的序列。
    • FLAML(自动化机器学习和调整的快速库):用于自动选择模型、超参数和其他可调参数的Python库。
    • Chainlit:用于创建聊天机器人界面的Python库。
    • Guardrails.ai:用于验证输出并重新尝试故障的Python库。仍处于alpha阶段,因此请预期存在问题和错误。
    • Semantic Kernel:来自Microsoft的一款支持提示模板、函数链接、矢量化存储和智能规划的Python/C#库。
    • Prompttools:用于测试和评估模型、矢量数据库和提示的开源Python工具。
    • Outlines:提供领域特定语言以简化提示和限制生成的Python库。
    • Promptify:一个用于使用语言模型执行NLP任务的小型Python库。
    • Scale Spellbook:一个用于构建、

    比较和发布语言模型应用程序的付费产品。

    • PromptPerfect:一个用于测试和改进提示的付费产品。
    • Weights & Biases:一个用于跟踪模型训练和提示工程实验的付费产品。
    • OpenAI Evals:用于评估语言模型和提示任务性能的开源库。
    • LlamaIndex:用于通过数据增强LLM应用的Python库。
    • Arthur Shield:一个用于检测毒性、幻觉、提示注入等的付费产品。
    • LMQL:用于LLM交互的编程语言,支持类型提示、控制流、约束和工具。

    提示指南

    视频课程

    提高推理能力的高级提示的论文

    尝试任务,可以提高随后的性能。

    贡献

    如果有你希望看到的示例或指南,请随时在问题页面上提出建议。我们也很高兴接受高质量的拉取请求,只要它们符合仓库的范围。

  • 打造强大的红色警戒2 AI玩家:Python训练教程

    在这个激动人心的教程中,你将学会如何使用Python来训练一个强大的人工智能(AI)玩家,使其能够在《红色警戒2》(Red Alert 2)这款经典游戏中与你一较高下。不再面对单调的游戏模式,让我们来创建一个智能的对手吧!

    准备工作

    在开始之前,你需要准备以下工作:

    1. 安装Python和所需的库: 如果你尚未安装Python,你可以从Python官方网站下载并安装最新版本。另外,我们将使用TensorFlow来构建深度学习模型,你可以使用以下命令来安装:

      pip install tensorflow
    2. 下载并安装红警2: 你需要购买并安装《红色警戒2》游戏,以便我们的AI玩家能够与游戏互动。

    3. 了解游戏规则: 在开始训练之前,确保你对《红色警戒2》游戏的基本规则和战略有一定的了解,这将有助于你为AI定义游戏策略。

    第一步:导入必要的库

    首先,让我们导入一些必要的Python库,以便我们能够构建AI玩家所需的模型和工具。

    import tensorflow as tf
    from tensorflow import keras
    import numpy as np
    import random

    第二步:收集游戏数据

    在开始训练之前,你需要收集游戏数据,包括游戏状态、动作和奖励。你可以创建一个Python脚本来模拟游戏,并在游戏中收集这些数据。以下是一个示例:

    # 模拟游戏状态
    game_state = ...
    
    # 选择一个随机动作
    action = random.choice(["build_unit", "attack_enemy", "move_unit"])
    
    # 计算奖励
    reward = ...

    第三步:构建深度强化学习模型

    现在,让我们构建一个深度强化学习模型,以便AI可以根据游戏状态选择最佳的动作。我们将使用TensorFlow来创建模型。

    model = keras.Sequential([
        keras.layers.Dense(64, activation='relu', input_shape=(game_state_size,)),
        keras.layers.Dense(32, activation='relu'),
        keras.layers.Dense(action_space_size, activation='linear')
    ])

    第四步:训练AI模型

    使用收集的游戏数据,你可以开始训练AI模型。在这一步中,你将定义训练过程、损失函数和优化器,并让AI模型逐渐学习游戏策略。

    model.compile(optimizer='adam', loss='mse')
    
    # 训练模型
    model.fit(game_states, q_values, epochs=1000)

    第五步:测试你的AI玩家

    一旦你的AI模型训练完成,你可以测试它在《红色警戒2》游戏中的表现。启动游戏并让AI玩家代替你进行游戏,观察它的表现和决策是否合理。

    第六步:优化和改进

    AI玩家的性能可能需要不断优化和改进。你可以尝试不同的模型架构、调整超参数或增加更多的训练数据来提高AI的表现。

    结论

    通过这个教程,你学会了如何使用Python和深度学习来训练一个智能的《红色警戒2》AI玩家。让你的游戏体验更具挑战性和乐趣,不再与AI玩家为敌,而是一同探索游戏的乐趣吧!

    希望你能够享受这个项目,并不断改进你的AI玩家。祝你在《红色警戒2》中获得胜利!

    参考资料

  • 高端投影仪与OLED电视:观感之争

    介绍

    高端投影仪与OLED电视,两者在影音娱乐世界中一直存在着激烈的竞争。本文将深入探讨它们的优势、差异以及适用场景,帮助您更好地理解如何在这两者之间做出明智的选择。

    OLED电视:色彩的奇迹

    OLED电视以其卓越的色彩表现而令人惊叹。每个像素都能独立发光,这意味着它可以实现真正的绝对黑色,同时色彩更加鲜艳,对比度更高。下表展示了OLED电视的一些卓越特点:

    特点 描述
    绝对黑色 完美的黑色表现
    鲜艳的色彩 生动、逼真的图像
    极快的响应时间 消除运动模糊
    高对比度 深邃的黑色和明亮的高光

    高端投影仪:巨幕的魅力

    然而,高端投影仪也有其独特的吸引力,尤其是在需要巨幕的情况下。投影仪的巨大屏幕效果无疑是无法匹敌的,但也伴随着一些挑战。下表总结了高端投影仪的特点:

    特点 描述
    巨大屏幕 家庭影院体验的极致选择
    较低的价格 在大尺寸方面更具吸引力
    需要适当的环境光线 明亮环境下可能受到影响
    安装空间要求 需要足够的距离来投射大尺寸画面

    影院放映机与家庭使用

    为什么一些影院仍然坚持使用投影仪和幕布的组合呢?这个问题有几个关键因素需要考虑:

    1. 尺寸需求:影院需要大屏幕以满足观众的需求。一些影院可能要播放大规模的影片,因此投影仪是唯一的选择。

    2. 观影环境:影院可以控制光线,确保观众在黑暗中观看,从而提高观影体验。这种环境对于投影仪的效果至关重要。

    3. 特殊需求:某些影院可能需要投影仪来播放特定类型的内容,例如3D电影或高动态范围(HDR)内容。

    然而,对于家庭用户来说,情况可能不同。在家中观看电影或电视节目时,您可以更好地控制光线和观影环境,这有助于OLED电视提供更出色的画质和观感。

    结论

    高端投影仪和OLED电视各有优势。OLED电视以其卓越的色彩表现和画质而脱颖而出,适合大多数家庭观众。而高端投影仪则在提供巨幕观影体验方面具有无可比拟的魅力,前提是您拥有足够的空间和能够控制光线的环境。

    最终的选择取决于您的个人需求和预算。无论您选择哪种设备,都能够享受到精彩的娱乐体验。

  • ChatGPT的超级使用者:拥有4大关键特质的人才

    ChatGPT的超级使用者:拥有4大关键特质的人才

    引言

    在当今信息时代,ChatGPT等自然语言处理工具已成为无可争议的现象级工具。然而,要想真正发挥其超级价值,需要具备一系列优秀特质。本文将探讨这些特质,并为您解析如何成为ChatGPT的超级使用者。

    一、善于提问:揭开问题的多重层面

    在ChatGPT问世之前,提问通常只是获取信息的手段之一。然而,现在,提问已成为一种“超级能力”。成功的ChatGPT使用者善于深入提问,不满足于简单的回答,而是追问问题的根本原因和背后的机制。这样的提问不仅仅是为了获取答案,更是为了理解问题的本质,掌握知识的深层次。

    示例提问:

    • 普通提问:太阳是什么?

    • 优秀提问:太阳是如何形成的,它的主要成分是什么,以及它对地球生命有什么影响?

    • 普通提问:如何煮鸡蛋?

    • 优秀提问:如何煮出完美的软煮鸡蛋,其中的黄部分是液态的,但白部分完全煮熟?

    • 普通提问:为什么大象这么大?

    • 优秀提问:大象的大小如何帮助它们在自然界中生存,它的生物学和进化背后有哪些机制?

    通过深入提问,您能够更全面地了解问题,并为ChatGPT提供更具深度的信息,进一步提高工作效率。

    二、独立思考:工具是工具,不是终极答案

    尽管ChatGPT拥有强大的智能,但其回复并非百分之百准确。这时,独立思考的能力就显得至关重要。任何工具,无论多么先进,都只是工具,不应过度依赖。成功的使用者会在接收ChatGPT答案后进行二次思考,结合实际情况做出最佳决策。

    独立思考有助于避免盲目接受信息,减少“× 错误决策”的风险,同时保持对什么才是“√ 正确答案”的判断能力。

    三、技术了解:深入了解工具的本质

    虽然不必成为编程大师,但了解ChatGPT背后的基本机制、优势和局限性至关重要。知道工具在什么场景下最有效,何时需要小心使用,是成功使用ChatGPT的关键。

    技术了解的好处:

    • 创建指令时更好地设定和提问。
    • 理解ChatGPT的底层策略,有助于更好地利用工具。
    • 帮助建立与ChatGPT更深的连接,提高工作效率。

    四、持续学习:适应时代的前沿

    在快速发展的时代,持续学习是一项重要的能力。ChatGPT等AI工具的不断更新和改进需要不断学习和探索。持续学习意味着不断尝试、适应新应用场景,进一步提升工具的价值。

    同时,持续学习和成长的热情使您能够适应和应对未来技术的变化,始终站在时代的前沿。

    结论

    成为ChatGPT的超级使用者需要具备善于提问、独立思考、技术了解和持续学习的特质。这些特质将帮助您更好地利用这一强大工具,提高工作效率,拓宽应用领域。

    ChatGPT是一把双刃剑,其价值取决于使用者的素质和能力。只有具备这些特质的人才,才能真正发挥ChatGPT的超级价值。

  • 不破不立,大神网改版

    在数字世界中,变革是永恒的主题。随着时间的推移,大神网也正在经历一个历史性的时刻 – 全新的改版。这次改版源自一个挑战,但它也标志着一个新的开始,一个优化和强化网站体验的机会。让我们一起探讨这次改版的背后故事和新的方向。

    背景:大变革的开始

    事情起初是因为突然被Bing从其搜索结果中删除。虽然这样的行为令人不满,但它也为大神网提供了一个重新审视和优化网站的契机。更换WordPress主题和对SEO进行优化成为此次改版的核心。

    WordPress 7B2:告别老朋友

    之前使用的WordPress 7B2主题是一个功能丰富的主题,提供了许多便捷的工具和功能。但随着时间的推移,某些功能开始显得有些臃肿,不再符合大神网的方向和需求。因此,进行一次大规模的改版和优化成了必然。

    主题更换:一个勇敢的决定

    虽然更换主题可能会带来SEO方面的负面影响,但我们不能永远拖延。新的WordPress主题将带来更为简洁、专注的设计和更高的性能,这对于提高用户体验和网站效率来说是至关重要的。

    功能优化:更精简,更高效

    在新的改版中,我们决定去掉商店功能。之前的付费资源将直接免费发布,为大家提供更多的学习和探索机会。我们期待这样的举措能够让大神网成为一个更加开放和共享的平台。

    Bing事件:不公平的待遇

    本次改版的一个重要推动力是Bing在没有任何通知的情况下删除所有的网站搜索结果。我们对此表示强烈不满,也看到了在SEO和网站优化方面的改进空间。在新的改版中,我们将更加注重SEO优化,以保证大神网能够在搜索引擎中占据有利位置。

    新篇章:子站点的崛起

    这次改版不仅仅是对现有功能的优化和调整。实际上,我们已经计划了一系列新的功能和内容,它们将以子站点的形式呈现。这不仅可以使网站结构更为清晰和高效,还可以为读者提供更多丰富和多元的内容。敬请各位期待大神网新的子站点,我们相信它们将为您带来全新的体验和启示。

    结语:新的开始

    “不破不立”,这不仅仅是一次网站改版,更是大神网走向更高境界的一个新起点。我们希望通过这次改版,大神网能够为读者提供更好的内容和体验,同时也能够在数字领域占据一席之地。

    希望大家能够继续支持大神网,一起见证它的成长和进步。

  • 如何安全有效清理Windows注册表

    什么是Windows注册表?

    Windows注册表是计算机操作系统的关键组成部分,它存储了几乎所有与计算机运行和配置相关的信息。可以将它看作是计算机的"心脏",因为它包含了操作系统配置、用户偏好设置、软件程序和硬件设备的信息和设置。随着时间的推移,注册表可能会积累大量的数据,包括不再需要的信息,这可能会导致计算机运行速度变慢,甚至出现错误。

    为什么需要清理注册表?

    需要清理注册表的主要原因包括:

    1. 性能问题:当注册表中的数据过多时,操作系统可能会变得缓慢,因为它需要浏览整个注册表以查找所需的信息。

    2. 错误和崩溃:损坏的注册表项可能导致应用程序错误和系统崩溃。

    3. 卸载程序的残留:卸载应用程序时,有时会留下注册表项,这些项可能会占用磁盘空间并导致混乱。

    4. 保持系统稳定性:定期清理注册表有助于维护操作系统的稳定性。

    如何安全有效地清理注册表?

    在清理注册表之前,请务必备份数据和注册表,以防万一出现问题。下面是一些安全有效清理Windows注册表的方法:

    1. 手动清理注册表残留

    备份注册表

    在进行任何更改之前,备份注册表是至关重要的。这将允许您撤销任何不必要的更改。以下是备份注册表的步骤:

    1. 点击“开始”按钮,然后选择“运行…”。
    2. 在文本输入框中输入"regedit"。
    3. 按下“回车键”或点击“确定”按钮。
    4. 点击“文件”菜单,选择“导出”。
    5. 在“导出范围”面板中选择“全部”。
    6. 选择备份文件的保存路径和文件名。
    7. 点击“保存”。

    手动清理注册表残留

    一旦备份了注册表,您可以手动清理不再需要的注册表项。以下是一些步骤:

    1. 找到并移除已卸载程序的注册表信息。在注册表中,定位到与已卸载程序相关的键,并删除它们。
    2. 使用查找功能来搜索与不再需要的程序相关的关键词,并删除找到的项。
    3. 删除不必要的启动项,以提高系统启动速度。这可以在注册表中的“运行”键下找到。

    2. 使用磁盘清理工具

    虽然磁盘清理工具不会直接清理注册表,但它们可以清理与注册表相关的不必要的文件,从而提高性能。以下是使用磁盘清理工具的步骤:

    1. 按“开始”并在搜索栏中输入“磁盘清理”。
    2. 选择应用程序。
    3. 选择要清理的驱动器(通常是C:驱动器)。
    4. 工具将扫描并列出可以删除的文件。
    5. 选择要删除的文件类型,然后点击“确定”。

    3. 使用Windows DISM工具

    Windows的DISM工具(部署映像服务和管理)是一种命令行工具,可用于修复与损坏的注册表项有关的问题。以下是使用DISM工具的步骤:

    1. 打开命令提示符(以管理员身份运行)。
    2. 输入以下命令并按回车键执行:

      DISM /Online /Cleanup-Image /RestoreHealth

      此命令将扫描并尝试修复损坏的系统文件和注册表项。

    4. 使用第三方注册表清理工具

    如果您不确定如何手动清理注册表或不想冒风险,可以考虑使用第三方注册表清理工具。这些工具通常具有用户友好的界面,可以安全地清理注册表并提高性能。以下是使用第三方工具的步骤:

    1. 在Microsoft Store或其他可信来源下载并安装注册表清理软件,例如“Cleaner One Pro”。

    2. 运行清理软件。

    3. 扫描并清理无效的注册表文件。

    请注意,选择注册表清理工具时要选择一个可信赖的工具,并遵循其指南。

    结论

    清理Windows注册表是维护计算机性能和稳定性的重要步骤。但请务必小心谨慎,备份注册表,并根据您的技能和需求选择适当的清理方法。如果不确定,最好使用第三方注册表清理工具。

  • 一代教育巨匠,PPT之父罗伯特·莱夫科维茨的永恒遗志

    近日,全球教育界和科技界共同目睹了一位杰出的教育科技先驱,被誉为“PPT之父”的罗伯特·莱夫科维茨(Robert Lewarczek)的离世。他不仅是教育领域的巨匠,也是现代教育方式的奠基者之一。本文将深入探讨罗伯特·莱夫科维茨的生平和贡献,以及他对教育领域的深远影响。

    早年生活与教育兴趣

    罗伯特·莱夫科维茨生于20世纪中叶,他的早年生活充满了对教育和科技的浓厚兴趣。在青海省海北藏族自治州海晏县度过的童年,他便展现出了非凡的求知欲望和创新思维。这段儿时经历为他日后的职业生涯打下了坚实的基础。

    PPT之父的崭露头角

    在他的职业生涯中,罗伯特·莱夫科维茨以不懈的努力和追求,为PPT这一教学工具的普及和应用做出了卓越的贡献。早在20世纪80年代,他就提出了将PowerPoint应用于课堂教学的设想,并首次将投影仪与电脑结合,为全球教育界带来了前所未有的变革。

    PPT的教育革命

    PPT的出现,改变了传统的教学方式。它不仅使课程内容更加直观、生动地呈现给学生,还极大地提高了学生的学习兴趣和参与度。在现代教育领域,PPT已经成为不可或缺的一部分,其影响力渗透到了全球各地的教室。无论是高校讲堂还是中小学课堂,我们都能看到PPT的身影,它为教育注入了新的活力。

    教育与技术的完美融合

    罗伯特·莱夫科维茨将教育与技术完美融合,为教师和学生提供了更多的可能性。他的愿景是让教育变得更加互动和生动,让学生更容易理解和吸收知识。他通过不断探索和实验,使PPT成为了教育的强大工具,将教育带入了数字时代。

    永恒的遗产

    尽管罗伯特·莱夫科维茨已经离开了我们,但他的思想和影响将永远留存。正如他的名字“PPT之父”所寓意的那样,他是我们这个时代的伟大开拓者之一。他的事业和精神将永远激励着我们,不断追求教育的进步与革新。

    教育的未来

    罗伯特·莱夫科维茨的贡献将继续影响着未来的教育。他的理念和创新精神将激发更多的教育者和科技从业者,不断寻求改进和突破。他的离世让我们更加深刻地认识到,科技进步对于推动教育发展的重要性。让我们继续沿着他的足迹前行,为实现教育公平和高质量而努力。

    永远的敬意

    在怀念罗伯特·莱夫科维茨的同时,我们也要感谢他所做出的巨大贡献。正是因为有了他,我们才能在教育领域取得今天的成就。他的离世让我们失去了一位伟大的教育科技先驱,但他的遗产将永远闪耀在教育的道路上。

    结语

    在此,我们再次向罗伯特·莱夫科维茨表示最深切的哀悼和敬意。愿他在天堂安息,永远享受他所钟爱的事业所带来的荣誉与尊严。同时,让我们铭记他的贡献,不断汲取他的精神力量,为推动教育的繁荣发展而不懈努力奋斗。