Jean's Blog

一个专注软件测试开发技术的个人博客

0%

RAG组件--数据导入llamhub databaseReader

LlamaHub DatabaseReader连接数据库

已经有现有的数据库,准备数据。

LlamaHub访问地址:https://llamahub.ai/

image-20250808153853539

  • 功能定位:
    • 外部数据源与LLaMA Index的集成工具集
    • 支持多种数据源:SQL数据库、图数据库、Elasticsearch等
  • 核心价值:
    • 解决RAG系统中多样化数据源的连接问题
    • 提供统一的数据加载接口,简化数据处理流程
  • 扩展性:
    • 支持自定义data connector开发
    • 可上传共享到LLaMA HUB社区

搜素下:DatabaseReader

image-20250808153953986

点击去后,地址:https://llamahub.ai/l/readers/llama-index-readers-database?from=
可以查询DatabaseReader的介绍、安装和使用案例

  • 安装步骤:
    • 基础安装:pip install llama-index-readers-database
    • 依赖安装(根据本地环境来进行选择):
      • 缺少MySQL 的 C 语言客户端库(libmysqlclient
        • Linux (Ubuntu/Debian)
          • sudo apt-get install libmysqlclient-dev
          • sudo apt-get install python3-dev
        • Mac
          • brew install mysql-client
          • 说明:以成功安装 mysql-client,在安装pip install mysqlclient还是报错
      • pip install mysqlclient (指定scheme:mysql)/ pip install pymysql(替换方案,指定scheme:mysql+pymysql)
  • 关键依赖:
    • libmysqlclient.so.21:MySQL客户端库,缺失会导致连接失败
    • Python开发环境:确保能编译MySQL相关扩展

用LLaMA Index读取数据库中的条目

参考文档:https://docs.llamaindex.ai/en/stable/examples/index_structs/struct_indices/SQLIndexDemo/

准数据:

  1. 创建数据库: CREATE DATABASE example_db;
  2. 使用数据库: USE example_db;
  3. 创建黑神话悟空游戏场景表:
1
2
3
4
5
6
7
8
CREATE TABLE game_scenes (
id INT AUTO_INCREMENT PRIMARY KEY,
scene_name VARCHAR(100) NOT NULL,
description TEXT,
difficulty_level INT,
boss_name VARCHAR(100),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
  1. 插入黑神话悟空游戏场景数据:
1
2
3
4
5
6
7
INSERT INTO game_scenes (scene_name, description, difficulty_level, boss_name)
VALUES
('花果山', '悟空的出生地,山清水秀,仙气缭绕', 2, '六耳猕猴'),
('水帘洞', '花果山中的洞穴,悟空的老家', 1, NULL),
('火焰山', '炙热难耐的火山地带,充满岩浆与烈焰', 4, '牛魔王'),
('龙宫', '东海龙王的宫殿,水下奇景', 3, '敖广'),
('灵山', '如来佛祖居住的圣地,佛光普照', 5, '如来佛祖');

示例代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from llama_index.readers.database import DatabaseReader

reader = DatabaseReader(
scheme="mysql+pymysql",
host="localhost",
port=3306,
user="root",
password="password",
dbname="example_db"
)

query = "SELECT * FROM game_scenes" # 选择所有游戏场景 -> Text-to-SQL
documents = reader.load_data(query=query)

print(f"从数据库加载的文档数量: {len(documents)}")
print(documents)

执行结果,输出内容:

1
2
从数据库加载的文档数量: 5
[Document(id_='ba77fdeb-e6d6-4b84-883f-aa29ba1f2347', embedding=None, metadata={}, excluded_embed_metadata_keys=[], excluded_llm_metadata_keys=[], relationships={}, metadata_template='{key}: {value}', metadata_separator='\n', text_resource=MediaResource(embeddings=None, data=None, text='id: 1, scene_name: 花果山, description: 悟空的出生地,山清水秀,仙气缭绕, difficulty_level: 2, boss_name: 六耳猕猴, created_at: 2025-08-08 07:54:32', path=None, url=None, mimetype=None), image_resource=None, audio_resource=None, video_resource=None, text_template='{metadata_str}\n\n{content}'), Document(id_='9ad2e033-0175-4554-9c0e-7b89f3b16e61', embedding=None, metadata={}, excluded_embed_metadata_keys=[], excluded_llm_metadata_keys=[], relationships={}, metadata_template='{key}: {value}', metadata_separator='\n', text_resource=MediaResource(embeddings=None, data=None, text='id: 2, scene_name: 水帘洞, description: 花果山中的洞穴,悟空的老家, difficulty_level: 1, boss_name: None, created_at: 2025-08-08 07:54:32', path=None, url=None, mimetype=None), image_resource=None, audio_resource=None, video_resource=None, text_template='{metadata_str}\n\n{content}'), Document(id_='a3e4ddc6-3452-4a98-9b46-8bbd72a5f382', embedding=None, metadata={}, excluded_embed_metadata_keys=[], excluded_llm_metadata_keys=[], relationships={}, metadata_template='{key}: {value}', metadata_separator='\n', text_resource=MediaResource(embeddings=None, data=None, text='id: 3, scene_name: 火焰山, description: 炙热难耐的火山地带,充满岩浆与烈焰, difficulty_level: 4, boss_name: 牛魔王, created_at: 2025-08-08 07:54:32', path=None, url=None, mimetype=None), image_resource=None, audio_resource=None, video_resource=None, text_template='{metadata_str}\n\n{content}'), Document(id_='26dcc77c-813f-4f89-98ce-c7d5e781a27e', embedding=None, metadata={}, excluded_embed_metadata_keys=[], excluded_llm_metadata_keys=[], relationships={}, metadata_template='{key}: {value}', metadata_separator='\n', text_resource=MediaResource(embeddings=None, data=None, text='id: 4, scene_name: 龙宫, description: 东海龙王的宫殿,水下奇景, difficulty_level: 3, boss_name: 敖广, created_at: 2025-08-08 07:54:32', path=None, url=None, mimetype=None), image_resource=None, audio_resource=None, video_resource=None, text_template='{metadata_str}\n\n{content}'), Document(id_='bacb8955-3bb0-4298-9dbd-758db5a99f1c', embedding=None, metadata={}, excluded_embed_metadata_keys=[], excluded_llm_metadata_keys=[], relationships={}, metadata_template='{key}: {value}', metadata_separator='\n', text_resource=MediaResource(embeddings=None, data=None, text='id: 5, scene_name: 灵山, description: 如来佛祖居住的圣地,佛光普照, difficulty_level: 5, boss_name: 如来佛祖, created_at: 2025-08-08 07:54:32', path=None, url=None, mimetype=None), image_resource=None, audio_resource=None, video_resource=None, text_template='{metadata_str}\n\n{content}')]
  • 实现效果:
    • 成功加载8个游戏场景文档
    • 每个文档包含完整字段信息
  • 技术要点:
    • 数据库表数据转换为标准文档格式
    • 实现与其他文档类型(TXT、HTML等)的统一处理
  • 进阶方向:
    • Text-to-SQL转换:将自然语言查询自动转换为SQL语句
    • 动态查询构建:避免硬编码SQL语句