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

用txtai解析星星知识,构建天文知识图谱

解析星星数据的txtai

txtai 是一个适用于语义搜索、LLM调度和语言模型工作流程的一体化向量数据库。

为了纪念txtai在GitHub上达到10K ⭐的里程碑,这个文章将构建一个关于已知恒星、行星、星系和其他天文实体的天文学知识图谱。它将展示如何从像维基百科这样的公共知识来源中构建一个知识汇总。

虽然代理和检索增强生成(RAG)可以做很多事情,但如果由人类提供我们已经整理好的信息作为支持,它们可以做得更好,甚至更出色。这不仅提高了准确性,而且更快,因为我们不需要等待代理去理解我们已经知道的信息。

让我们跳进去吧。

安装依赖项

安装 txtai 及其所有依赖项。

pip install txtai[graph,pipeline-text] datasets autoawq autoawq-kernels
# 安装这些Python包,包括txtai及其相关扩展,以及datasets和autoawq及其子模块。

进入全屏 退出全屏

建立知识图谱

第一步是构建我们的知识图谱或信息库。我们将使用txtai-wikipedia和另一个源自维基百科的数据集,该数据集包含已知星座中的星星

我们将挑选关于行星、星座、星系和恒星的内容。然后,我们将使用GLiNER管道来提取实体。最后,我们将把这些条目与现有的星座数据整合起来。

下面是一个constellation数据集的示例结构,以便你了解这些数据的样子是怎样的。

以下是对该数据集中每个字段名的描述。正如我们所观察到的,有很多标识符,但它还包括了位置、亮度和离地球的距离等数据。

字段 描述
星座 星座的名称
名称 正式名称
拜耳 拜耳命名
弗拉姆斯蒂德 弗拉姆斯蒂德命名
变星 变星命名
亨利·德雷珀编号 亨利·德雷珀目录编号
Hipparcos 编号 Hipparcos 目录编号
右升经度 J2000.0 历元/赤道的右升经度
赤纬 J2000.0 历元/赤道的赤纬
视星等 视星等(m 或 mv)
绝对星等 绝对星等(Mv)
距离 从地球到该星的距离,单位为光年
光谱分类 星体分类系统中的光谱分类
备注 常用名或替代名;注释;显著特性或特点
导入 Embeddings 从 txtai

embeddings = Embeddings()
# embeddings.load 方法使用了 provider 和 container 参数来指定加载的模型来源
embeddings.load(provider="huggingface-hub", container="neuml/txtai-wikipedia")
    从txtai.pipeline导入实体(Entity)

    entity = Entity("gliner-community/gliner_medium-v2.5")

全屏显示,退出全屏

    from datasets import load_dataset

    def parsefloat(value):
        try:
            return float(value.replace("−", "-")) if value else value
        except ValueError:
            return value

    def parse(star):
        text = star["Name"] if star["Name"] else f'HD-{star["Henry Draper Number"]}'

        output = {"id": star["Name"], "type": "star", "text": text}
        for field, value in star.items():
            field = field.lower().replace(" ", "_")
            output[field] = parsefloat(value)

        return output

    # 按星座划分的恒星数据集
    stars = load_dataset("neuml/constellations", split="train")

切换到全屏模式,退出全屏

前面加载了 txtai-wikipediaGLiNER pipeline 和 constellations 数据集。现在是时候创建知识图了。

    from tqdm.auto import tqdm

    labels = {
        "星座的名字": "星座",
        "星系的名称": "星系",
        "天文中的恒星名称": "恒星",
        "行星的名称": "行星"
    }

    def stream():
        # 使用恒星数据集进行初始化
        rows = {star["Name"]: parse(star) for star in stars}

        # 获取维基百科结果
        results = embeddings.search(
            "SELECT id, text, percentile FROM txtai WHERE similar('科学文章定义星座、星系、恒星或行星的') AND score >= 0.8",
            embeddings.count()
        )

        # 聚合到实体行
        for row in tqdm(results):
            entities = entity(row["text"], labels=list(labels.keys()))
            entities = [(entity, labels[tag]) for entity, tag, score in entities if score >= 0.95 and entity != row["id"]]
            if entities or row["id"] in rows:
                # 收集关系    
                relationships = set()
                for uid, tag in entities:
                    if uid not in rows:
                        rows[uid] = {"id": uid, "type": tag, "text": tag}

                    relationships.add(uid)

                # 添加关系并生成主要记录
                row["relationships"] = list(relationships)

                # 合并现有记录(如果有)并保存
                rows[row["id"]] = {**rows[row["id"]], **row} if row["id"] in rows else row

        yield from rows.values()

    astronomy = Embeddings(
        path = "intfloat/e5-base",
        instructions={"query": "查询:", "data": "段落:"},
        faiss = {"quantize": True, "sample": 0.05},
        content = True,
        graph = {"approximate": True, "topics": {}, "copyattributes": True}
    )
    astronomy.index(stream())
    astronomy.save('txtai-astronomy')

