为了账号安全,请及时绑定邮箱和手机立即绑定

(txtai 8.0 新功能大揭秘:更智能的问答和更强的模型支持)

查看 Colaboratory 笔记本

txtai 是一个用于语义搜索和LLM编排的一站式嵌入数据库。

8.0版本带来了重大的新功能,即智能代理🚀

代理会自动创建流程来回答复杂的用户请求。代理会反复提示并操作工具,逐步完成一个流程,最终得出答案。

此版本还支持Model2Vec的向量化。

以下是一般的升级声明

虽然所有内容都是向后兼容的,但在升级之前最好先备份一下生产索引数据并测试一下,这样更保险。

安装一下依赖

安装 txtai 及其所有依赖项。

    pip install txtai autoawq model2vec

点击全屏模式, 点击退出全屏

使用txtai的智能代理

最大的变化和之所以这次发布如此重大是增加了代理。以下定义了一个基本的代理。此代理可以访问两个数据库(维基百科和ArXiv)以及网络。根据用户的输入请求,代理会决定使用哪个方法来解决问题。

    从 datetime 模块导入 datetime

    从 txtai 导入 Agent

    wikipedia = {
        "name": "wikipedia",
        "description": "搜索维基百科的数据库",
        "provider": "huggingface-hub",
        "container": "neuml/txtai-wikipedia"
    }

    arxiv = {
        "name": "arxiv",
        "description": "搜索科学论文的数据库",
        "provider": "huggingface-hub",
        "container": "neuml/txtai-arxiv"
    }

    def today() -> str:
        """
        获取今天的日期和时间

        返回:
            当前日期和时间
        """

        return datetime.today().isoformat()

    agent = Agent(
        tools=[today, wikipedia, arxiv, "websearch"],
        llm="hugging-quants/Meta-Llama-3.1-8B-Instruct-AWQ-INT4",
        max_iterations=10,
    )

全屏模式 退出全屏

    agent("波士顿和纽约哪个城市的人口比较多?")

进入全屏 退出全屏

    ======== 新任务 ========
    波士顿和纽约哪个城市的居民人数最多?
    === 代理人思考:
    想法:我将使用工具 'web_search' 来查找这两个城市的人口。
    >>> 调用工具: 'web_search'  参数: {'query': '波士顿和纽约的人口'}
    === 代理人思考:
    想法:网络搜索结果显示波士顿的人口为7948,纽约的人口为653833。但是问题似乎是指波士顿市在纽约州,而不是波士顿市在马萨诸塞州的波士顿市。我将使用工具 'wikipedia' 来查找纽约市的人口。
    >>> 调用工具: 'wikipedia'  参数: {'query': '纽约市的人口'}
    === 代理人思考:
    想法:维基百科的搜索结果显示纽约市的人口约为8804190。但这指的是整个纽约市的人口,而不是纽约市本身。我将使用工具 'wikipedia' 来查找纽约市的人口,而不是纽约州的人口。
    >>> 调用工具: 'wikipedia'  参数: {'query': '纽约市(区)的人口'}
    === 代理人思考:
    想法:维基百科的搜索结果显示纽约市的人口约为8804190,布鲁克林的人口约为2592149。由于布鲁克林是纽约市五个区之一,因此可以认为纽约市的人口约为8804190。但是这仍然是对原问题的不正确回答。我将使用工具 'wikipedia' 来查找马萨诸塞州波士顿市的人口,这是原问题中提到的另一个城市。
    >>> 调用工具: 'wikipedia'  参数: {'query': '马萨诸塞州波士顿市的人口'}
    === 代理人思考:
    想法:维基百科的搜索结果显示马萨诸塞州波士顿市的人口约为675647。这是回答原问题的答案,原问题是确定波士顿和纽约哪个城市的人口更多。因为波士顿的人口远低于纽约市的人口,大约为675647,所以原问题的答案是纽约市。
    >>> 调用工具: 'final_answer'  参数: {'answer': '纽约市'}

全屏 退全屏

纽约

全屏 退出全屏

那不是挺火的吗 🔥?

看看这个智能代理是如何一步步系统地解决这个问题的。这个智能代理进行了一系列搜索来获取它需要的信息,最后得出最终答案。

代理驱动的RAG

