手记

基于Ollama和pgai的个人知识助手项目:用Postgres和向量扩展打造智能数据库

这是提交给Open Source AI Challenge with pgai和Ollama的内容。

我建立的:

在这个项目中,我开发了一个名为 pgai 的个人的第二大脑的AI驱动的个人知识助手。它被设计为本地运行,并集成了前沿AI工具如Gemini LLM和Ollama,以及核心数据库技术如Postgres和Drizzle ORM。该项目基于Vercel的仓库,并进行了调整以适应本地运行的语言模型(LLMs),使其功能自包含且在个人设备上更安全,保障个人设备的安全性。

该项目的主要目标是探索我们怎样能轻松地利用便捷且适合开发者的工具在本地创建、嵌入和管理知识图谱。

示例

可以在这里查看演示:pgai-challenge

该GitHub仓库在这里可以找到: pgai_challenge

这里用到的工具
  • AI SDK & Gemini LLM:这些工具驱动 pgai 的底层逻辑和智能。
  • Ollama:一个本地托管的 LLM 服务器,无需依赖云资源,允许我在我的机器上直接运行和访问模型。
  • Postgres 带 pgai 和向量扩展:Postgres 不仅存储数据,还在嵌入和高效查询信息方面起着关键作用。
  • Drizzle ORM:一个轻量级的 ORM,用于管理数据库交互。
  • Next.js:为应用程序提供前端和 API 功能,使应用快速、稳定且易于使用。
搭建环境

在运行 pgai 之前,请确保已安装以下项目:

  • Docker :如果你是 Docker 新手,我建议你使用 Docker Desktop 来获得一个更适合初学者的设置。
  • Ollama :你可以在这里 https://ollama.com/download 下载并安装适合你系统的 Ollama 二进制文件。安装完成后,可以通过运行以下命令来验证。
      ollama --help

进入全屏;退出全屏

  • LLM模型:你需要拉取一个模型,比如说llama3.2。运行。
ollama pull llama3.2

进入全屏模式 退出全屏

  • TimescaleDB :使用 Docker 来安装 TimescaleDB。在你的工作目录里,创建一个名为 docker-compose.yml 的文件,并粘贴配置。
      服务:
        timescaledb:
          镜像: timescale/timescaledb:latest-pg16
          容器名称: timescaledb
          环境:
            - POSTGRES数据库=mydb
            - POSTGRES用户名=myuser
            - POSTGRES密码=mypassword
          端口:
            - "5444:5432"
          卷:
            - timescaledb_data:/var/lib/postgresql/data
          重启: 除非停止

      卷:
        timescaledb_data:
          驱动器: local

点击全屏, 退出全屏

在该目录下执行 docker-compose up --build 命令,以启动 TimescaleDB 服务并激活必需的 pgai 和向量支持。

使用 pgAI 和 Postgres 向量扩展功能

要让Postgres准备好处理AI相关的查询,你需要安装pgai插件并创建一个数据表以便存储你的数据。

开启 pgai 扩展插件

要开始在 SQL 查询中直接使用 AI 嵌入技术,请启用相关功能或插件:

    CREATE EXTENSION IF NOT EXISTS ai CASCADE;

如果它还不存在的话,这行代码会创建一个名为ai的数据库扩展。

全屏,退出全屏

设置歌词表部分

这里有一个用于存储歌词以及相关元数据和嵌入表示的表结构示例。

    CREATE TABLE lyrics (
        id SERIAL PRIMARY KEY,
        author TEXT,
        title TEXT,
        content TEXT,
        metadata JSON,
        embedding vector(768)
    );

    INSERT INTO lyrics (id, author, title, content, metadata) VALUES 
    (1, 'Alex Rivers', '漂泊的心', '我选择了少有人走的路,穿过阴影与光明,寻找在夜晚迷失的碎片。',
        '{"genre": "独立民谣", "year": 2022, "mood": "反思"}'),
    (2, 'Jamie Cross', '你的回声', '我在寂静中听到你的声音,一个逐渐消逝的低语,回忆留下,但时间永不等待。',
        '{"genre": "流行情歌谣", "year": 2023, "mood": "怀旧"}'),
    (3, 'Taylor Lane', '无尽的梦想', '我们在午夜跳舞,星星在我们眼中闪烁,承诺永恒,但永恒流逝。',
        '{"genre": "合成浪潮", "year": 2021, "mood": "梦幻"}'),
    (4, 'Morgan Lee', '消逝的火焰', '余烬现在很低,但仍然燃烧得明亮,曾经如此炽烈的爱,迷失在夜晚。',
        '{"genre": "摇滚", "year": 2022, "mood": "强烈的情感"}'),
    (5, 'Casey Dawn', '空荡的街道', '这些街道承载着欢笑与泪水的故事,回响着随着岁月流逝的脚步声。',
        '{"genre": "蓝调", "year": 2020, "mood": "忧伤"}');

点击全屏按钮,然后点击退出按钮

生成嵌入

下面这行 SQL 可以用来生成基于每行内容的嵌入向量:

[此处应为 SQL 代码]
    UPDATE lyrics SET embedding = ai.ollama_embed('nomic-embed-text', content, host => 'http://host.docker.internal:11434');
    -- 更新歌词表,将歌词的embedding设置为通过ai.ollama_embed函数计算的结果

全屏模式 退出全屏

此命令使用 pgai 扩展来调用 Ollama 的嵌入模型,并自动将嵌入直接存入您的数据库,从而使数据检索更加高效。

运行嵌入式查询

一旦生成了嵌入向量后,你可以通过相似度查询来找到与特定的主题或情绪相关的歌词。下面是一些例子:

简单相似搜索

    SELECT embedding <=> ai.ollama_embed('nomic-embed-text', '感到悲伤', host => 'http://host.docker.internal:11434') as distance
    FROM lyrics
    ORDER BY distance;

切换到全屏 退出全屏

这会找到与查询“我很伤心”最相似的答案,并根据相似程度进行排序。

使用元数据过滤器的查询功能

你还可以添加一些元数据过滤器,比如只搜索特定的类别中。

    SELECT embedding <=> ai.ollama_embed('nomic-embed-text', '时间旅行音乐', host => 'http://host.docker.internal:11434') as 距离
    FROM 歌词 
    WHERE metadata->>'genre' = 'Synthwave'
    ORDER BY distance
    LIMIT 10;

切换到全屏 退出全屏

这个查询会找到并返回与“永恒音乐”这些词最接近的“合成波(Synthwave)”风格歌词。

最后的想法

这个项目展示了如何使用像pgaiOllama这样的工具,轻松地将Postgres用作一个具有强大向量搜索功能的知识库。这种用法的潜力巨大:你可以用这种方法来整理任何类型的数据——文章、笔记,甚至多媒体——以便进行更智能的查询。

与 pgai 合作非常令人兴奋,因为它简化了很多构建和部署基于 AI 的应用程序的常见复杂性。这个项目让我看到了 AI 工具正迅速发展,让数据的组织、检索和搜索变得更加智能和用户友好。希望这个原型能展示结合 Postgres 和本地托管的 AI 模型的潜力,适用于任何知识密集型应用!

奖项分类: 来自Ollama的开源模型,Vectorizer,

0人推荐
随时随地看视频
慕课网APP