进入全屏 退出 全屏

来探索知识图谱吧

接下来的部分中创建了一个绘制知识图的函数。该函数专门用来处理我们的天文数据。它根据光谱分类为星系、行星和恒星着色。

    import matplotlib.pyplot as plt
    import networkx as nx

    def plot(graph):
        labels = {x: f"{graph.attribute(x, 'id')}" for x in graph.scan()}
        mapping = {
            "constellation": "#f44336", "galaxy": "#9575cd", "planet": "#9e9e9e", "star": "#ff9800",
            "O": "#92b5ff", "B": "#a2c0ff", "A": "#d5e0ff", "F": "#f9f5ff", "G": "#ffede3",
            "K": "#ffdab5", "M": "#ffb56c"
        }

        colors = []
        for x in graph.scan():
            etype, spectral = graph.attribute(x, "type"), graph.attribute(x, "spectral_class")
            if etype == "star":
                etype = spectral[0] if spectral else etype

            colors.append(mapping.get(etype, "#03a9f4"))

        options = {
            "node_size": 700,
            "node_color": colors,
            "edge_color": "#454545",
            "alpha": 1.0,
        }

        # 绘制图形
        fig, ax = plt.subplots(figsize=(20, 9))
        pos = nx.spring_layout(graph.backend, seed=0, k=0.9, iterations=50)
        nx.draw_networkx(graph.backend, pos=pos, with_labels=False, **options)

        # 计算标签位置
        pos = {node: (x, y - 0.1) for node, (x, y) in pos.items()}

        nx.draw_networkx_labels(
            graph.backend, pos, labels=labels, font_color="#efefef", font_size=10
        )

        # 关闭坐标轴并设置边界距离
        ax.axis("off")
        plt.margins(x=0.15)

        # 设置背景颜色
        ax.set_facecolor("#303030")
        fig.set_facecolor("#303030")

        plt.show()

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

现在我们准备好运行查询了。txtai支持向量查询、SQL查询以及使用openCypher的图查询。从txtai 8.3起,查询会根据类型自动路由到相应的索引。

如下所示,路径遍历查询语句从起始节点开始,显示与地球最近的10个关系。

    # 这段代码用于从天文图谱中搜索与仙女座星系相关的前十个最近的星体,并将这些星体的关系以子图形式展示。
    subgraph = astronomy.search("""
    MATCH P=({id: "Andromeda"})-[]->(A)
    WHERE A.distance > 0
    RETURN P 
    ORDER BY A.distance
    LIMIT 10
    """, graph=True)

    # 使用绘图函数展示搜索到的子图
    plot(subgraph)

全屏;退出

如图所示:图片描述

我们还可以找到带有行星的恒星。

    subgraph = astronomy.search("""
    MATCH P=(A {type: "恒星"})-[]->(B {type: "行星"})
    WHERE B.id NOT IN ["Jupiter", "Saturn"]
    RETURN P
    """, graph=True)

    绘制(subgraph)

    for x in subgraph.scan():
        print(subgraph.attribute(x, "id"), subgraph.attribute(x, "text"))

全屏模式,退出全屏

图片描述
点击可查看原图

WASP-21b 行星

WASP-21 是一颗 G 型星(光谱类型 G3V),位于飞马座,距离地球约 850 光年,正接近其主序星寿命的末期。这颗恒星相对贫金属,重元素含量仅为太阳的 40%。从运动学的角度来看,WASP-21 属于银河系的厚盘部分。它拥有一颗名为 WASP-21b 的系外行星。

WASP-13 星(又称 Gloas)是位于 Lynx 星座的一颗恒星。这颗恒星在金属丰度和质量上与太阳相似,但它更热,可能也更老。根据 SIMBAD 数据库,这颗恒星首次被观测记录是在1997年,从2006年开始,SuperWASP 望远镜开始观测这颗恒星,并进行了后续观测。后续观测在2008年发现了名为 Cruinlagh 的行星,相关发现论文于2009年发表。

