很多开发者想做一个能读懂公司资料的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维数组
热门跟贴