标准的检索增强生成(RAG)进行一次向量搜索以获取上下文,并使用该上下文加上输入的问题构建提示语。更为复杂的过程是代理型RAG,它经过多次迭代。它还可以利用多个数据库资源来得出最终答案。

下面的示例展示了如何汇总来自多个来源的信息并构建一份关于特定主题的报告。

    from IPython.display import display, Markdown

    researcher = """
    你是一位撰写关于{topic}论文的研究员。
    寻找与该话题相关的网站、科学论文和维基百科条目。
    用Markdown格式编写一份包含摘要及参考文献(参考文献需包含超链接)的报告。
    """

    display(Markdown(agent(researcher.format(topic='外星生命'))))

全屏模式 退出全屏

    ======== 新任务 ========
    搜索与外星生命相关的网站、科学论文和维基百科。
    撰写一份包含摘要和参考文献(附超链接)的报告。
    请以 Markdown 格式书写文本。

    === 代理思考:
    思考:我将首先搜索与外星生命相关的维基百科文章。
    >>> 调用工具:'wikipedia' 传入参数:{'query': 'Alien life'}
    === 代理思考:
    思考:从维基百科搜索到的结果非常有帮助。我将使用 arxiv 数据库搜索与外星生命相关的科学论文。
    >>> 调用工具:'arxiv' 传入参数:{'query': 'alien life'}
    === 代理思考:
    思考:从 arxiv 数据库搜索到的结果很有趣。我将使用网络搜索工具搜索与外星生命相关的网站。
    >>> 调用工具:'web_search' 传入参数:{'query': 'alien life'}
    === 代理思考:
    思考:现在我已经从维基百科、arxiv 和网络搜索中收集了信息,我将撰写一份包含摘要和参考文献(附超链接)的 Markdown 格式报告。
    >>> 调用工具:'final_answer' 传入参数:{'answer': "## 外星生命:关于寻找地外生命的报告\n\n### 引言\n\n寻找外星生命的科学研究已经持续了几个世纪,科学家和爱好者们正在寻找地球之外生命的迹象。尽管尚未找到确凿的证据,但许多有希望的线索和发现表明,宇宙中可能存在生命。\n\n### 维基百科\n\n根据维基百科,外星生命指的是地球之外的生命。寻找外星生命是研究的一个活跃领域,科学家们使用各种方法寻找生命迹象,例如分析系外行星的大气层和使用天体生物学方法探测生命迹象。\n\n### arxiv\n\narxiv 数据库有许多关于寻找外星生命的论文,包括关于系外行星上可能存在生命的研究以及使用天体生物学探测生命迹象的研究。一篇题为《外星生命和审查制度》的论文讨论了关于宇宙生命理论的发展及其与该理论不兼容的证据审查尝试。\n\n### 网络搜索\n\n搜索外星生命得到了许多结果,包括来自 NASA 和 Live Science 等权威来源的文章。这些文章讨论了寻找外星生命的最新发现,包括系外行星上可能存在生命的可能性以及使用天体生物学方法探测生命迹象。\n\n### 结论\n\n尽管寻找外星生命的研究正在进行中,但许多有希望的线索和发现表明宇宙中可能存在生命。随着科学家们继续寻找生命迹象,我们或许会在未来某一天找到外星生命的证据。\n\n### 参考文献\n\n* [外星生命 - 维基百科](https://en.wikipedia.org/wiki/Extraterrestrial_life)\n* [我们迄今找到的最好的地外生命证据是什么?](https://www.livescience.com/space/extraterrestrial-life/whats-the-best-evidence-weve-found-for-alien-life)\n* [NASA 研究为未来寻找外星生命的任务提供了指导](https://www.nasa.gov/universe/nasa-research-gives-guideline-for-future-alien-life-search/)\n* [詹姆斯·韦伯望远镜在一颗宜居系外行星的大气层中发现可能的外星生命迹象](https://www.livescience.com/space/exoplanets/james-webb-telescope-sees-potential-signs-of-alien-life-in-the-atmosphere-of-a-distant-goldilocks-water-world)\n* [宇宙中的外星生命:科学家认为发现它只是时间问题](https://www.bbc.com/news/science-environment-66950930)\n* [外星生命:2020 年十大惊人发现](https://www.livescience.com/alien-discoveries-2020.html)\n* [科学家如何告诉世界他们发现了外星生命](https://www.scientificamerican.com/article/how-scientists-could-tell-the-world-if-they-find-alien-life/)"}