Gamma Cephei(γ Cephei,简称 Gamma Cep,γ Cep)是一个距离地球约 45 光年的位于北天仙王座的双星系统。主星(编号为 Gamma Cephei A,正式命名为 Errai,即该系统的传统名称)是一颗 K1 型橙色巨星或亚巨星,伴星为编号为 Gamma Cephei B 的红矮星。已经确认有一颗系外行星(编号为 Gamma Cephei Ab,后来命名为 Tadmor)围绕主星运行。

全屏模式 退出全屏

标准的SQL查询也得到支持。让我们看看从地球上看起来最亮的星星。

    [{'id': 'Sirius',
      'text': "天狼星是夜空中最亮的恒星。其名字源自希腊语(拉丁转写:),意为“闪耀”或“炙热”。这颗恒星被命名为大犬座α星,拉丁化为大犬座α星,简称CMa或αCMa。它的视亮度等级为-1.46,几乎是南河二亮度的两倍。天狼星是一颗双星系统,由一颗主序星(光谱型A0或A1)天狼星A和一颗微弱的白矮星(光谱型DA2)天狼星B组成。这两颗星之间的距离变化在8.2到31.5天文单位之间,它们的公转周期为每50年一次。",
      'visual_magnitude': -1.46},
     {'id': 'Canopus',
      'text': '南河二是南十字座中最亮的恒星,也是夜空中第二亮的恒星。它也被命名为南十字α星,拉丁化为Alpha Carinae。它的视亮度等级为-0.74,仅次于天狼星。',
      'visual_magnitude': -0.72},
     {'id': 'Arcturus',
      'text': '大角星是北天牧夫座中最亮的恒星。其视亮度等级为-0.05,它是夜空中第四亮的恒星,也是北半球夜空最亮的恒星。大角星的名字起源于古希腊,1603年由约翰内斯·拜耳编录为牧夫座α星,拉丁化为Alpha Boötis。大角星是春季三角形的一部分。',
      'visual_magnitude': -0.05},
     {'id': 'Vega',
      'text': "织女星是北天小熊座中最亮的恒星。它被命名为天琴座α星,拉丁化为Alpha Lyrae,简称Alpha Lyr或α Lyr。这颗恒星距离太阳约25光年,是太阳附近最亮的恒星之一,也是距离我们最近的亮星之一。它是夜空中第五亮的恒星,也是北半球夜空第二亮的恒星,仅次于大角星。",
      'visual_magnitude': 0.03},
     {'id': 'Capella',
      'text': '五车二是北天室女座中最亮的恒星之一,视亮度等级为0.08,也是夜空中第六亮的恒星。',
      'visual_magnitude': 0.08}]

全屏进入,退出全屏

检索增强生成 (RAG)

接下来,我们将用知识图谱跑一系列RAG查询(或直接使用英文RAG,视上下文而定)。

    from txtai import LLM, RAG

    # 定义提示模板字符串
    template = """
    只使用以下上下文回答以下问题。仅包括具体讨论过的信息。回答问题时不要解释你是如何找到答案的。

    问题: {question}
    上下文: {context}"""

    # 加载LLM
    llm = LLM("hugging-quants/Meta-Llama-3.1-8B-Instruct-AWQ-INT4")

    # 创建RAG流程
    rag = RAG(
        astronomy,  # 假设此处保留英文变量名或上下文中定义了astronomy
        llm, 
        system="你是一个友好的助手。",
        template=template,
        context=10
    )

切换到全屏,切换回正常视图

    print(rag("告诉我关于仙女座星座中的星星以及它们距离地球有多远", maxlength=4096)["answer"])

进入全屏,退出全屏

在文中提到的仙女座中的恒星包括:

1. 奥米克隆仙女座(ο And),也称为奥米克隆-仙女座,一颗蓝白色的B型巨星,距离地球大约692光年。
2. RT仙女座,一颗变星,距离地球大约322光年。
3. 8仙女座,可能是三合星系统,距离地球大约570光年。
4. 64仙女座,一颗深黄色的G型巨星,类似于太阳的类型,距离地球大约419光年。
5. 3仙女座,一颗单星,距离地球大约181光年。
6. 小马座ε星(Epsilon Andromedae),一颗距离太阳大约155光年的恒星。
7. HD 166 或 V439 Andromedae,一颗变星,距离地球大约45光年。
8. 7仙女座,一颗单星,黄色白色,距离地球大约79.6光年。
9. 18仙女座,一颗单星,距离地球大约413光年。
10. 12仙女座,一颗单星,距离地球大约137光年。

