安装docker

访问 https://www.docker.com/ 网站
在这里插入图片描述
一般是选择AMD64版本,为了指定docker安装路径使用命令行安装,首先以管理员身份启动cmd,切换到安装包所在目录,执行以下命令

"Docker Desktop Installer.exe"  install --installation-dir="D:\Docker"

其中,D:\Docker 是我的安装路径,安装完成后可以修改镜像的存储位置,防止挤爆C盘。
在这里插入图片描述
参考:https://zhuanlan.zhihu.com/p/1894560146467841166

安装PostgreSQL + pgvector

    因为使用直接部署到宿主机的方式需要编译pgvector 扩展插件,为了减小安装成本,选择直接使用配置好的镜像,本文使用 pgvector:pg17 镜像。来源:https://docker.aityp.com/image/docker.io/pgvector/pgvector:pg17

拉取镜像,并查看拉取情况

docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/pgvector/pgvector:pg17

在这里插入图片描述
可以看到镜像已经拉取到了本地。

启动镜像为容器

docker run -itd --restart=always \
 -p 5432:5432 \
 -e POSTGRES_PASSWORD=password \
 994a833b615c

启动结果:
在这里插入图片描述
994a833b615c 是pgvector镜像的ID,需要指定POSTGRES_PASSWORD环境变量,否则容器无法正常启动,belike:
在这里插入图片描述

判断pgvector 是否启用

进入启动的容器

docker exec -it 8eea852979a1 /bin/bash

进入PostgreSQL

psql -U postgres

判断扩展安装情况

# -- 1. 查看系统中已注册的扩展(无需先创建,仅验证是否存在安装文件)
SELECT * FROM pg_available_extensions WHERE name = 'vector';
# -- 2. 查看当前数据库已安装的所有扩展
SELECT * FROM pg_extension WHERE extname = 'vector';

结果:
在这里插入图片描述
可以看到在名为postgres的数据库中,pgvector 已正确编译安装到 PostgreSQL 的扩展目录,能够正确注册识别,但是未应用到当前数据库中,为了不修改这个默认数据库,新建一个,

# 建立名为 vector_db_test 的数据库
CREATE DATABASE vector_db_test

进入该数据库并操作,

# 进入数据库
\c  vector_db_test
# 应用向量扩展到该数据库中
# -- 启用 pgvector 扩展(扩展名称是 vector,不是 pgvector)
CREATE EXTENSION vector;
# -- 查看当前数据库已启用的扩展
SELECT * FROM pg_extension WHERE extname = 'vector';
# -- 创建含向量字段的表(无报错则功能正常)
CREATE TABLE test_embedding (id int, vec vector(128)); -- 128维向量

在这里插入图片描述
至此,向量数据库配置完成。

大模型接入

引入大模型的方式目前可以分为两种,一是使用云服务商提供的LLM接口(例如,硅基流动),二是自己本地部署,通过某些推理框架(ollama)部署大模型,暴露LLM接口。这里介绍第一种方式。

创建向量数据表

PostgreSQL + pgvector 建表模板(SQL)

import psycopg2

def init_pgvector():
    conn = psycopg2.connect(
        dbname="vector_db_test",
        user="postgres",
        password="password",
        host="localhost",
        port=5432
    )
    conn.autocommit = True

    cur = conn.cursor()

    # 1. Enable pgvector
    cur.execute("""
        CREATE EXTENSION IF NOT EXISTS vector;
    """)

    # 2. Create table storing documents + embeddings
    cur.execute("""
        CREATE TABLE IF NOT EXISTS documents (
            id bigserial PRIMARY KEY,
            content text NOT NULL,
            embedding vector(1024),
            metadata jsonb
        );
    """)
    # embedding 向量维度如果不同,你只需要把 1024 改成相应维度即可。

    # 3. Create HNSW index
    cur.execute("""
        CREATE INDEX IF NOT EXISTS idx_documents_embedding
        ON documents
        USING hnsw (embedding vector_cosine_ops)
        WITH (m = 16, ef_construction = 64);
    """)

    print("PostgreSQL + pgvector 初始化完成!")

    cur.close()
    conn.close()


if __name__ == "__main__":
    init_pgvector()

向量化

调用 硅基流动提供的 embedding

import requests
import llm_api_key as api_key

def embed(text: str):
    """
    使用 BAAI 的 bge-large embedding 模型
    """
    url = "https://api.siliconflow.cn/v1/embeddings"
    payload = {
        "model": "BAAI/bge-large-zh-v1.5",
        "input": f"{text}"
    }
    headers = {
        "Authorization": f"Bearer {api_key.my_api_key}",
        "Content-Type": "application/json"
    }

    response = requests.post(url, json=payload, headers=headers)

    res = response.json()
    print(res)
    return res['data'][0]['embedding']

if __name__ == "__main__":
    vec_words = embed("你好")

插入数据

将 embedding 后的句子向量对应后存入数据库,并添加一些关键词信息(可无)。

