很多开发者想做一个能读懂公司资料的AI助手——让它翻翻PDF、查查内部Wiki、看看历史工单,然后基于这些内容回答问题。这种技术叫RAG(检索增强生成)。

AI热潮刚起来那会儿,大家以为必须得买Pinecone、Milvus这类专门的"向量数据库",为此在架构里硬塞了一层复杂组件。2026年了,Rails社区有更简单的玩法:直接用PostgreSQL。

打开网易新闻 查看精彩图片

借助pgvector扩展和一个叫neighbor的Ruby gem,AI数据可以跟你的业务数据存在同一个库里,RAG能力到手,ActiveRecord的舒适度还在。下面是用4步实现"Chat with your Database"的完整流程。

打开网易新闻 查看精彩图片

核心概念:Embedding是什么

AI不读文字,读的是数学。当你把一段文字丢给OpenAI的嵌入模型,它返回的是一个Embedding——一个包含1,536个数字的巨大数组。

把这个数组想象成地图上的坐标。讨论相似主题的段落,在地图上挨得更近。搜索时,我们把用户问题也转成坐标,然后问数据库:"这段落离我这个问题在地图上有多近?"

第一步:数据库配置

先让PostgreSQL知道它可以存这些大数组,启用vector扩展。

Gemfile里加上:

gem 'ruby-openai' # 调用ChatGPT

gem 'neighbor' # 给ActiveRecord加向量搜索

执行bundle install。

生成迁移文件,启用扩展并给Document模型加向量列:

rails g migration AddEmbeddingsToDocuments

# db/migrate/20260506120000_add_embeddings_to_documents.rb

class AddEmbeddingsToDocuments < ActiveRecord::Migration[8.0]

def change

enable_extension "vector"

add_column :documents, :embedding, :vector, limit: 1536

end

end

执行rails db:migrate。

打开网易新闻 查看精彩图片

模型里告诉neighbor跟踪这个列:

# app/models/document.rb

class Document < ApplicationRecord

has_neighbors :embedding

end

第二步:生成Embedding

用户创建Document时,需要把文本转成embedding存进数据库。API调用慢,建议用Solid Queue后台任务处理。

# app/services/embedding_service.rb

class EmbeddingService

def self.generate(document)

client = OpenAI::Client.new(access_token: ENV['OPENAI_API_KEY'])

response = client.embeddings(

parameters: {

model: "text-embedding-3-small",

input: document.content

# 提取1,536维数组