这些恒星与地球的距离各不相同,从大约45光年到大约692光年不等。

全屏模式;退出全屏

现在我们来试试Graph RAG查询(Graph Retrieval Augmented Generation)。我们将使用图遍历查询来生成RAG上下文,而不是用向量搜索。

    subgraph = astronomy.search("""
    MATCH P=({id: "Centaurus"})-[]->(B)
    WHERE B.distance > 0
    RETURN P
    ORDER BY B.distance
    LIMIT 10
    """, graph=True)

    plot(subgraph)

    指令 = """
    请按距离地球远近排序,总结并简要描述所讨论的恒星。
    """

    context = [subgraph.attribute(x, "text") for x in subgraph.scan()]
    print(rag(指令, context, maxlength=4096)["answer"])

全屏 退出全屏

图片说明:

以下是对文中提到的一些恒星的简要描述,按照距离地球的远近排序:

1. **比邻星**:距离地球最近的恒星,仅次于太阳,位于4.25光年外。这是一颗小型、低质量的恒星,肉眼看不见。

2. **半人马座阿尔法星(半人马座 Rigil Kentaurus、Toliman 和比邻星)**:距离地球4.25光年的一个三合星系统,包括三颗恒星:半人马座 Rigil Kentaurus、Toliman 和比邻星。

3. **半人马座Iota**:距离地球约51.5光年的一颗恒星,视星等为+2.73,在肉眼下易于观察。

4. **HD 113538(Gliese 496.1)**:一颗距离地球53光年的恒星,带有两颗行星伴星,肉眼下不可见。

5. **HD 101930(Gliese 3683)**:一颗橙色的恒星,距离地球98光年,带有环绕其运转的外行星。它具有相对较大的自行和径向速度。

6. **HD 114386**:一颗拥有两颗环绕其运转的外行星的恒星,距离地球91光年。视星等为8.73,肉眼下不可见,可以借助望远镜或双筒望远镜观察到。

7. **HD 125595**:一颗带有接近海王星大小的伴星的恒星,距离地球92光年,肉眼下不可见。

8. **BPM 37093(V886半人马座)**:一颗距离地球大约光年的变星白矮星,属于DAV或ZZ Ceti类型,具有氢气大气层和大约1.1倍太阳质量的异常高的质量。

进入全屏 退出全屏

代理

注:删除此注释以保持简洁性。

如果需要解释,建议在“代理”后面加括号说明,例如“# 代理(基于代理的操作)”。

我们最后的一个例子是一个代理,它搜索天文学知识图谱。

    从txtai导入Agent类

    def search(query):
        """
        搜索天文数据数据库。

        请仅使用字符串作为输入,不要使用JSON格式。    

        参数:
            query: 使用相似度搜索的概念

        返回:
            返回匹配结果列表
        """

        return embeddings.search(
            "SELECT id, text, 距离 FROM txtai WHERE similar(:query)",
            10, parameters={"query": query}
        )

    agent = Agent(
        tools=[search],
        llm=llm,
        最大迭代次数=10,
    )

全屏模式 退出全屏

    从IPython.display导入display, Markdown;

    def md(output):
        display(Markdown(output))

    研究员 = """
    {command}

    请按照以下步骤操作。
     - 查找与主题相关的结果。
     - 分析结果
     - 继续查询,直到找到明确的答案
     - 编写一份Markdown格式的报告
    """

    md(研究员.format(command="""
    请列出并详细解释10颗可能适合生命存在的候选恒星。
    """, maxlength=16000))

全屏观看,关闭全屏

    ======== 新任务 ========

    列出10颗潜在适合生命存在的恒星,并对每个候选恒星进行详细的解释。

    请执行以下操作。
     - 搜索与主题相关的结果。
     - 分析这些结果。
     - 继续查询直至找到有说服力的答案。
     - 编写一份Markdown报告。

    === 代理思考:
    思考:我需要找到这些潜在适合生命存在的恒星来完成任务。为了完成这个任务,我将使用`search`工具来查找相关信息。
    >>> 调用工具:'search',参数为:candidate stars for habitable planets
    === 代理思考:
    思考:从`search`工具得到的结果列出了潜在适合生命存在的星球,不过这些信息没有组织得特别清晰和明确。为了创建一份详细清晰的列表,我需要进一步分析这些结果,找到关键点。
    >>> 调用工具:'final_answer',参数为:"以下是10颗潜在适合生命存在的恒星及其详细解释:

