构建船舶领域大模型问答系统:融合文本向量与知识图谱增强技术

99 阅读6分钟

构建船舶领域大模型问答系统:融合文本向量与知识图谱增强技术

引言

在船舶行业,大量的知识分散于网页、文档等各种形式的资料中。当从业者面临诸如船舶维护、操作规范等问题时,快速准确地获取相关知识变得至关重要。借助大模型技术构建一个问答系统,能有效整合这些知识,为用户提供高效的知识查询服务。本文将详细阐述如何利用火山引擎 bigmodel 向量模型以及 lightrag 工具,实现一套船舶相关的大模型文本向量增强知识图谱增强的问答系统。

系统构建整体思路

该问答系统的构建主要分为三个关键阶段:数据收集、数据导入与处理、问答功能实现。首先,广泛收集船舶相关的网页、docx 文档、pdf 文档和 ppt 文档等多源数据;接着,使用火山引擎deepseek v3、r1; bigmodel text embedding 3向量模型和 lightrag 工具将这些数据进行处理并导入系统;最后,实现问答功能,为用户提供准确的答案。

数据收集

多源数据获取

为了确保问答系统涵盖全面的船舶知识,需要从多个渠道收集数据。网页是信息的重要来源,可通过网络爬虫技术抓取船舶行业网站、论坛、新闻资讯等网页上的相关内容。对于 docx 文档、pdf 文档和 ppt 文档,可以从船舶公司的内部资料、行业报告、学术论文等途径获取。这些文档包含了船舶设计、建造、运营、维护等各个方面的详细知识。

数据预处理

收集到的数据可能存在格式不统一、内容重复、噪声等问题,因此需要进行预处理。对于网页数据,需要进行清洗,去除 HTML 标签、广告等无关信息;对于文档数据,需要进行格式转换,将 docx、pdf、ppt 等格式转换为纯文本格式。同时,还可以进行文本去重、分词、词性标注等操作,提高数据的质量。

数据导入与处理

环境与工具准备

在开始导入数据之前,需要安装必要的库和设置相关环境。以下是 Python 代码示例,展示了如何使用 lightrag 工具进行数据导入:

import logging
import os
import asyncio
from lightrag import LightRAG, QueryParam
from lightrag.llm.openai import openai_complete
from lightrag.llm.zhipu import zhipu_embedding
from lightrag.utils import EmbeddingFunc

WORKING_DIR = "./ship_info_lightrag"

logging.basicConfig(format="%(levelname)s:%(message)s", level=logging.INFO)

配置 API 密钥

为了使用火山引擎 deepseek v3、r1; bigmodel text embedded3 向量模型和相关服务,需要设置 API 密钥。在代码中,我们使用环境变量来存储这些密钥:

141a10b3b72a00938ebbdd675148f15.jpg

async def main():
    if not os.path.exists(WORKING_DIR):
        os.mkdir(WORKING_DIR)
    os.environ['ZHIPUAI_API_KEY'] = '.'

    api_key = os.environ.get("ZHIPUAI_API_KEY")
    if api_key is None:
        raise Exception("Please set ZHIPU_API_KEY in your environment")

初始化 LightRAG 工具

LightRAG 是一个强大的文档、向量、图谱指令增强工具,用于将数据进行向量化处理并存储。我们需要对其进行初始化配置:

    rag = LightRAG(
        working_dir=WORKING_DIR,
        llm_model_func=openai_complete,
        llm_model_name="ep-20250220130638-w2l2r",
        llm_model_max_async=4,
        llm_model_max_token_size=32768,
        llm_model_kwargs={"base_url": "https://ark.cn-beijing.volces.com/api/v3",
                          "api_key": ""},
        embedding_func=EmbeddingFunc(
            embedding_dim=2048,  # Zhipu embedding-3 dimension
            max_token_size=8192,
            func=lambda texts: zhipu_embedding(texts,api_key='.'),
        ),
    )

数据导入

