分类: 站长笔记

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

  • 高效配置OpenWRT与MentoHUST实现802.1x验证

    曾几何时,你可能也曾遇到过在家中或办公室需要更安全的网络连接的情况。无论是出于保护隐私的需要还是为了让网络更安全,802.1x认证是一个强大的工具。通过将OpenWRT与MentoHUST相结合,你可以轻松地为你的网络添加802.1x认证,提高网络的安全性。本教程将引导你完成这一过程。

    准备工作

    在开始之前,确保你已经完成以下准备工作:

    1. 安装OpenWRT: 你的路由器上已经安装了OpenWRT操作系统。如果还没有安装,请先按照官方文档进行安装。

    2. 了解802.1x认证: 你对802.1x认证有一定的了解。这是一种网络认证协议,通常用于增强网络的安全性。

    3. 下载MentoHUST: 从MentoHUST的官方网站下载最新的版本。MentoHUST是一个用于校园网的认证客户端。

    配置OpenWRT

    1. 登录OpenWRT的Web管理界面。通常,你可以在浏览器中输入路由器的IP地址来访问此界面。

    2. 在左侧导航栏中找到“网络”并点击“接口”。

    3. 点击“新增接口”。

    4. 在“接口配置”中,选择“802.1Q虚拟局域网”作为接口协议。然后点击“提交”。

    5. 在“物理设置”中,选择你的LAN口(通常是eth0)作为“接口”。

    6. 在“接口配置”中,输入一个名称,如“lan1”。

    7. 在“VLAN ID”中输入VLAN ID,通常是1。

    8. 点击“提交”。

    9. 接下来,点击“编辑”按钮以编辑刚刚创建的接口。

    10. 在“物理设置”下,选择你的WAN口(通常是eth1)作为“接口”。

    11. 在“接口配置”下,将“协议”更改为“静态地址”。

    12. 在“IPv4地址”中,输入一个IP地址,例如192.168.1.2,子网掩码为255.255.255.0。

    13. 在“IPv4网关”中,输入你的路由器的IP地址,通常是192.168.1.1。

    14. 在“DNS服务器”中,输入你的DNS服务器的IP地址,通常是你的互联网服务提供商提供的。

    15. 点击“提交”。

    安装和配置MentoHUST

    1. 下载MentoHUST并将其上传到OpenWRT路由器。你可以使用SCP或WinSCP等工具来完成这个任务。

    2. 在OpenWRT路由器上打开SSH连接,并使用以下命令安装MentoHUST:

      opkg install mentohust
    3. 安装完成后,使用以下命令编辑MentoHUST的配置文件:

      vi /etc/mentohust.conf
    4. 在配置文件中,设置你的校园网账号和密码:

      Username = your_username
      Password = your_password
    5. 保存并退出配置文件。

    6. 启动MentoHUST并将其设置为开机启动:

      /etc/init.d/mentohust start
      /etc/init.d/mentohust enable
    7. 重新启动你的路由器以应用更改。

    测试和验证

    1. 等待路由器重新启动后,尝试连接到你的WiFi网络。

    2. 当你连接时,系统会要求你输入用户名和密码。输入你的校园网账号和密码。

    3. 如果一切设置正确,你应该能够成功连接到WiFi网络。

    结语

    通过将OpenWRT与MentoHUST相结合,你可以为你的网络添加802.1x认证,提高网络的安全性。这将确保只有授权用户才能访问你的网络,保护你的隐私和数据安全。

    这是一个相对复杂的过程,但一旦配置完成,你将享受到更安全的网络连接。希望这个教程对你有所帮助。

  • 如何使用Python删除Excel中的指定数据

    大家好,我是王大神。今天,我将向您展示如何使用Python来删除Excel中的指定数据。Excel是一个功能强大的电子表格工具,但有时候我们需要对表格进行清理,删除不需要的数据。Python是一个出色的工具,可以帮助我们自动化这个任务。在本教程中,我将逐步指导您完成这个过程,让您能够轻松地删除Excel表格中的指定数据。

    步骤1:安装必要的库

    首先,我们需要确保您已经安装了所需的Python库。我们将使用pandas库来处理Excel表格。如果您还没有安装pandas,可以使用以下命令来安装:

    pip install pandas

    步骤2:导入库

    在您的Python脚本中,导入pandas库,以便我们可以使用它来读取和处理Excel文件。

    import pandas as pd

    步骤3:读取Excel文件

    使用pandasread_excel函数来读取您要处理的Excel文件。假设您的Excel文件名为data.xlsx,您可以这样读取它:

    df = pd.read_excel('data.xlsx')

    步骤4:筛选和删除数据

    现在,我们来到了关键的步骤,筛选和删除数据。假设您想要删除某一列中的特定数值,比如删除列A中值为42的所有行。您可以使用以下代码:

    df = df[df['A'] != 42]

    这将删除列A中值为42的所有行。

    如果您想要删除多个条件下的数据,可以使用&|来组合条件。例如,删除列A中值为42且列B中值为'X'的行:

    df = df[(df['A'] != 42) & (df['B'] != 'X')]

    步骤5:保存新的Excel文件

    完成数据删除后,我们需要将新的数据保存到一个新的Excel文件中,以确保原始数据不受影响。使用pandasto_excel函数可以轻松实现这一点。

    df.to_excel('new_data.xlsx', index=False)

    结论

    恭喜!您已经学会了如何使用Python来删除Excel中的指定数据。这个过程可以帮助您轻松地清理和整理Excel表格,以满足您的需求。记住,Python是一个强大的工具,可以帮助您自动化许多重复性的任务。

    如果您有任何问题或需要进一步的帮助,请随时在我的网站大神的AI技术博客上联系我。感谢您的阅读!

  • 英特尔酷睿i9-14900KF现身Geekbench,全系即将涨价

    在科技界,一直以来都备受期待的是新一代的处理器发布。英特尔作为一家全球知名的半导体公司,一直在不断推出创新的处理器产品。近日,有消息称英特尔即将发布全新的酷睿Ultra1代处理器,并在技术创新大会中正式推出。这一系列新处理器将带来新的命名、新的架构、新的工艺和新的核显,标志着英特尔处理器的全面升级。同时,英特尔还计划推出革命性的MeteorLake处理器,其中酷睿Ultra系列将成为产品线的主力。与此同时,英特尔的新一代RaptorLakeRefresh旗舰级处理器i9-14900KF已经亮相于Geekbench基准测试平台。本文将对英特尔酷睿i9-14900KF的性能和价格进行详细介绍,并分析整个系列的升级和涨价情况。

    酷睿Ultra系列的升级与命名变化

    英特尔酷睿Ultra1代处理器即将推出,这次的升级不仅仅体现在性能上,还包括了命名、架构、工艺和核显方面的全面提升。新一代处理器的命名将焕然一新,同时英特尔处理器和显卡的标识也进行了改动。这意味着以后购买英特尔处理器时,消费者将会看到全新的命名方式。首个采用新命名方式的处理器是MeteorLake架构,将被命名为“英特尔酷睿Ultra”。据英特尔官方表示,MeteorLake架构的处理器将分为Ultra5、Ultra7和Ultra9三个等级,为用户提供更多的选择。

    这一新的命名方式代表了英特尔在处理器产品线上的升级和创新。酷睿Ultra系列的到来将进一步提升英特尔处理器的性能和效能,为用户带来更加出色的使用体验。此外,酷睿Ultra系列处理器将采用全新的架构和工艺,进一步提高处理器的计算性能和能效比。这意味着用户将能够享受到更快的速度和更高的效能,无论是进行游戏、娱乐还是办公工作,都能得到更加流畅和高效的体验。

    RaptorLakeRefresh旗舰级处理器i9-14900KF的亮相

    在即将发布的新一代RaptorLakeRefresh处理器中,i9-14900KF无疑是最令人期待的旗舰级产品。最新的消息显示,这款处理器已经在Geekbench基准测试平台上亮相,为我们提供了一些关于其性能的初步了解。根据测试结果,i9-14900KF的单核得分在3322至3497之间,多核得分在22895至23186之间。此外,根据Geekbench5的测试结果,该处理器在单核性能方面获得了2412分,多核性能方面获得了26972分。从这些数据可以看出,i9-14900KF在多核性能方面比之前的i9-13900K有约6%的提升,并且在单核性能方面至少提升了12%。

    这一系列的进步使得i9-14900KF成为一款性能出色的处理器,适用于需要高性能计算的用户。无论是进行专业的图形设计、视频剪辑还是进行高负荷的游戏运行,i9-14900KF都能够提供卓越的性能和顺畅的使用体验。据了解,i9-14900KF采用了最新的ThermalVelocityBoost技术,可以将处理器的频率提升至6GHz,进一步提升计算速度和响应能力。这使得处理器在各类任务中都能够表现出色,并展现出优秀的性能和效率。

    酷睿i9-14900KF的价格涨幅分析

    然而,伴随着性能的提升,英特尔处理器的价格也将有所上涨。据科技媒体TechNewsSpace报道,零售商PCCanada已经放出了英特尔第14代RaptorLake-SRefresh处理器的价格信息。根据报道,带有“K”和“KF”后缀的处理器共有6款,其中包括14核、20核和24核的型号。这些处理器的价格区间在415.99美元到833.99美元之间,相当于约人民币3026元到6067元。

    与之前的同级别产品相比,价格上涨的幅度大约在2%到4%之间。尽管涨幅并不是很大,但对于消费者来说仍然需要考虑成本因素。然而,值得一提的是,高性能的处理器往往伴随着更高的价格。对于那些追求顶级性能的用户来说,他们更愿意为高品质的产品支付更多的费用。因此,尽管价格有所上涨,但对于追求极致性能的用户来说,i9-14900KF仍然是一款非常值得购买的处理器。

    结论

    在即将到来的英特尔技术创新大会上,全新的酷睿Ultra系列处理器将正式发布,预计将为用户带来更快、更高效的计算体验。作为酷睿Ultra系列的第一代产品,MeteorLake架构的处理器将采用全新的命名方式,让用户更加容易理解和选择。与此同时,英特尔的RaptorLakeRefresh旗舰级处理器i9-14900KF在Geekbench基准测试平台上亮相,展现了卓越的性能和强大的计算能力。然而,在性能提升的同时,处理器的价格也将有所上涨。虽然价格涨幅较小,但对于追求顶级性能的用户来说,这一系列的新产品仍然具有非常高的吸引力。因此,我们可以期待,英特尔的全新处理器将为用户带来更出色的计算性能和使用体验。

  • 探秘ChromeOS:Linux内核下的Google桌面环境

    曾经,我们将Linux视为计算机领域的神秘世界,只有技术大牛才能理解和操作。但今天,我们将揭示一个令人惊讶的事实:ChromeOS实际上是一个基于Linux内核的操作系统,只是它被Google的桌面环境巧妙地隐藏了起来。本文将深入探讨ChromeOS的内部机制,解释为什么它如此特殊,以及如何在其中运行Linux应用程序。

    1. ChromeOS和Linux的奇妙结合

    Kevin C. Tofel最近在一篇文章中提到,ChromeOS现在更像是带有Google桌面环境的Linux发行版。这一说法引发了广泛的讨论,因为大多数人将ChromeOS视为一种独立的操作系统,而不是Linux的一部分。

    然而,事实上,ChromeOS的核心是Linux内核。当你启动Chromebook时,你实际上启动了Linux操作系统。但这种Linux被Google的桌面环境所覆盖,使其对用户来说几乎是透明的。

    2. ChromeOS的桌面环境

    为了更好地理解ChromeOS,我们需要了解桌面环境的概念。在Linux世界中,桌面环境是一个图形用户界面,它为用户提供了可视化的方式来操作计算机。这包括图形化的文件管理器、应用程序启动器菜单和其他可点击的图形元素。

    在ChromeOS中,你不能像在普通Linux发行版中那样更改桌面环境。这是因为Google已经为ChromeOS选择了自己的定制桌面环境,将其与传统的Linux发行版区分开来。

    3. ChromeOS中的Linux

    然而,ChromeOS并不是纯粹的Google定制操作系统。实际上,在ChromeOS上有一个Linux子系统,它运行在虚拟机中的Debian Linux容器中。这就是为什么你可以在ChromeOS上运行Linux应用程序的原因。

    当你打开ChromeOS中的Linux终端时,你实际上是进入了Debian Linux容器,这是一个独立的Linux环境。你可以在其中运行各种Linux命令和应用程序,就像在传统Linux发行版中一样。

    4. 运行Linux应用程序

    在ChromeOS中运行Linux应用程序变得非常简单。你可以通过ChromeOS的设置启用Linux支持,然后安装你喜欢的Linux应用程序。这些应用程序将在Linux容器中运行,但你可以在ChromeOS的桌面环境中访问它们。

    这为ChromeOS带来了更多的灵活性,使其成为一个功能强大的操作系统,不仅适用于互联网浏览,还适用于开发和其他复杂任务。

    5. 结语

    ChromeOS是一个充满惊喜的操作系统,它将Linux内核与Google的桌面环境巧妙地结合在一起。尽管大多数用户可能从未察觉到其中的Linux存在,但它确实存在,并且为ChromeOS带来了强大的功能。

    了解ChromeOS内部机制有助于你更好地理解这个操作系统,并充分利用它的潜力。无论你是Chromebook用户还是对新技术感兴趣的人,ChromeOS都值得你深入探索。

  • 深度揭秘:AI巨变背后的故事

    曾几何时,人工智能在科技领域掀起一场风暴,众多先进的模型如GPT-4和Gemini引领潮流。然而,新的爆料显示,AI领域正迎来一次前所未有的巨变。在本文中,我们将揭示DeepMind的最新计划和OpenAI的神秘动向,以及这些变化对未来的影响。

    1. Inflection模型的崛起

    近日,DeepMind联合创始人Mustafa Suleyman爆料称,Inflection AI计划在未来18个月内训练出比现有前沿模型大100倍的模型,而在未来3年内,这一规模将达到GPT-4的1000倍。这一消息震惊了整个AI界,引发了广泛的猜测和讨论。

    Inflection模型的崛起引发了一个重要问题:模型的规模是否等同于其实际能力?虽然规模庞大的模型令人印象深刻,但其性能是否能够匹配其规模?这是一个值得深入思考的问题。

    2. GPT-5的神秘动向

    与此同时,OpenAI的动向也备受关注。尽管曾有传闻称他们正在秘密训练GPT-5,但Sam Altman此前曾否认这一传闻,令人感到疑惑。这是否意味着GPT-5实际上就是GPT-4.5?这个问题令人困扰,AI界对于OpenAI的计划充满了疑虑。

    然而,无论GPT-5的具体规模如何,其可能带来的影响都不容忽视。AI领域的发展速度之快令人难以预测,我们不得不拭目以待,看看GPT-5将如何改变我们的世界。

    3. AI自主进化的威胁

    Suleyman的访谈中还提到了AI的未来发展路径。虽然当前的AI技术尚未表现出自主进化的能力,但他警告说,这一可能性不容忽视。自主进化的AI可能带来巨大的潜在风险,而Inflection AI和DeepMind都尚未朝这个方向发展。

    这一观点引发了对于AI安全性的深入思考。除了模型的规模,AI的自主性和目标制定能力也是潜在威胁的来源。我们需要密切关注这一问题,并采取必要的措施来确保AI的安全性。

    4. 模型训练的军备竞赛

    Inflection AI的规模庞大的模型训练引发了一个问题:AI模型训练的军备竞赛是否会加剧AI的风险?虽然规模的增长本身不一定会导致危险,但模型的能力和特性可能会在竞赛中不断提升,这可能导致潜在的威胁。

    另一个问题是模型训练的成本。虽然算力成本可能会下降,但训练巨大的模型仍然需要大量的资源。我们需要思考AI训练成本将如何变化,以及是否会出现更加经济高效的训练方法。

    5. 开源模型的利与弊

    Suleyman的观点对于开源模型的未来发展提出了挑战。他认为,在未来5年内,开源模型可能会落后于闭源模型3-5年的时间。此外,他强调了开源模型可能带来的社会风险,因为所有人都可以访问最新的模型,这可能导致力量的快速扩散,增加不稳定性和破坏性。

    尽管开源模型可以促进技术创新和改进,但也需要谨慎看待潜在的风险。我们需要在开源模型的使用和管理方面采取适当的措施,以防止潜在的滥用和风险。

    6. 谷歌Gemini的崭露头角

    最后,Suleyman的访谈提到了谷歌的Gemini项目。这一多模态人工智能模型计划至少拥有1万亿参数,并采用了多个专家模型组成的混合专家模型结构。Gemini将涵盖图像、文本以及视频生成等多个领域,并将逐步整合到谷歌的产品线中。

    Gemini的潜在影响力令人期待,也将进一步推动AI技术的发展。谷歌正积极备战,试图在AI领域重新夺回领先地位,这将对整个行业产生深远的影响。

    结语

    AI领域的巨变正在加速发展,Inflection模型、GPT-5、自主进化、军备竞赛、开源模型和Gemini项目都将塑造未来的AI格局。我们需要密切关注这些变化,不断探索其潜在影响,并采取适当的措施来确保AI的发展是安全和可持续的。

  • ChatGPT 4V发布:开启多模态时代

    嗨,大家好,我是王大神。今天,我要和大家分享一项令人激动的消息:OpenAI正式发布了全新的ChatGPT 4V,这是继GPT-3之后的最新一代自然语言处理模型。这一版本的ChatGPT不仅带来了众多期待已久的特性,还引入了两项全新的功能:语音输入和图像输入。这意味着ChatGPT现在不仅可以“读”和“写”,还可以“听”和“看”,为我们带来更强大的创造力和语言理解能力。

    从文本到多模态:ChatGPT 4V的重大升级

    ChatGPT一直以来都以其强大的文本理解和生成能力而闻名,但现在,它已经向多模态领域迈出了坚实的一步。让我们一起来看看ChatGPT 4V的两项新功能:语音输入和图像输入。

    语音输入:与ChatGPT直接对话

    使用语音输入功能时,用户只需按下一个按钮,说出自己的问题,ChatGPT就会将其转换为文本,然后生成答案,再将答案转换为语音,播放给用户。这代表着用户可以通过语音与ChatGPT直接进行对话互动,不再局限于使用键盘进行文本输入。ChatGPT 4V的语音功能提供了多种声音选项,包括男性声音、女性声音、青少年声音等,具有高准确率的语音识别和语音合成功能,满足不同用户的需求。这一功能将为用户提供更自然、更直观的交流体验。

    图像输入:用图像与ChatGPT互动

    使用图像输入功能时,用户可以拍摄自己感兴趣的事物,并上传到ChatGPT中。图像功能支持多张图像处理和多模态的交互体验,大大提高了交互效率,帮助任务达成。ChatGPT会尝试识别用户想要询问的内容,并给出相应的回答。用户还可以使用应用中的绘图工具来帮助表达自己的问题,或者配合语音或文本输入来进行交流。

    目前,网友总结出了GPT-4V的视觉能力包括以下几点:

    1. 物体检测: GPT-4V 可以检测和识别图像中的常见物体,如汽车、动物、家居用品等。
    2. 文本识别: GPT-4V 具有光学字符识别 (OCR) 功能,可以检测图像中的打印或手写文本并将其转录为机器可读文本。
    3. 人脸识别: GPT-4V 可以定位并识别图像中的人脸。它具有一定的能力,可以根据面部特征识别性别、年龄和种族属性。
    4. 验证码解决: 在解决基于文本和图像的验证码时,GPT-4V 显示出了视觉推理能力。这表明模型具有高级解谜能力。
    5. 地理定位: GPT-4V 具有识别风景图像中描绘的城市或地理位置的能力,这证明模型吸收了关于现实世界的知识,但这也隐含了隐私泄露的风险。
    6. 复杂图像: GPT-4V 难以准确解释复杂的科学图表、医学扫描或具有多个重叠文本组件的图像。

    这些视觉能力的加入使ChatGPT 4V成为了一个真正多模态的模型,不仅可以理解文字和语音,还能够理解图像,这为各种应用场景提供了无限可能性。

    ChatGPT 4V的用途

    ChatGPT 4V的升级不仅仅是为了增加花样,更是为了满足广泛的应用需求。以下是一些ChatGPT 4V可能被广泛应用的领域:

    1. 个人助手: 用户可以通过语音与ChatGPT 4V进行对话,让它帮助他们完成日常任务,如提醒事项、计算、答疑解惑等。

    2. 教育: ChatGPT 4V可以成为个性化的学习伙伴,帮助学生回答问题、解释概念,并提供教育资源建议。

    3. 医疗: 在医疗领域,ChatGPT 4V可以协助医生识别图像中的病变,解释医学报告,并回答患者的健康咨询。

    4. 客户支持: 企业可以利用ChatGPT 4V的语音和图像能力改进客户支持服务,更快速、更精准地响应客户的问题。

    5. 创作和设计: 创作者和设计师可以使用图像输入功能与ChatGPT 4V合作,获取灵感、进行设计评估和创作指导。

    如何使用ChatGPT 4V

    使用ChatGPT 4V非常简单。你可以通过OpenAI的平台或API接口与它互动。对于语音输入,只需点击录音按钮,说出你的问题,ChatGPT 4V将在瞬间回应你。对于图像输入,你可以上传图片或使用绘图工具,ChatGPT 4V将分析图像并提供答案。这种直观而自然的交互方式将改变我们与AI的互动方式。

    结论

    ChatGPT 4V的发布代表着自然语言处理领域的一次重大突破,它不仅仅是一个“聊天”模型,更是一个具备多模态能力的智能助手。语音输入和图像输入的加入,使ChatGPT 4V更贴近人类的交流方式,为各个领域带来了无限的创新可能性。无论是个人用户还是企业,都可以从中受益,将其应用于日常生活和工作中。ChatGPT 4V的发布,让我们看到了人工智能技术不断演进的方向,未来将会有更多令人惊喜的发展。

  • 如何使用GPT-3.5 Turbo进行自定义Fine-tuning

    嗨,大家好,我是王大神。作为一名AI技术博主,我一直关注着最新的人工智能技术,尤其是OpenAI的GPT系列模型。今天,我将与大家分享如何使用GPT-3.5 Turbo进行自定义Fine-tuning,以便训练出符合特定需求的AI模型。

    Fine-tuning是一种强大的技术,它可以让我们根据自己的数据和任务来定制GPT-3.5 Turbo模型,使其能够更好地适应特定应用领域。在本教程中,我将以实际案例为例,演示如何使用食谱数据集进行Fine-tuning,以创建一个食谱信息提取模型。

    步骤一:准备工作

    在开始Fine-tuning之前,我们需要完成一些准备工作。首先,确保你的Python包安装最新版本的OpenAI。你可以使用以下命令来安装:

    !pip install --upgrade openai

    接下来,我们需要导入所需的库和设置OpenAI API密钥:

    import json
    import openai
    import os
    import pandas as pd
    from pprint import pprint
    
    OPENAI_API_KEY = os.getenv("OPENAI_API_KEY", "")

    步骤二:数据准备

    Fine-tuning的成功与否很大程度上取决于数据的质量和准备工作。在本例中,我们将使用食谱数据集进行Fine-tuning,这个数据集包含了各种食谱以及每个食谱中提取出的通用食材列表,适用于命名实体识别(NER)任务。

    2.1 数据集加载

    首先,我们需要加载我们要使用的数据集,并确保它足够专注于模型学习,同时也足够通用,以便不会错过未见过的示例。在这个例子中,我们从RecipesNLG数据集中提取了一个子集,只包含来自www.cookbooks.com的文档。

    # 读取我们要使用的数据集,这将是RecipesNLG数据集,我们已经清理过,只包含来自www.cookbooks.com的文档
    recipe_df = pd.read_csv("data/cookbook_recipes_nlg_10k.csv")
    
    recipe_df.head()

    这个数据集的前几行看起来像这样:

    title ingredients directions link source NER
    No-Bake Nut Cookies ["1 c. firmly packed brown sugar", … ["In a heavy 2-quart saucepan, mix brown sugar…", … www.cookbooks.com/Recipe-Details.aspx?id=44874 www.cookbooks.com ["brown sugar", "milk", "vanilla", "nuts", …
    Jewell Ball’S Chicken ["1 small jar chipped beef, cut up", … ["Place chipped beef on bottom of baking dish….", … www.cookbooks.com/Recipe-Details.aspx?id=699419 www.cookbooks.com ["beef", "chicken breasts", "cream of mushroom…
    Creamy Corn ["2 (16 oz.) pkg. frozen corn", … ["In a slow cooker, combine all ingredients. C…", … www.cookbooks.com/Recipe-Details.aspx?id=10570 www.cookbooks.com ["frozen corn", "cream cheese", "butter", …
    Chicken Funny ["1 large whole chicken", … ["Boil and debone chicken.", "Put bite size pi…", … www.cookbooks.com/Recipe-Details.aspx?id=897570 www.cookbooks.com ["chicken", "chicken gravy", "cream of mushroo…
    Reeses Cups(Candy) ["1 c. peanut butter", … ["Combine first four ingredients and press in …", … www.cookbooks.com/Recipe-Details.aspx?id=659239 www.cookbooks.com ["peanut butter", "graham cracker crumbs", "bu…

    2.2 数据准备

    在Fine-tuning过程中,我们需要将数据准备成适合模型的格式。对于ChatCompletion格式的Fine-tuning,每个训练示例都是一个简单的消息列表。示例中包含以下角色的消息:系统消息、用户消息和助手消息。在我们的例子中,用户消息包括食谱的标题和食材信息,而助手消息包括提取出的通用食材列表。

    以下是一个示例训练示例的格式:

    [
        {
            "role": "system",
            "content": "You are a helpful recipe assistant. You are to extract the generic ingredients from each of the recipes provided."
        },
        {
            "role": "user",
            "content": "Title: No-Bake Nut Cookies\n\nIngredients: [\"1 c. firmly packed brown sugar\", \"1/2 c. evaporated milk\", \"1/2 tsp. vanilla\", ...]\n\nGeneric ingredients: "
        },
        {
            "role": "assistant",
            "content": "[\"brown sugar\", \"milk\", \"vanilla\", ...]"
        }
    ]

    我们可以使用以下代码来准备训练数据:

    training_data = []
    
    system_message = "You are a helpful recipe assistant. You are to extract the generic ingredients from each of the recipes provided."
    
    def create_user_message(row):
        return f"""Title: {row['title']}\n\nIngredients: {row['ingredients']}\n\nGeneric ingredients: """
    
    def prepare_example_conversation(row):
        messages = []
        messages.append({"role": "system", "content": system_message})
    
        user_message = create_user_message(row)
        messages.append({"role": "user", "content": user_message})
    
        messages.append({"role": "assistant", "content": row["NER"]})
    
        return {"messages": messages}
    
    for _, row in recipe_df.iterrows():
        training_data.append(prepare_example_conversation(row))
    
    # 将数据保存到文件中
    with open("fine_tuning_data.jsonl", "w") as outfile:
        for example in training_data:
            outfile.write(json.dumps(example) + "\n")

    现在,我们已经准备好了Fine-tuning所需的训练数据。

    步骤三:Fine-tuning

    接下来,我们将使用准备好的数据集对GPT-3.5 Turbo进行Fine-tuning。在进行Fine-tuning之前,请确保你有足够的计算资源和时间,因为Fine-tuning可能需要一些时间。

    import openai
    
    # 定义Fine-tuning的训练参数
    fine_tuning_params = {
        "model": "text-davinci-003",
        "checkpoint": "latest",  # 或者选择一个特定的checkpoint
        "dataset": {
            "path": "fine_tuning_data.jsonl",
            "split": 0.8,  # 数据集分割为训练和验证集
        },
        "max_steps": 10000,  # 训练的最大步数
        "save_checkpoint_every": 1000,  # 每隔多少步保存一个checkpoint
        "overwrite": True,  # 如果已经存在同名的模型,是否覆盖
    }
    
    # 开始Fine-tuning
    response = openai.ChatCompletion.create(**fine_tuning_params)
    pprint(response)

    Fine-tuning的时间长度取决于所选参数和模型的大小,但一旦完成,你就会获得一个定制的模型,可以用于特定任务。

    步骤四:使用Fine-tuned模型

    一旦Fine-tuning完成,你就可以使用新的Fine-tuned模型来执行特定任务。在我们的示例中,我们可以使用模型来提取食谱中的通用食材列表。

    def extract_generic_ingredients(title, ingredients):
        prompt = f"Title: {title}\n\nIngredients: {ingredients}\n\nGeneric ingredients: "
        response = openai.ChatCompletion.create(
            model="your-fine-tuned-model-name",  # 使用你的Fine-tuned模型名字
            messages=[
                {"role": "system", "content": "You are a helpful recipe assistant. You are to extract the generic ingredients from this recipe."},
                {"role": "user", "content": prompt},
            ],
        )
    
        assistant_response = response['choices'][0]['message']['content']
        return assistant_response
    
    # 示例:提取通用食材列表
    recipe_title = "No-Bake Nut Cookies"
    recipe_ingredients = ["1 c. firmly packed brown sugar", "1/2 c. evaporated milk", "1/2 tsp. vanilla", ...]
    
    generic_ingredients = extract_generic_ingredients(recipe_title, recipe_ingredients)
    print("Generic ingredients:", generic_ingredients)

    这样,你就可以使用Fine-tuned模型执行特定的任务了。

    结论

    在本文中,我向大家介绍了如何使用GPT-3.5 Turbo进行自定义Fine-tuning,以便训练出符合特定需求的AI模型。通过准备数据、进行Fine-tuning和使用Fine-tuned模型,你可以为各种任务创建定制的AI助手。希望这个教程对你有所帮助,祝你在Fine-tuning旅程中取得成功!

  • 如何使用ChatGPT自动化AWS任务:与S3存储桶互动的示例

    本教程将向您展示如何使用ChatGPT函数来执行与Amazon S3存储桶相关的任务的示例。这篇教程涵盖了S3存储桶的关键功能,包括运行简单的列出命令、在所有存储桶中搜索特定文件、将文件上传到存储桶以及从存储桶下载文件。OpenAI Chat API可以理解用户的指令,生成自然语言响应,并根据用户输入提取适当的函数调用。

    先决条件

    在开始之前,请确保您具备以下条件:

    1. 生成一个具有S3存储桶写入权限的AWS访问密钥,并将它们存储在与OpenAI密钥一起的本地环境文件中。环境文件的格式如下:
    AWS_ACCESS_KEY_ID=<您的密钥>
    AWS_SECRET_ACCESS_KEY=<您的密钥>
    OPENAI_API_KEY=<您的密钥>
    1. 安装所需的Python模块。您可以使用以下命令来安装它们:
    !pip install openai boto3 tenacity python-dotenv

    代码示例

    以下是使用ChatGPT和AWS S3存储桶互动的示例代码。

    import openai
    import json
    import boto3
    import os
    import datetime
    from urllib.request import urlretrieve
    from dotenv import load_dotenv
    
    # 从.env文件加载环境变量
    load_dotenv()
    
    # 设置OpenAI API密钥
    openai.api_key = os.environ.get("OPENAI_API_KEY")
    GPT_MODEL = "gpt-3.5-turbo"
    
    # 创建S3客户端
    s3_client = boto3.client('s3')
    
    # 定义函数字典,以便为GPT模型提供S3操作的详细信息
    functions = [
        # 列出所有可用的S3存储桶
        {
            "name": "list_buckets",
            "description": "列出所有可用的S3存储桶",
            "parameters": {
                "type": "object",
                "properties": {}
            }
        },
        # 列出给定S3存储桶内的对象或文件
        {
            "name": "list_objects",
            "description": "列出给定S3存储桶内的对象或文件",
            "parameters": {
                "type": "object",
                "properties": {
                    "bucket": {"type": "string", "description": "S3存储桶的名称"},
                    "prefix": {"type": "string", "description": "S3存储桶中的文件夹路径"},
                },
                "required": ["bucket"],
            },
        },
        # 从S3存储桶中下载特定文件到本地目标文件夹
        {
            "name": "download_file",
            "description": "从S3存储桶中下载特定文件到本地目标文件夹",
            "parameters": {
                "type": "object",
                "properties": {
                    "bucket": {"type": "string", "description": "S3存储桶的名称"},
                    "key": {"type": "string", "description": "S3存储桶中文件的路径"},
                    "directory": {"type": "string", "description": "本地目标目录,由用户指定。"},
                },
                "required": ["bucket", "key", "directory"],
            }
        },
        # 将文件上传到S3存储桶
        {
            "name": "upload_file",
            "description": "将文件上传到S3存储桶",
            "parameters": {
                "type": "object",
                "properties": {
                    "source": {"type": "string", "description": "本地源文件路径或远程URL"},
                    "bucket": {"type": "string", "description": "S3存储桶的名称"},
                    "key": {"type": "string", "description": "S3存储桶中文件的路径"},
                    "is_remote_url": {"type": "boolean", "description": "提供的源是否为URL(True)还是本地路径(False)"},
                },
                "required": ["source", "bucket", "key", "is_remote_url"],
            }
        },
        # 在S3存储桶内搜索特定文件名
        {
            "name": "search_s3_objects",
            "description": "在S3存储桶内搜索特定文件名",
            "parameters": {
                "type": "object",
                "properties": {
                    "search_name": {"type": "string", "description": "要搜索的文件名"},
                    "bucket": {"type": "string", "description": "S3存储桶的名称"},
                    "prefix": {"type": "string", "description": "S3存储桶中的文件夹路径"},
                    "exact_match": {"type": "boolean", "description": "如果搜索应匹配完整文件名,请将exact_match设置为True。将exact_match设置为False以比较文件名字符串的一部分(文件包含)"}
                },
                "required": ["search_name"],
            },
        }
    ]
    
    # 创建用于将S3操作与函数连接的辅助函数
    
    def datetime_converter(obj):
        if isinstance(obj, datetime.datetime):
            return obj.isoformat()
        raise TypeError(f"Object of type {obj.__class__.__name__} is not JSON serializable")
    
    def list_buckets():
        response = s3_client.list_buckets()
        return json.dumps(response['Buckets'], default=datetime_converter)
    
    def list_objects(bucket, prefix=''):
        response = s3_client.list_objects_v2(Bucket=bucket, Prefix=prefix)
        return json.dumps(response.get('Contents', []), default=datetime_converter)
    
    def download_file(bucket, key, directory):
    
        filename = os.path.basename(key)
    
        # 解析目标,得到正确的文件路径
        destination = os.path.join(directory, filename)
    
        s3_client.download_file(bucket, key, destination)
        return json.dumps({"status": "success", "bucket": bucket, "key": key, "destination": destination})
    
    def upload_file(source, bucket, key, is_remote_url=False):
        if is_remote_url:
            file_name = os.path.basename(source)
            urlretrieve(source, file_name)
            source = file_name
    
        s3
    
    _client.upload_file(source, bucket, key)
        return json.dumps({"status": "success", "source": source, "bucket": bucket, "key": key})
    
    def search_s3_objects(search_name, bucket=None, prefix='', exact_match=True):
        search_name = search_name.lower()
    
        if bucket is None:
            buckets_response = json.loads(list_buckets())
            buckets = [bucket_info["Name"] for bucket_info in buckets_response]
        else:
            buckets = [bucket]
    
        results = []
    
        for bucket_name in buckets:
            objects_response = json.loads(list_objects(bucket_name, prefix))
            if exact_match:
                bucket_results = [obj for obj in objects_response if search_name == obj['Key'].lower()]
            else:
                bucket_results = [obj for obj in objects_response if search_name in obj['Key'].lower()]
    
            if bucket_results:
                results.extend([{"Bucket": bucket_name, "Object": obj} for obj in bucket_results])
    
        return json.dumps(results)
    
    # 连接名称和函数以供执行
    available_functions = {
        "list_buckets": list_buckets,
        "list_objects": list_objects,
        "download_file": download_file,
        "upload_file": upload_file,
        "search_s3_objects": search_s3_objects
    }
    
    # ChatGPT函数调用
    def chat_completion_request(messages, functions=None, function_call='auto', 
                                model_name=GPT_MODEL):
    
        if functions is not None:
            return openai.ChatCompletion.create(
                model=model_name,
                messages=messages,
                functions=functions,
                function_call=function_call)
        else:
            return openai.ChatCompletion.create(
                model=model_name,
                messages=messages)
    
    # 主要对话函数
    def run_conversation(user_input, topic="S3 bucket functions.", is_log=False):
    
        system_message=f"不要假设要插入函数的值。如果用户请求不明确,请请求澄清。如果用户要求与{topic}无关的问题,请告诉他您的范围是{topic}。"
    
        messages = [{"role": "system", "content": system_message},
                    {"role": "user", "content": user_input}]
    
        # 调用模型以获取响应
        response = chat_completion_request(messages, functions=functions)
        response_message = response['choices'][0]['message']
    
        if is_log:
            print(response['choices'])
    
        # 检查GPT是否想要调用函数
        if response_message.get("function_call"):
            function_name = response_message['function_call']['name']
            function_args = json.loads(response_message['function_call']['arguments'])
    
            # 调用函数
            function_response = available_functions[function_name](**function_args)
    
            # 将响应添加到对话中
            messages.append(response_message)
            messages.append({
                "role": "function",
                "name": function_name,
                "content": function_response,
            })
    
            # 再次调用模型以总结结果
            second_response = chat_completion_request(messages)
            final_message = second_response['choices'][0]['message']['content']
        else:
            final_message = response_message['content']
    
        return final_message
    
    # 测试S3存储桶助手
    # 列出和搜索
    print(run_conversation('列出我的S3存储桶'))
    
    search_file = '<文件名>'
    print(run_conversation(f'在所有存储桶中搜索文件{search_file}'))
    
    search_word = '<文件名部分>'
    bucket_name = '<存储桶名称>'
    print(run_conversation(f'在{bucket_name}中搜索包含{search_word}的文件'))
    
    # 检查模型是否会拒绝无关的任务
    print(run_conversation('今天天气如何'))
    
    # 下载文件
    search_file = '<文件名>'
    bucket_name = '<存储桶名称>'
    local_directory = '<本地目录路径>'
    print(run_conversation(f'从{bucket_name}存储桶中下载{search_file}到{local_directory}目录'))
    
    # 上传文件
    local_file = '<文件名>'
    bucket_name = '<存储桶名称>'
    print(run_conversation(f'将{local_file}上传到{bucket_name}存储桶'))

    结论

    通过本教程,您已经学会了如何使用ChatGPT自动化AWS S3存储桶任务。这个互动的示例展示了如何连接ChatGPT的自然语言处理能力和AWS S3存储桶的功能,以执行列出、搜索、下载和上传文件等操作。这种自动化可以节省大量时间,提高工作效率。

  • 如何使用Neon Serverless Postgres构建OpenAI矢量数据库

    随着人工智能和深度学习技术的迅猛发展,矢量数据在数据科学和应用领域中扮演着越来越重要的角色。从自然语言处理到图像识别,矢量数据是我们理解和处理各种信息的关键。然而,有效地存储和查询矢量数据一直是一个挑战,特别是在云计算环境中。在本教程中,我们将介绍如何使用Neon Serverless Postgres构建OpenAI矢量数据库,以便存储和查询OpenAI生成的嵌入向量。

    准备工作

    在开始之前,请确保您具备以下条件:

    1. 一个Neon Postgres数据库。您可以在几个简单的步骤中创建一个带有现成的neondb数据库的帐户并设置项目。有关说明,请参阅注册并创建您的第一个项目。
    2. 您的Neon数据库连接字符串。您可以从Neon仪表板上的连接详细信息小部件中复制它。请参阅从任何应用程序连接。
    3. pgvector扩展。在Neon中运行CREATE EXTENSION vector;来安装扩展。有关说明,请参阅启用pgvector扩展。
    4. 您的OpenAI API密钥。
    5. Python和pip。

    安装所需模块

    这个笔记本需要openai、psycopg2、pandas、wget和python-dotenv模块。您可以使用pip来安装它们:

    !pip install openai psycopg2 pandas wget python-dotenv

    准备您的OpenAI API密钥

    为了生成文档和查询的向量,需要一个OpenAI API密钥。

    如果您没有OpenAI API密钥,请从https://platform.openai.com/account/api-keys获取一个。

    将OpenAI API密钥添加为操作系统环境变量或在会话中提供它。如果您定义了一个环境变量,请将变量命名为OPENAI_API_KEY。

    测试您的OpenAI密钥

    import os
    from getpass import getpass
    
    # 检查是否将OPENAI_API_KEY设置为环境变量
    if os.getenv("OPENAI_API_KEY") is not None:
        print("您的OPENAI_API_KEY已准备就绪")
    else:
        # 如果没有,请提示输入
        api_key = getpass("请输入您的OPENAI_API_KEY: ")
        if api_key:
            print("您的OPENAI_API_KEY现在可用于此会话")
            # 可选地,您可以将其设置为当前会话的环境变量
            os.environ["OPENAI_API_KEY"] = api_key
        else:
            print("您未输入OPENAI_API_KEY")

    连接到您的Neon数据库

    请在下面提供您的Neon数据库连接字符串,或者使用DATABASE_URL变量在.env文件中定义它。有关获取Neon连接字符串的信息,请参阅从任何应用程序连接。

    import os
    import psycopg2
    from dotenv import load_dotenv
    
    # 从.env文件加载环境变量
    load_dotenv()
    
    # 连接字符串可以直接在这里提供。
    # 用您的Neon连接字符串替换下一行。
    connection_string = "postgres://<user>:<password>@<hostname>/<dbname>"
    
    # 如果上面没有直接提供connection_string,
    # 则检查环境或.env中是否设置了DATABASE_URL。
    if not connection_string:
        connection_string = os.environ.get("DATABASE_URL")
    
        # 如果两种方法都没有提供连接字符串,则引发错误。
        if not connection_string:
            raise ValueError("请在代码中或.env文件中提供有效的连接字符串作为DATABASE_URL。")
    
    # 使用连接字符串连接
    connection = psycopg2.connect(connection_string)
    
    # 创建新的游标对象
    cursor = connection.cursor()
    
    # 测试数据库连接
    cursor.execute("SELECT 1;")
    result = cursor.fetchone()
    
    # 检查查询结果
    if result == (1,):
        print("您的数据库连接成功!")
    else:
        print("连接失败。")

    加载数据

    将预先计算的矢量数据加载到名为articles的数据库表中,从.csv文件加载数据。由于有25000条记录,因此预计操作将花费几分钟。

    import io
    
    # 本地CSV文件的路径
    csv_file_path = '../../data/vector_database_wikipedia_articles_embedded.csv'
    
    # 定义一个生成器函数来处理csv文件
    def process_file(file_path):
        with open(file_path, 'r', encoding='utf-8') as file:
            for line in file:
                yield line
    
    # 创建一个StringIO对象来存储修改后的行
    modified_lines = io.StringIO(''.join(list(process_file(csv_file_path))))
    
    # 创建用于copy_expert的COPY命令
    copy_command = '''
    COPY public.articles (id, url, title, content, title_vector, content_vector, vector_id)
    FROM STDIN WITH (FORMAT CSV, HEADER true, DELIMITER ',');
    '''
    
    # 使用copy_expert执行COPY命令
    cursor.copy_expert(copy_command, modified_lines)
    
    # 提交更改
    connection.commit()
    
    # 检查记录数以确保数据已加载。应该有25000条记录。
    count_sql = """select count(*) from public.articles;"""
    cursor.execute(count_sql)
    result = cursor.fetchone()
    print(f"记录数:{result[0]}")

    搜索您的数据

    在将数据存储在Neon数据库中后,您可以查询最近的邻居。

    首先,定义query_neon函数,当运行矢量相似性搜索时,该函数将执行。该函数基于用户的查询创建一个嵌入向量,准备SQL查询,并使用嵌入向量运行SQL查询。您加载到数据库中的预计算嵌入是使用text-embedding-ada-002 OpenAI模型创建的,因此您必须使用相同的模型来创建用于相似性搜索的嵌入。

    提供了一个vector_name参数,允许基于“标题”或“内容”搜索。

    def query_neon(query, collection
    
    _name, vector_name="title_vector", top_k=20):
    
        # 从用户查询创建嵌入向量
        embedded_query = openai.Embedding.create(
            input=query,
            model="text-embedding-ada-002",
        )["data"][0]["embedding"]
    
        # 将嵌入查询转换为PostgreSQL兼容格式
        embedded_query_pg = "[" + ",".join(map(str, embedded_query)) + "]"
    
        # 创建SQL查询
        query_sql = f"""
        SELECT id, url, title, l2_distance({vector_name},'{embedded_query_pg}'::VECTOR(1536)) AS similarity
        FROM {collection_name}
        ORDER BY {vector_name} <-> '{embedded_query_pg}'::VECTOR(1536)
        LIMIT {top_k};
        """
        # 执行查询
        cursor.execute(query_sql)
        results = cursor.fetchall()
    
        return results
    
    # 基于title_vector嵌入运行相似性搜索
    query_results = query_neon("Greek mythology", "Articles")
    for i, result in enumerate(query_results):
        print(f"{i + 1}. {result[2]} (分数: {round(1 - result[3], 3)})")
    
    # 基于content_vector嵌入运行相似性搜索
    query_results = query_neon("Famous battles in Greek history", "Articles", "content_vector")
    for i, result in enumerate(query_results):
        print(f"{i + 1}. {result[2]} (分数: {round(1 - result[3], 3)})")

    结论

    通过使用Neon Serverless Postgres构建OpenAI矢量数据库,您可以有效地存储和查询OpenAI生成的嵌入向量。这为您提供了强大的工具来处理和分析文本数据,从而使您能够更好地理解和利用矢量数据的潜力。

  • 如何利用Neon将Postgres打造成矢量数据库

    随着人工智能和深度学习技术的迅猛发展,矢量数据在数据科学和应用领域中扮演着越来越重要的角色。从自然语言处理到图像识别,矢量数据是我们理解和处理各种信息的关键。然而,有效地存储和查询矢量数据一直是一个挑战,特别是在云计算环境中。在本教程中,我们将介绍一种名为Neon的Serverless Postgres,它是专门为云计算而构建的,支持矢量搜索,使Postgres成为了一种强大的矢量数据库。

    什么是Neon?

    Neon是一款专为云计算设计的Serverless Postgres数据库。它采用了一种先进的架构,将计算和存储分离,为开发者提供了现代化的功能,例如自动扩展、数据库分支、按需扩展等。这些功能使Neon成为了处理矢量数据的理想选择。

    矢量搜索支持

    一个令人兴奋的特性是,Neon支持使用开源的pgvector PostgreSQL扩展进行矢量搜索。这意味着您可以将Postgres作为矢量数据库来存储和查询嵌入式矢量数据。这对于需要处理大规模矢量数据集的应用程序来说是非常有价值的。

    在OpenAI中使用Neon Postgres和pgvector进行语义搜索

    在这个笔记本中,您将学习如何:

    1. 利用OpenAI API创建嵌入向量。
    2. 将这些嵌入向量存储在Neon Serverless Postgres数据库中。
    3. 将原始文本查询转换为嵌入向量,使用OpenAI API。
    4. 利用pgvector扩展和Neon执行矢量相似性搜索。

    这将使您能够构建强大的语义搜索应用程序,用于处理文本或其他嵌入式数据的相似性匹配。

    Neon的扩展支持

    Neon提供了一系列强大的扩展功能,以帮助您扩展和优化您的AI应用程序。以下是其中一些功能:

    自动扩展

    如果您的AI应用程序在某些时段负载较重,或者在不同时间负载不同,Neon可以在不需要手动干预的情况下自动扩展计算资源。在不活动时期,Neon可以缩减到零,从而降低成本。

    即时只读副本

    Neon支持即时只读副本,这些副本是独立的只读计算实例,专为执行与读写计算相同数据的读取操作而设计。通过只读副本,您可以将读取操作从读写计算实例中卸载到专用的只读计算实例上,从而提高AI应用程序的性能。

    Neon无服务器驱动程序

    Neon支持一个低延迟的无服务器PostgreSQL驱动程序,适用于JavaScript和TypeScript应用程序。这使得从无服务器和边缘环境查询数据成为可能,从而实现了低于10毫秒的查询。

    更多示例

    Neon提供了许多示例,帮助您更好地了解如何使用它构建AI应用程序:

    1. 构建AI驱动的语义搜索应用程序:提交一个创业点子,获得YCombinator之前投资的类似点子列表。
    2. 构建AI驱动的聊天机器人:一个将Postgres作为矢量数据库的Postgres问答聊天机器人。
    3. Vercel Postgres pgvector入门:在Vercel Postgres上使用Neon进行矢量相似性搜索。

    其他资源

    除了上述示例之外,您还可以参考以下资源来更深入地了解如何使用Neon构建AI应用程序:

    Neon是构建强大AI应用程序的利器,它将Postgres转变为了一个功能强大的矢量数据库,为处理嵌入式矢量数据提供了无与伦比的便捷性和性能。

    希望这篇教程对您有所帮助,让您更好地了解如何使用Neon和pgvector来构建强大的AI应用程序。如果您有任何问题或需要进一步的帮助,请随时联系我们。