1. 卢腾星(红矮星)- 拥有一颗已确认的系外行星,卢腾b,这是一颗超级地球,且它接收到的星光比地球多出6%。

2. 格利泽273(红矮星)- 拥有一颗已确认的系外行星,格利泽273c,这是一颗超级地球,且它接收到的星光比地球多出6%。

3. 罗氏128(红矮星)- 拥有一颗已确认的系外行星,罗氏128b,这是一颗超级地球,且它接收到的星光比地球多出6%。

4. 比邻星(红矮星)- 拥有一颗已确认的系外行星,比邻星b,这是一颗超级地球,且它接收到的星光比地球多出6%。

5. 开普勒-560(双星系统)- 拥有一颗已确认的系外行星,开普勒-560b,这是一颗超级地球,位于适居带内。

6. K2-332(M4V型恒星)- 拥有一颗潜在适居的系外行星,K2-332b,这是一颗超级地球或迷你海王星,它接收到的光比地球从太阳获得的多1.17倍。

7. 南门二A星(G型主序星)- 拥有一颗候选系外行星,南门二Ab,这是一颗巨行星,距恒星约1.1天文单位。

8. 开普勒-298(橙矮星)- 拥有一颗已确认的系外行星,开普勒-298d,这颗行星位于适居带内,可能是一个海洋行星,并拥有浓厚的气体大气层。

9. LHS 1140(M矮星)- 拥有一颗已确认的系外行星,LHS 1140 b,这是一颗超级地球,且它位于恒星的适居带内。

10. 蒂根丹星(M矮星)- 拥有一颗已确认的系外行星,蒂根丹星b,这是一颗超级地球,且它位于恒星的适居带内。

    注意:这些恒星及其系外行星的适居性仍然是讨论和研究的主题,需要更多研究来确认它们支持生命的可能性。"

全屏模式:进入 / 退出

以下是一份可能适合生命居住的10颗候选恒星列表:

1. 卢延特星(红矮星)- 有一颗已确认的系外行星,卢延特b,这是一颗超级地球,它接收到的星光比地球多6%。

2. 格利耶斯273(红矮星)- 有一颗已确认的系外行星,格利耶斯273b,这是一颗超级地球,它接收到的星光比地球多6%。

3. 罗斯128(红矮星)- 有一颗已确认的系外行星,罗斯128b,这是一颗超级地球,它接收到的星光比地球多6%。

4. 比邻星(红矮星)- 有一颗已确认的系外行星,比邻星b,这是一颗超级地球,它接收到的星光比地球多6%。

5. 开普勒-560(双星系统)- 有一颗已确认的系外行星,开普勒-560b,这是一颗超级地球,它位于双星系统的宜居带内。

6. K2-332(M4V型星)- 有一颗已确认的系外行星,K2-332b,这是一颗可能适合生命居住的超级地球或迷你海王星系外行星,它接收到的星光是地球从太阳接收的1.17倍。

7. 半人马座α星(G型主序星)- 有一个候选系外行星,半人马座α星b,这是一颗巨行星,它距离这颗恒星大约1.1个天文单位。

8. 开普勒-298(橙矮星)- 有一颗已确认的系外行星,开普勒-298d,这颗行星位于恒星的宜居带内,可能是拥有浓厚大气层的海洋行星。

9. LHS 1140(M矮星)- 有一颗已确认的系外行星,LHS 1140b,这是一颗超级地球,它位于恒星的宜居带内。

10. 提加登星(M矮星)- 有一颗已确认的系外行星,提加登星b,这是一颗超级地球,它位于恒星的宜居带内。

注意:这些恒星及其系外行星的宜居性仍是一个讨论和研究的对象,需要更多的研究来确认它们是否能够支持生命。

全屏模式 退出全屏

收尾

这篇文章使用txtai解析了⭐。它展示了如何构建知识图以支持RAG。我们还介绍了如何利用代理构建一个“代理型”或“自我查询”的RAG系统。

我们是不是宇宙中唯一的生物?没人知道。或许AI能告诉我们答案 😀

点击查看更多内容
TA 点赞

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

评论

作者其他优质文章

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

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

举报

0/150
提交
取消