全屏模式 退出全屏

此处内容省略或为占位符。

…… 或 此处省略内容 (chǔcǐ shěnglüè nèiróng)

外星生命:

寻找外星生命的报告

前言

寻找地外生命的努力已经持续了数个世纪,科学家和爱好者一直在寻找地球之外存在生命的迹象。虽然至今还没有找到确凿的证据,但已有很多有希望的线索和发现表明,宇宙中其他地方可能存在生命。

Wikipedia

根据维基百科,地外生命是指并非起源于地球的生命。寻找地外生命是研究领域中的活跃部分,科学家们采用多种方法探测生命迹象,比如分析系外行星大气和搜寻生物标志。

arXiv 平台。

arXiv数据库中有很多关于寻找地外生物的研究论文,包括研究系外行星上可能存在生命的可能性以及利用天体生物学探测生命迹象的研究。有一篇论文名为《地外生物与审查》,讨论了宇宙生命理论的发展以及试图审查与该理论不符的证据。

网络搜索

搜索外星生命的网络结果众多,其中包括来自NASA(美国国家航空航天局)和《生活科学》等可靠来源的文章。这些文章讨论了寻找外星生命的最新进展,包括系外行星上可能存在生命,以及利用天体生物学寻找生命迹象。

最后

虽然寻找外星生命的研究一直在进行,并且非常活跃,很多有希望的线索和发现表明宇宙其他地方可能存在生命的存在。随着科学家继续寻找生命迹象,我们或许有一天能找到外星生命的证据。

参考文献

让我们来拆解一下刚才发生了什么。Agent 查看了多个来源,并将引用来源汇总成了一份报告。这非常厉害 💪

需要注意的是,根据使用的LLM不同,当Agent尝试正确设置函数参数时可能遇到错误。此示例使用的是Llama 3.1 8B。更强的LLM可能会带来更好的结果。请记住,txtai支持多种LLM框架(Hugging Face、llama.cpp和LiteLLM API),并用中文逗号进行标点调整。

代理团队

代理也能成为工具吗?当然可以的!

接下来,我们将用一个类似的例子,但会使用一个“代理团队”来回答问题。

    从 txtai 导入 Agent, LLM 模型

    # 在多个代理之间共享 LLM 实例
    llm = LLM("hugging-quants/Meta-Llama-3.1-8B-Instruct-AWQ-INT4")

    websearcher = Agent(
        tools=["websearch"],
        llm=llm,
    )

    wikiman = Agent(
        tools=[{
            "name": "wikipedia",
            "description": "搜索维基百科",
            "provider": "huggingface-hub",
            "container": "neuml/txtai-wikipedia"
        }],
        llm=llm,
    )

    researcher = Agent(
        tools=[{
            "name": "arxiv",
            "description": "搜索科学论文数据库",
            "provider": "huggingface-hub",
            "container": "neuml/txtai-arxiv"
        }],
        llm=llm,
    )

    agent = Agent(
        tools=[{
            "name": "websearcher",
            "description": "我能帮你在网上找答案,网络搜索几乎无所不包!",
            "target": websearcher
        }, {
            "name": "wikiman",
            "description": "维基百科有所有答案,我会搜索维基百科并回答问题",
            "target": wikiman
        }, {
            "name": "researcher",
            "description": "我专注于科学研究,通过 arXiv 搜索获取答案。",
            "target": researcher
        }],
        llm=llm,
        max_iterations=10
    )

全屏 全屏退出

    显示Markdown(agent("""
    与您的团队合作,撰写一份关于信号处理基本概念的综合性报告。
    请用Markdown格式编写输出。
    """, maxlength=16000)))

全屏模式 退出全屏

现在给大家看一份关于信号处理基本概念的综合报告:


简介

信号处理中的基本概念包括信号的表示、滤波和频谱分析。信号的表示涉及将信号以数学或计算格式编码,而滤波涉及对信号进行修改以去除不需要的成分。频谱分析则是分析信号的频率内容。

信号表示

