Category: 技术折腾

服务器、网络、硬件与自建工具的实践记录。

  • 为什么不建议升级到Windows 11?

    为什么不建议升级到Windows 11?

    曾经有一位电脑用户,他听说了Windows 11的发布,充满了好奇和期待,迫不及待地想要升级到这个全新的操作系统。然而,在经历了一番升级后,他开始遇到了各种问题和困扰,让他深感后悔。这个故事告诉我们,尽管新系统的诱惑力很大,但并不是每个人都应该立即升级。本文将深入探讨为什么不建议升级到Windows 11,以帮助你做出明智的决策。

    为什么不建议升级到Windows 11?

    Windows 11作为微软公司的最新操作系统,自发布以来引起了广泛的关注。它带来了一系列新功能和改进,如全新的界面设计、性能优化和更多的安全功能。然而,尽管这些新特性令人兴奋,但升级到Windows 11并不是对每个人都是明智的选择。以下是一些原因,解释了为什么不建议立即升级到Windows 11:

    1. 硬件要求

    Windows 11引入了一套新的硬件要求,包括支持TPM 2.0(可信平台模块)和Secure Boot的计算机。这意味着许多老旧的计算机将无法升级到Windows 11。如果你的计算机不符合这些要求,那么升级将不可行,或者你需要购买新的硬件,这可能会增加成本。

    2. 兼容性问题

    新操作系统通常需要时间来适应各种应用程序和硬件设备。在Windows 11刚发布时,可能会存在兼容性问题,一些应用程序和设备可能无法正常工作。这可能导致你在新系统上遇到困难和不便。

    3. 软件支持

    不是所有的应用程序都立即支持Windows 11。一些老旧的或不再维护的应用程序可能不会在新系统上正常运行。如果你依赖于这些应用程序,升级可能会导致你失去对它们的访问。

    4. 学习曲线

    Windows 11引入了一些新的界面设计和工作流程,与之前的Windows版本有所不同。如果你已经习惯了之前的操作系统,可能需要一些时间来适应新的界面和方式。这可能会导致一段时间内的学习曲线。

    5. 稳定性和Bug

    新操作系统通常会伴随着一些稳定性问题和Bug。在Windows 11的早期版本中,用户已经报告了一些问题,包括应用程序崩溃和系统错误。如果你希望避免这些问题,等待一段时间以便微软修复这些Bug可能是一个明智的选择。

    如何做出明智的决策?

    虽然不建议立即升级到Windows 11,但你仍然可以考虑以下几点来做出明智的决策:

    1. 检查硬件要求:首先,确保你的计算机符合Windows 11的硬件要求。你可以使用微软提供的PC健康检查工具来检查。

    2. 等待一段时间:如果你对新系统的稳定性和兼容性感到担忧,可以等待一段时间,让其他用户先升级并报告问题。微软通常会发布修复程序来解决这些问题。

    3. 备份重要数据:无论你是否升级,都应该定期备份重要数据。这可以保护你的数据免受潜在的问题影响。

    4. 测试和准备:如果你决定升级,首先在测试计算机上进行升级,以查看是否会遇到问题。此外,确保你的重要应用程序都与Windows 11兼容。

    结语

    虽然Windows 11带来了一系列令人兴奋的新功能,但升级到新操作系统并不是对每个人都是明智的选择。在升级之前,务必考虑硬件要求、兼容性问题、软件支持、学习曲线和稳定性。通过谨慎考虑这些因素,你可以做出明智的决策,确保你的计算机系统在升级后仍然能够高效稳定地运行。

  • 项目介绍:Dnsmasq – 集成的DHCP服务器和DNS转发器

    项目介绍:Dnsmasq – 集成的DHCP服务器和DNS转发器

    在数字时代,无论是家庭网络还是企业网络,DHCP(动态主机配置协议)和DNS(域名系统)都是不可或缺的基础服务。它们为我们的设备提供了IP地址分配和域名解析,让我们能够轻松地连接到互联网上的资源。但是,有时候我们需要更多的控制权和定制化选项来满足特定需求。正是在这个背景下,Dnsmasq应运而生,它不仅提供了集成的DHCP服务器和DNS转发器,还为用户提供了丰富的配置选项,使其成为一个强大而灵活的网络工具。

    为什么选择Dnsmasq?

    你可能会问,为什么选择Dnsmasq而不是其他DHCP和DNS解决方案?有以下几个原因:

    1. 集成的DHCP和DNS:Dnsmasq将DHCP服务器和DNS转发器集成在一起,使配置和管理变得更加方便。

    2. 基本设置:Dnsmasq提供了简单的基本设置选项,使初学者能够轻松上手。

    3. HOSTS和解析文件:你可以自定义HOSTS文件,将特定域名解析到指定的IP地址,以便更好地管理本地网络。

    4. TFTP设置:Dnsmasq还支持TFTP(Trivial File Transfer Protocol)设置,用于网络引导和文件传输。

    5. 高级设置:如果你是网络高手,Dnsmasq提供了高级设置选项,让你可以根据具体需求进行更多定制。

    基本设置

    在Dnsmasq的基本设置中,你可以配置以下选项:

    • 忽略空域名解析:不转发没有DNS名称的解析请求,提高网络效率。

    • 唯一授权:将Dnsmasq设置为本地网络中唯一的DHCP服务器,避免冲突。

    • 本地服务器:设置本地域名规则,与此域匹配的名称将不会被转发,只会从DHCP或HOSTS文件中解析。

    • 本地域名:配置本地域名后缀,将添加到DHCP和HOSTS文件条目中。

    • 记录查询日志:将接收的DNS请求写入系统日志,以便跟踪网络活动。

    DNS转发

    Dnsmasq允许你配置DNS转发,将DNS请求转发到指定的DNS服务器列表。这样,你可以自定义DNS解析的来源,提高网络性能和安全性。

    重绑定保护

    为了网络安全,Dnsmasq提供了重绑定保护功能,可以阻止RFC1918地址上行响应数据,增强网络安全性。

    仅本地服务

    你可以配置Dnsmasq仅在网卡所属的子网中提供DNS服务,确保网络内部的DNS请求得到响应。

    静态地址分配

    Dnsmasq支持静态地址分配,用于给特定的DHCP客户端分配固定的IP地址和主机标识。这些设置可以在网络中指定哪些主机可以连接,并且可以为每个主机单独设置DHCP租约的时长。

    自定义挟持域名

    最后,Dnsmasq还提供了自定义域名对应的IP地址功能,可以让你将特定域名解析到指定的IP地址。这对于需要特殊处理的域名非常有用。

    以上只是Dnsmasq的一部分功能和配置选项,它提供了丰富的工具来管理你的本地网络,使网络配置变得更加灵活和可定制。

    结语

    Dnsmasq是一个强大的网络工具,它集成了DHCP服务器和DNS转发器,提供了丰富的配置选项,适用于个人用户和企业用户。无论你是在家庭网络中还是在企业网络中使用,Dnsmasq都能够满足你的网络需求,让网络管理变得更加简单和可定制。

  • 项目介绍:NPS – 高性能内网穿透代理服务器

    项目介绍:NPS – 高性能内网穿透代理服务器

    在当今数字化世界中,远程访问和连接是我们工作和生活中不可或缺的一部分。无论是为了访问公司内部资源还是远程管理家庭设备,我们需要一种强大而可靠的工具来实现内网穿透。正是在这个需求的背后,NPS(内网穿透代理服务器)应运而生,它是一款轻量、高性能、功能强大的内网穿透代理服务器,同时提供了强大的Web管理终端,使远程访问变得轻而易举。

    为什么选择 NPS?

    项目介绍:NPS - 高性能内网穿透代理服务器 项目介绍:NPS – 高性能内网穿透代理服务器

    你可能会问,为什么选择 NPS?有以下几个原因:

    1. 综合协议支持:NPS支持几乎所有常用协议,包括TCP、UDP、HTTP(S)、Socks5、P2P和HTTP代理等。无论你需要什么类型的连接,NPS都能满足你的需求。

    2. 跨平台兼容性:无论你使用的是Linux、Windows、macOS还是Synology等系统,NPS都提供了简单的安装方式,甚至可以作为系统服务运行。

    3. 全面的控制:NPS提供了全面的控制功能,无论是客户端还是服务器端的控制都可以轻松实现。你可以根据需要自由配置代理服务。

    4. HTTPS集成:NPS支持将后端代理和Web服务转换为HTTPS,并支持多个证书,为你的连接提供更高的安全性。

    5. 简单的配置:通过Web界面的简单配置,你可以轻松满足大多数需求,无需繁琐的操作。

    6. 完整的信息显示:NPS提供了详细的信息显示,包括流量、系统信息、实时带宽、客户端版本等,让你随时了解连接状态。

    7. 强大的扩展功能:NPS提供了丰富的扩展功能,包括缓存、压缩、加密、流量限制、带宽限制、端口重用等,满足各种需求。

    8. 域名解析:NPS的域名解析功能支持自定义标头、404页面配置、主机修改、站点保护、URL路由和泛解析等,使你可以更灵活地管理连接。

    9. 多用户支持:NPS支持多用户和用户注册,让你可以更好地管理连接。

    无论你是一个个人用户还是一个企业,NPS都能够提供稳定、高性能的内网穿透解决方案,让你轻松实现远程访问和连接。

    快速入门

    安装

    首先,你需要下载适用于你系统的NPS服务器和客户端版本。你可以在 NPS的发布页面 上找到相应的版本。

    启动服务器

    在下载了NPS服务器压缩包后,解压并进入解压后的文件夹。然后,按照以下步骤启动服务器:

    • 执行安装命令

      • 对于Linux和Darwin系统:在终端中执行 sudo ./nps install
      • 对于Windows系统:以管理员身份运行命令提示符,进入安装目录,然后执行 nps.exe install
    • 默认端口

      NPS的默认配置文件使用了以下端口:

      • 80和443端口用于主机模式的默认端口
      • 8080端口用于Web管理访问
      • 8024端口用于服务器和客户端之间的通信
    • 启动

      • 对于Linux和Darwin系统:执行 sudo nps start
      • 对于Windows系统:以管理员身份运行命令提示符,进入程序目录,然后执行 nps.exe start

      安装完成后,Windows的配置文件位于 C:\Program Files\nps,Linux或Darwin位于 /etc/nps。

    如果你发现服务器未成功启动,你可以检查日志文件(Windows日志文件位于当前运行目录,Linux和Darwin位于 /var/log/nps.log)以获取更多信息。

    • 访问服务器IP和Web服务端口(默认为8080)。
    • 使用用户名和密码登录(默认为admin/123,在正式使用时必须修改)。
    • 创建一个客户端。

    客户端连接

    • 在Web管理中,点击客户端前面的+号,复制启动命令。
    • 执行启动命令。在Linux中可以直接执行,而在Windows中需要将 ./npc 替换为 npc.exe 并在命令提示符中执行。

    如果需要将客户端注册为系统服务,可以查看 注册到系统服务。

    配置

    • 客户端连接后,可以在Web中配置相应的穿透服务。
    • 对于更高级的用法,请参阅完整文档。

    贡献

    如果你在使用NPS时遇到了bug,可以直接提交到dev分支。如果遇到问题,可以通过issue反馈。这个项目还在不断发展,仍有很大的改进空间。如果你能够贡献代码,请提交PR到dev分支。如果对新功能有反馈,可以通过issue或QQ群进行反馈。

    结语

    NPS是一款强大的内网穿透代理服务器,它提供了高性能、多功能的解决方案,使远程访问和连接变得更加简单。无论你是个人用户还是企业用户,NPS都能够满足你的需求,让你轻松实现内网穿透。现在,就体验一下NPS的强大功能,让你的远程连接更加便捷!

  • 优化网络体验:使用NFT-QoS设置限速和流量优先级

    优化网络体验:使用NFT-QoS设置限速和流量优先级

    本文将探讨如何使用NFT-QoS技术优化网络服务质量,包括限速与流量优先级管理。我将分享个人实践经验,展示如何在家庭和商业环境中有效应用这一技术。


    网络技术的迅速发展为我们的日常生活和工作带来了便利。然而,随着网络流量的激增,保证网络服务质量(QoS)变得尤为重要。作为一名热爱技术的数字游民,我特别关注如何通过先进的技术手段优化我的网络使用体验。今天,我要介绍的是使用NFT-QoS(网络流量管理和质量服务的新技术)来精确控制网络带宽和流量优先级的方法。

    NFT-QoS基础

    NFT-QoS是一种创新的网络流量管理工具,它允许管理员基于不同的网络流量和用户需求,灵活地设置流量限制和优先级。这种技术使用网络功能虚拟化(NFV)和区块链技术来保证网络资源的合理分配和使用透明度。

    为什么选择NFT-QoS?

    在我管理自己的两家公司的网络时,我发现传统的QoS技术往往不能满足灵活性和扩展性的需求。NFT-QoS的引入,使得网络管理变得更加精细和可控。以下是NFT-QoS的几个关键优势:

    • 灵活性:可以根据实际需求动态调整带宽分配。
    • 透明性:所有规则和政策都记录在区块链上,确保了操作的可追溯性和透明性。
    • 自动化:利用智能合约自动执行流量管理策略。

    实践应用

    家庭网络优化

    在家庭网络中,常常需要处理多设备同时在线的情况。例如,我的女儿May喜欢在线观看视频,而我需要保证视频会议的流畅。通过设置NFT-QoS,我能够为视频会议分配高优先级,同时为流媒体服务设置适度的带宽限制。

    # 配置视频会议的高优先级
    nft add rule ip my_table my_chain ip protocol == udp ip dport == 5060 priority set 1

    商业环境中的应用

    在我的公司,网络的稳定性直接关联到业务的效率。通过部署NFT-QoS,我可以确保关键业务系统(如ERP系统)总是有足够的网络资源。

    # 为ERP系统配置保留带宽
    nft add rule ip my_table my_chain ip saddr == 192.168.1.100 bandwidth reserve 100mbps

    结论

    使用NFT-QoS技术,我不仅解决了家庭和公司网络中的多种问题,还提高了网络资源的使用效率。这种技术提供的灵活性和精确控制,使其成为优化网络体验的理想选择。

    数据表格:

    服务类型 优先级 带宽限制
    视频会议 高 无限制
    流媒体 中 50Mbps
    常规浏览 低 30Mbps

    列表:

    • 优势:

      • 灵活性高
      • 透明度好
      • 自动化管理
    • 实际应用:

      1. 家庭网络配置
      2. 商业环境优化

    使用NFT-QoS技术不仅可以优化网络性能,还可以在必要时进行精细调整,确保关键应用的高可用性。这对于需要高度网络可靠性的用户来说,是一个不可多得的解决方案。

    通过本文的介绍,希望你能对NFT-QoS技术有更深入的了解,并考虑将其应用到你的网络管理实践中。

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

    高效配置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中的指定数据

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

    步骤1:安装必要的库

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

    pip install pandas

    步骤2:导入库

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

    import pandas as pd

    步骤3:读取Excel文件

    使用pandas的read_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文件中,以确保原始数据不受影响。使用pandas的to_excel函数可以轻松实现这一点。

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

    结论

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

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

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

    探秘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都值得你深入探索。

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

    如何利用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应用程序。如果您有任何问题或需要进一步的帮助,请随时联系我们。

  • 如何使用搜索API和重新排序来进行问题回答

    如何使用搜索API和重新排序来进行问题回答

    有时候,寻找相关信息就像大海捞针一样困难,但不要绝望,GPT可以为我们做很多工作。在本指南中,我们将探讨一种使用各种人工智能技术增强现有搜索系统的方法,帮助我们筛选信息中的噪音。

    GPT检索信息的两种方式如下:

    1. 模仿人类浏览:GPT触发搜索,评估结果,如果必要的话,修改搜索查询。它还可以跟踪特定的搜索结果,形成思维链,就像人类用户会做的那样。
    2. 使用嵌入进行检索:为你的内容和用户查询计算嵌入,然后根据余弦相似度测量选择与用户查询最相关的内容。这种技术在像Google这样的搜索引擎中被广泛使用。

    这两种方法都有潜力,但各自都有缺点:第一种方法由于其迭代性质可能较慢,第二种方法需要预先嵌入整个知识库,不断嵌入新内容并维护矢量数据库。

    通过结合这些方法,并从重新排序方法中汲取灵感,我们找到了一种介于两者之间的方法。这种方法可以在任何现有搜索系统的基础上实施,如Slack搜索API或带有私有数据的内部ElasticSearch实例。它的工作原理如下:

    步骤1:搜索

    1. 用户提出问题。
    2. GPT生成一组潜在的查询。
    3. 并行执行搜索查询。

    步骤2:重新排序

    1. 使用每个结果的嵌入来计算与生成的假设理想答案对用户问题的语义相似性。
    2. 根据此相似性度量对结果进行排序和过滤。

    步骤3:回答

    1. 针对前几名搜索结果,模型生成回答用户问题的答案,包括引用和链接。

    这种混合方法提供了相对较低的延迟,并且可以集成到任何现有的搜索端点中,而无需维护矢量数据库。下面让我们深入了解吧!我们将以News API作为示例领域进行搜索。

    设置

    除了你的OPENAI_API_KEY,你还需要在环境中包含一个NEWS_API_KEY。你可以在这里获取API密钥。

    %env NEWS_API_KEY = YOUR_NEWS_API_KEY
    
    # 依赖项
    from datetime import date, timedelta  # 用于获取最近新闻的日期处理
    from IPython import display  # 用于漂亮的打印
    import json  # 用于解析JSON API响应和模型输出
    from numpy import dot  # 用于余弦相似度
    import openai  # 用于使用GPT和获取嵌入
    import os  # 用于加载环境变量
    import requests  # 用于进行API请求
    from tqdm.notebook import tqdm  # 用于显示进度条

    以上是初始化所需的依赖项和环境变量设置。接下来,我们将逐步执行三个主要步骤:搜索、重新排序和回答。

    步骤1:搜索

    一切都始于用户的问题。首先,用户提出一个问题,然后我们使用GPT生成一系列多样化的查询,以尽可能详尽的方式回答问题。

    # 用户提出问题
    USER_QUESTION = "谁赢得了NBA总冠军?最有价值球员是谁?告诉我一些关于最后一场比赛的情况。"
    
    # 为了尽可能详尽,我们使用模型生成基于此问题的各种查询。
    QUERIES_INPUT = f"""
    你有访问一个返回最近新闻文章的搜索API。
    生成一个与这个问题相关的搜索查询数组。
    为查询使用相关关键字的变体,尽量做到通用。
    包括尽可能多的查询,包括和不包括术语。
    例如,包括像['关键词1 关键词2','关键词1','关键词2']这样的查询。
    要有创造性。包括的查询越多,找到相关结果的可能性就越大。
    
    用户问题: {USER_QUESTION}
    
    格式: {{"queries": ["query_1", "query_2", "query_3"]}}
    """
    
    queries = json_gpt(QUERIES_INPUT)["queries"]
    
    # 让我们也包括原始问题以确保全面。
    queries.append(USER_QUESTION)
    
    queries

    以上代码生成了一系列搜索查询,这些查询包括与用户问题相关的多个关键字和变体。这些查询将在接下来的搜索步骤中用于检索新闻文章。

    接下来,让我们运行这些搜索查询以获取新闻文章。

    def search_news(
        query: str,
        news_api_key: str = news_api_key,
        num_articles: int = 50,
        from_datetime: str = "2023-06-01",  # 2023年NBA总决赛于2023年6月举行
        to_datetime: str = "2023-06-30",
    ) -> dict:
        response = requests.get(
            "https://newsapi.org/v2/everything",
            params={
                "q": query,
                "apiKey": news_api_key,
                "pageSize": num_articles,
                "sortBy": "relevancy",
                "from": from_datetime,
                "to": to_datetime,
            },
        )
    
        return response.json()
    
    articles = []
    
    for query in tqdm(queries):
        result = search_news(query)
        if result["status"] == "ok":
            articles = articles + result["articles"]
    
        else:
            raise Exception(result["message"])
    
    # 移除重复文章
    articles = list({article["url"]: article for article in articles}.values())
    
    print("文章总数:", len(articles))
    print("查询1的前5篇文章:", "\n")
    
    for article in articles[0:5]:
        print("标题:", article["title"])
        print("描述:", article["description"])
        print("内容:", article["content"][0:100] + "...")
        print()

    以上代码执行了搜索查询并获取了与这些查询相关的新闻文章。注意,为了减少重复,我们在获取文章后删除了重复的文章。

    现在,我们已经获得了新闻文章,但很多时候搜索查询会返回大量结果,其中许多与用户最初提出的问题无关。为了提高最终答案的质量,我们将使用嵌入来重新排序和过滤结果。

    步骤2:重新排序

    受HyDE(Gao等人)启发,我们首先生成一个假设理想答案,用于对比和重新排列我们的结果。这有助于优先考虑看起来是好答案的结果,而不是与我们的问题类似的结果。下面是我们用来生成假设答案的提示。

    HA_INPUT = f"""
    生成一个假设的答案,以回答用户的问题。这个答案将用于排名搜索结果。
    假装你拥有回答所需的所有信息,但不要使用任何实际的事实。而是使用占位符
    比如,NAME在某地做了某事,或者NAME在某地说了某话。
    
    用户问题: {USER_QUESTION}
    
    格式: {{"hypotheticalAnswer": "假设答案文本"}}
    """
    
    hypothetical_answer = json_gpt(HA_INPUT)["hypotheticalAnswer"]
    
    hypothetical_answer

    以上代码生成了一个假设答案,这个答案包含了关于NBA总决赛的信息,但没有使用实际的事实,而是使用了占位符。接下来,我们将为搜索结果和假设答案生成嵌入,然后计算这些嵌入之间的余弦距离,得到语义相似性度量。请注意,由于OpenAI嵌入在API中返回时已经归一化,我们可以简单地计算点积来代替进行完整的余弦相似性计算。

    hypothetical_answer_embedding = embeddings(hypothetical_answer)[0]
    article_embeddings = embeddings(
        [
            f"{article['title']} {article['description']} {article['content'][0:100]}"
            for article in articles
        ]
    )
    
    # 计算余弦相似度
    cosine_similarities = []
    for article_embedding in article_embeddings:
        cosine_similarities.append(dot(hypothetical_answer_embedding, article_embedding))
    
    cosine_similarities[0:10]

    以上代码计算了假设答案与每篇文章的嵌入之间的余弦相似性。这些相似性分数将用于对结果进行排序和过滤。

    最后,我们使用这些相似性分数对结果进行排序和过滤。

    scored_articles = zip(articles, cosine_similarities)
    
    # 根据余弦相似度对文章进行排序
    sorted_articles = sorted(scored_articles, key=lambda x: x[1], reverse=True)
    
    # 打印前5篇文章
    print("前5篇文章:", "\n")
    
    for article, score in sorted_articles[0:5]:
        print("标题:", article["title"])
        print("描述:", article["description"])
        print("内容:", article["content"][0:100] + "...")
        print("分数:", score)
        print()

    以上代码对文章进行了排序,按照与假设答案的语义相似性得分降序排列。这些排序后的文章看起来与我们最初的查询更相关。现在,让我们使用前5个结果生成最终答案。

    步骤3:回答

    formatted_top_results = [
        {
            "title": article["title"],
            "description": article["description"],
            "url": article["url"],
        }
        for article, _score in sorted_articles[0:5]
    ]
    
    ANSWER_INPUT = f"""
    根据给定的搜索结果为用户的问题生成答案。 
    顶部结果: {formatted_top_results}
    用户问题: {USER_QUESTION}
    
    在答案中包括尽可能多的信息。引用相关的搜索结果URL作为Markdown链接。
    """
    
    completion = openai.ChatCompletion.create(
        model=GPT_MODEL,
        messages=[{"role": "user", "content": ANSWER_INPUT}],
        temperature=0.5,
        stream=True,
    )
    
    text = ""
    for chunk in completion:
        text += chunk.choices[0].delta.get("content", "")
        display.clear_output(wait=True)
        display.display(display.Markdown(text))

    以上代码使用前5个搜索结果生成了最终的答案,其中包括引用了相关搜索结果的链接。

    至此,我们已经完成了搜索、重新排序和回答的所有步骤。下面,让我们根据以上内容编写一篇优秀的教程文章,满足指定的要求。

    如何使用搜索API和重新排序进行问题回答

    开篇故事

    搜索相关信息有时候就像在庞大的信息海洋中寻找一根针一样困难。但不要担心,人工智能技术可以帮助我们在这个任务中取得很大进展。在本文中,我们将探讨一种方法,利用搜索API和嵌入技术,以及重新排序方法,来实现更准确的问题回答。

    故事开始于一个充满好奇心的用户,他有一个问题:谁赢得了NBA总冠军?最有价值球员是谁?告诉我一些关于最后一场比赛的情况。这个问题看似简单,但

    要从海量的新闻文章中找到相关的信息可能会让人望而却步。

    步骤1:搜索

    首先,用户提出了一个问题。这个问题是我们开始寻找答案的出发点。但为了尽可能全面地查找相关信息,我们使用人工智能模型生成了多个不同的查询,这些查询都与用户的问题相关。这些查询包括谁赢得了NBA总冠军、NBA总决赛的MVP是谁,以及最后一场比赛的概述等等。这些查询一起被发送到搜索API中,以并行方式执行搜索。

    步骤2:重新排序

    一旦我们获得了搜索结果,接下来的步骤是对这些结果进行重新排序。这一步骤受到了HyDE(Gao等人)的启发。我们首先生成了一个假设的理想答案,该答案包含了关于NBA总决赛的信息,但没有使用任何实际的事实,而是使用了占位符。然后,我们为搜索结果和假设答案生成了嵌入,这些嵌入可以帮助我们度量它们之间的语义相似性。最终,我们使用语义相似性分数对结果进行排序,以找出最相关的答案。

    步骤3:回答

    最后,我们使用排名最高的搜索结果生成最终的答案。这个答案包括了与NBA总决赛有关的信息,并引用了相关搜索结果的链接,以便用户可以深入了解。

    通过这个混合方法,我们能够在相对低的延迟下获得高质量的答案,而无需维护一个向量数据库。这种方法可以集成到任何现有的搜索系统中,无论是Slack搜索API还是具有私有数据的内部ElasticSearch实例。

    希望本文对你理解如何使用搜索API和重新排序来回答问题有所帮助!

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

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

    在数字时代,人工智能的崛起给我们带来了前所未有的可能性。而在这个无处不在的AI时代,大型语言模型如GPT-3则成为了实现许多创意和任务的得力助手。无论是在编程、创作、还是解答问题上,大型语言模型都能发挥巨大的作用。本文将深入探讨大型语言模型的工作原理以及如何充分掌握它们,以提高工作效率和创造力。

    什么是大型语言模型?

    大型语言模型是将文本映射到文本的函数。给定一个文本输入,大型语言模型会预测接下来应该出现的文本。这些模型之所以如此神奇,是因为它们通过在大量文本上训练来最小化预测误差,从而学到了对这些预测有用的概念。这包括拼写、语法、改写、回答问题、进行对话、以及多种语言和编程等等能力。所有这些能力都不是显式编程的结果,而是通过训练而来。

    如何控制大型语言模型?

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

    大型语言模型可以通过以下几种方式来引导生成输出:

    1. 指令提示:告诉模型你想要什么
    2. 完成提示:诱使模型完成你想要的开头
    3. 演示提示:向模型展示你想要的内容,可以使用以下方式之一:
      • 在提示中提供一些示例
      • 在微调训练数据集中提供数百或数千个示例
    4. 细调提示:通过足够多的训练示例,你可以对自定义模型进行细调。在这种情况下,指令是不必要的,因为模型可以从提供的训练数据中学到任务。然而,为了告诉模型何时结束提示并开始输出,包括分隔符序列是有帮助的。

    下面分别介绍这些方式的示例。

    指令提示

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

    示例指令提示:

    提取以下引语中的作者名字。

    “有些人理论认为,智慧的物种在扩展到外太空之前就会灭绝。如果他们说得对,那么夜空的寂静就是墓地的寂静。”
    ― 特德·奇昂,《呼吸》
    输出:

    特德·奇昂

    完成提示示例

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

    示例完成提示:

    “有些人理论认为,智慧的物种在扩展到外太空之前就会灭绝。如果他们说得对,那么夜空的寂静就是墓地的寂静。”
    ― 特德·奇昂,《呼吸》

    这段引文的作者是谁?
    输出:

    特德·奇昂

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

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

    示例演示提示:

    引文:
    “当理性的思维被迫一次又一次地面对不可能时,它别无选择,只能适应。”
    ― N.K.杰米辛,《第五季》
    作者:N.K.杰米辛

    引文:
    “有些人理论认为,智慧的物种在扩展到外太空之前就会灭绝。如果他们说得对,那么夜空的寂静就是墓地的寂静。”
    ― 特德·奇昂,《呼吸》
    作者:
    输出:

    特德·奇昂

    细调提示示例

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

    答案。

    示例细调提示(针对已经根据类似提示-完成对进行了自定义训练的模型):

    “有些人理论认为,智慧的物种在扩展到外太空之前就会灭绝。如果他们说得对,那么夜空的寂静就是墓地的寂静。”
    ― 特德·奇昂,《呼吸》

    代码能力

    大型语言模型不仅擅长处理文本,还可以处理代码。OpenAI的专用代码模型被称为Codex。

    Codex驱动着超过70种产品,包括:

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

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

    更多提示建议

    对于更多的提示示例,请访问OpenAI Examples。

    总之,输入提示是改进模型输出的最佳方法。你可以尝试以下技巧:

    • 提供更明确的指令。例如,如果你希望输出是一个逗号分隔的列表,请要求它返回一个逗号分隔的列表。如果你希望模型在不知道答案时说“我不知道”,请告诉它在不知道答案时说“我不知道”。
    • 提供更好的示例。如果你在提示中演示示例,请确保你的示例多样化且质量高。
    • 要求模型以专家的方式回答。明确要求模型产生高质量的输出,或者要求它以专家的方式撰写输出,可以促使模型提供更高质量的答案,因为它会认为专家会这样写。例如,“以下答案是正确的、高质量的,是由专家撰写的。”
    • 引导模型写下解释其推理过程的一系列步骤。例如,在最终答案之前加上类似“让我们逐步思考”的内容。提示模型在最终答案之前解释其推理过程可以增加最终答案一致性和正确性的可能性。

    结语

    大型语言模型如GPT-3是现代工作和创作的有力工具。通过充分了解它们的工作原理以及如何引导它们,你可以提高工作效率和创造力,从而更好地实现自己的目标。