使用 glob 模块获取所有船舶相关的 Markdown 文档,并将其内容插入到 LightRAG 中:

    import glob

    ship_info_list = glob.glob('ship_info_output/*.md')
    for ship_info_one in ship_info_list:
        with open(ship_info_one, "r", encoding="utf-8") as f:
            rag.insert(f.read())

# 运行异步函数
asyncio.run(main())

问答功能实现

定义问题列表

为了测试问答系统的性能,我们定义了一系列船舶相关的问题:

def main():
    questions = [
    "船舶日常维护中,对船体结构的检查要点有哪些?",
    "在船舶操作规范里,进出港口时的航速限制是如何规定的?",
    "船舶发动机维护的周期及主要维护项目有哪些?",
    "船舶在恶劣天气下操作,应遵循哪些特殊规范?",
    "船舶电气系统维护中,如何检测线路的绝缘性能?",
    "根据船舶操作规范,如何正确进行锚泊作业?",
    "船舶的压载水系统维护需要注意哪些方面?",
    "船舶航行时,瞭望操作规范包含哪些关键内容?",
    "船舶消防设备维护的标准及检查频率是怎样的?",
    "船舶操作规范中,对船员值班安排有哪些具体要求?"
    ]

初始化问答系统

再次初始化 LightRAG 工具,确保其配置与数据导入时一致:

    if not os.path.exists(WORKING_DIR):
        os.mkdir(WORKING_DIR)
    os.environ['ZHIPUAI_API_KEY'] = '.'

    api_key = os.environ.get("ZHIPUAI_API_KEY")
    if api_key is None:
        raise Exception("Please set ZHIPU_API_KEY in your environment")

    rag = LightRAG(
        working_dir=WORKING_DIR,
        llm_model_func=openai_complete,
        llm_model_name="ep-20250220130638-w2l2r",
        llm_model_max_async=4,
        llm_model_max_token_size=32768,
        llm_model_kwargs={"base_url": "https://ark.cn-beijing.volces.com/api/v3",
                          "api_key": ""},
        embedding_func=EmbeddingFunc(
            embedding_dim=2048,  # Zhipu embedding-3 dimension
            max_token_size=8192,
            func=lambda texts: zhipu_embedding(texts,api_key=''),
        ),
    )

执行问答操作

对于每个问题,分别使用不同的搜索模式(naive、local、global、hybrid)进行查询,并打印结果:

    for question in questions:
        # Perform naive search
        print(
            rag.query(question, param=QueryParam(mode="naive"))
        )

        # Perform local search
        print(
            rag.query(question, param=QueryParam(mode="local"))
        )

        # Perform global search
        print(
            rag.query(question, param=QueryParam(mode="global"))
        )

        # Perform hybrid search
        print(
            rag.query(question, param=QueryParam(mode="hybrid"))
        )


# 运行异步函数
main()

系统优势与应用前景

优势

  • 知识整合:通过融合文本向量和知识图谱技术,系统能够将分散的船舶知识进行有效整合,提供全面的知识服务。
  • 智能问答:借助大模型的强大语言理解和生成能力,系统能够准确理解用户的问题,并给出高质量的答案。
  • 多模式搜索:支持多种搜索模式,如 naive、local、global、hybrid 等,用户可以根据实际需求选择最合适的搜索方式。

应用前景

该问答系统在船舶行业具有广泛的应用前景。可以为船舶公司的员工提供快速的知识查询服务,帮助他们解决工作中遇到的问题;也可以为船舶设计、建造、运营等领域的研究人员提供参考资料,促进船舶行业的技术创新和发展。

总结与展望

本文详细介绍了如何构建一个船舶相关的大模型文本向量增强知识图谱增强的问答系统。通过数据收集、数据导入与处理、问答功能实现等步骤,我们成功地将船舶领域的多源知识整合到一个系统中,并实现了智能问答功能。未来,我们可以进一步优化系统的性能,如提高模型的准确性、增加知识图谱的复杂度等,以更好地满足用户的需求。同时,还可以将系统与其他船舶相关的信息系统进行集成,实现更高效的知识共享和应用。