import psycopg2
from embedding_client import embed
from psycopg2.extras import Json

conn = psycopg2.connect(
    dbname="vector_db_test",
    user="postgres",
    password="password",
    host="localhost",
)
conn.autocommit = True


def insert_document(text: str, metadata: dict = None):
    vector = embed(text)

    with conn.cursor() as cur:
        cur.execute("""
            INSERT INTO documents (content, embedding, metadata)
            VALUES (%s, %s, %s)
        """, (text, vector, Json(metadata)))

    print("Inserted:", text[:40], "...")


if __name__ == "__main__":
    insert_document("太阳能逆变器用于将直流转交流...", {"type": "energy"})

相似度检索

RAG Retrieve

import psycopg2
from embedding_client import embed

conn = psycopg2.connect(
    dbname="vector_db_test",
    user="postgres",
    password="password",
    host="localhost",
)

def search_similar(query: str, top_k: int = 5):
    qvec = embed(query)

    with conn.cursor() as cur:
        cur.execute("""
            SELECT content, 1 - (embedding <=> %s::vector) AS similarity
            FROM documents
            ORDER BY embedding <-> %s::vector
            LIMIT %s;
        """, (qvec, qvec, top_k))

        results = cur.fetchall()

    return [{"content": r[0], "similarity": float(r[1])} for r in results]

if __name__ == "__main__":
    print(search_similar("逆变器的作用?"))

根据检索内容生成回答

生成回答(Retrieve → Augment → Generate)

import requests
from search import search_similar
import llm_api_key as api_key


def rag_answer(query: str, top_k: int = 5):
    url = "https://api.siliconflow.cn/v1/chat/completions"
    docs = search_similar(query, top_k)

    context = "\n\n".join([d["content"] for d in docs])

    prompt = f"""
你是一个知识检索助手。根据以下检索到的内容回答用户问题。
如果检索内容不足,请合并常识合理补充。

===检索内容===
{context}

===问题===
{query}

请给出清晰、有条理的回答。
"""
    print(prompt)
    payload = {
    "model": "deepseek-ai/DeepSeek-R1-Distill-Qwen-7B",
    "messages": [
        {
            "role": "user",
            "content": f"{prompt}"
        }
    ]
    }
    headers = {
        "Authorization": f"Bearer {api_key.api_key}",
        "Content-Type": "application/json"
    }

    response = requests.post(url, json=payload, headers=headers)
    res = response.json()["choices"][0]["message"]["content"]

    return res

if __name__ == "__main__":
    print(rag_answer("逆变器的作用是什么?"))

以上代码依次执行,结果如下:

你是一个知识检索助手。根据以下检索到的内容回答用户问题。
如果检索内容不足,请合并常识合理补充。

===检索内容===
太阳能逆变器用于将直流转交流...

===问题===
逆变器的作用是什么?

请给出清晰、有条理的回答。


嗯,用户问逆变器的作用是什么,先看看他给的检索内容。检索内容说是太阳能逆变器用于将直流转交流。那么逆变器的主要功能就是将直流电转换
为交流电吧。

那用户的逆变器可能在太阳能系统中使用,因为太阳能电池板输出的是直流电,而家庭通常用交流电,所以逆变器在这里起转换作用。

可能用户想了解逆变器在什么设备中使用,或它在电路中的作用。或许他也在考虑太阳能储能系统,逆变器也要将储存在电池中的直流电转换为交流
电供繪如电视、电脑等电器使用。

逆变器的功能可能包括匹配电压和频率,优化功率,提高效率,以及实现逆功率控制。这些功能帮助系统稳定运行,避免引发电网问题。

用户可能是个 DIY 安装者,或者是研究电力电子技术的学生,想了解逆变器的工作原理和应用。此外,他对逆变器可能还有兴趣了解其在其他能源 
转换中的作用。

所以综合来看,逆变器的主要作用是将直流电转换为交流电,匹配电路的参数,保证系统的稳定运行。在太阳能系统中,它连接逆变器和储能设备,
扮演关键的角色。
</think>

逆变器的作用是将直流电转换为交流电,这在电力系统中非常重要。具体来说,逆变器的作用包括:

1. **直流转交流**:将太阳能电池板等直流电源的输出转化为符合家庭或网联系统需求的交流电。
2. **匹配电压和频率**:确保输出电压和频率与电网兼容,以避免电压波动或 resonance。
3. **优化功率传输**:提高能量的传输效率,减少能量损耗。
4. **实现逆功率控制**:在储能系统中,逆变器可以控制能量的流向,例如将多余的能源储存在电池中。
5. **稳定性管理**:帮助平衡电源供应,特别是在eload sharing或分布式能源系统中。

总结来说,逆变器在太阳能逆变器中主要负责将直流电转换为交流电,并匹配电网要求,确保系统的稳定和高效运行。

整体工程上传至: https://github.com/tian0zhi/pgvector_rag
配置llm_api_key的值,使其生效,具体可以参考硅基流动官网的文档

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