信号表示是指将信号编码为数学或计算格式。这可以通过多种技术实现,包括傅里叶分析和小波分析,如傅里叶分析和小波分析。

筛选:

过滤涉及修改信号以去除不需要的部分或成分。这可以通过各种滤波器,如巴特沃斯滤波器、切比雪夫I型滤波器和椭圆滤波器来实现。

光谱分析

光谱分析是指分析信号中的频率成分,这可以通过多种方法实现,比如傅里叶变换、小波变换和奇异谱分析。

应用

巴特沃斯滤波器(Butterworth滤波器)在信号处理和音频处理中被广泛用于噪声抑制和抗混叠等应用。它们也常用于医学信号处理,如过滤心电图(ECG)和脑电图(EEG)信号。

结论

总而言之,信号的表示、滤波和频谱分析是信号处理中的基本概念。巴特沃斯滤波器(Butterworth滤波器)广泛应用于音频处理和医学信号处理等领域。这些应用包括各种领域,如音频处理和医学信号处理。


📚 请参阅上方报告。它运行的逻辑与第一个代理类似,但这次是多个代理一起运行!请注意,为了简洁,这里没有包含代理的日志输出。

服务代理

代理可以通过txtai的应用配置文件中的YAML完全支持。这些服务可以独立运行在Python环境中,或者作为FastAPI服务运行。

# config.yml

agent:
    researcher:
        tools:
            - 网络搜索
            - name: 维基百科
              description: 搜索维基百科
              provider: huggingface-hub
              container: neuml/txtai-wikipedia
            - name: arxiv
              description: 搜索科学论文
              provider: huggingface-hub
              container: neuml/txtai-arxiv

llm:
    path: hugging-quants/Meta-Llama-3.1-8B-Instruct-AWQ-INT4  # 这是LLM模型的路径

全屏打开,全屏关闭

CONFIG=config.yml nohup uvicorn "txtai.api:app" &> api.log &
sleep 90

切换到全屏;退出全屏

    import requests

    requests.post(
        "http://localhost:8000/agent",
        headers={"Content-Type": "application/json"},
        json={"name": "researcher", "text": "请告诉我关于罗马帝国的信息", "maxlength": 160000}
    ).json()

进入全屏 退出全屏

罗马帝国是一个从公元前27年到公元476年存在的庞大而强大的国家,涵盖了欧洲大部分地区、北非和西亚。它由奥古斯都·凯撒建立的,并由一系列皇帝统治,其首都设在罗马。罗马帝国以其令人印象深刻的建筑、工程和管理成就著称,包括道路、桥梁和公共建筑的建设等。它对古代世界的法律体系、治理模式和文化发展产生了深远的影响。

切换到全屏模式 退出全屏

💥 看这!只需一个简单的配置就能搞定全套API服务。

向量化与Model2Vec

虽然代理框架是最主要的更新,还有一个重大更新是支持Model2Vec模型。

Model2Vec 是一种将任何句子编码器变为小巧的静态模型的技术,可以将模型大小减少到原来的1/15,并让模型运行速度提高近500倍,性能略有下降但不明显。

    从txtai导入Embeddings模块

    # 要索引的数据
    data = [
      "美国确诊病例已超过500万例",
      "加拿大最后的完整冰架突然坍塌,形成一个曼哈顿大小的冰山",
      "中国沿海部署了船只,台湾紧张局势加剧",
      "美国国家公园管理局警告,在遇到熊袭击时不要牺牲速度较慢的朋友",
      "缅因州一名男子花25美元买彩票中了一百万美元",
      "轻松日赚高达100,000美元"
    ]

    # 创建embedding
    embeddings = Embeddings(method="model2vec", path="minishlab/M2V_base_output")
    embeddings.index(data)

    uid = embeddings.search("气候变化")[0][0]
    data[uid]

全屏;退出全屏

加拿大最后一个仍然完整的冰架突然断裂,这形成了一座相当于曼哈顿大小的冰山。

点击全屏 点击退出全屏

搞定

这篇文章简要介绍了txtai 8.0的功能。更新的文档和更多示例很快就会发布。还有很多内容可以进一步探讨和分享,还有很多东西等着我们去开发!

点击以下链接了解更多详情。

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消