首页 > 数据库 >RAG在PostgreSQL上的实现:使用Azure Container Apps和OpenAI构建智能问答系统

RAG在PostgreSQL上的实现:使用Azure Container Apps和OpenAI构建智能问答系统

时间:2024-09-02 12:51:02浏览次数:10  
标签:RAG Container text Apps OpenAI embedding Azure query

RAG在PostgreSQL上的实现:使用Azure Container Apps和OpenAI构建智能问答系统

随着人工智能技术的快速发展,越来越多的企业和开发者开始探索如何将AI能力整合到现有的应用系统中。本文将介绍一种基于检索增强生成(Retrieval Augmented Generation, RAG)的方案,通过结合Azure Container Apps、PostgreSQL和OpenAI,实现一个能够智能回答数据库中信息的问答系统。

RAG技术简介

检索增强生成(RAG)是一种结合了检索系统和生成模型的AI技术。它通过从知识库中检索相关信息,然后利用大语言模型生成最终答案,既保证了回答的准确性,又赋予了AI更强的推理和生成能力。在本项目中,RAG的实现主要包含以下几个关键步骤:

  1. 使用pgvector扩展对PostgreSQL数据库表进行向量化搜索
  2. 结合全文搜索,通过RRF(Reciprocal Rank Fusion)算法融合搜索结果
  3. 利用OpenAI的function calling将用户查询转换为SQL过滤条件
  4. 使用OpenAI的嵌入API将用户查询转换为向量

通过这些技术的结合,系统能够准确理解用户意图,快速检索相关信息,并生成符合上下文的自然语言回答。

系统架构概览

系统架构图

如上图所示,整个系统主要由以下几个部分组成:

  • 前端:使用React和FluentUI构建的Web应用界面
  • 后端:基于Python和FastAPI开发的API服务
  • 数据库:Azure PostgreSQL灵活服务器
  • AI服务:Azure OpenAI

整个应用通过Azure Container Apps进行部署和托管,实现了高度的可扩展性和弹性。

核心功能实现

1. 向量化搜索

本项目使用了pgvector扩展来为PostgreSQL添加向量搜索能力。首先需要在数据库中创建表并添加向量字段:

from pgvector.django import VectorField

class Transcript(models.Model):
    content = models.TextField()
    embedding = VectorField(dimensions=1536)  # OpenAI ada-002模型的维度

然后使用OpenAI的Embedding API将文本转换为向量并存储:

import openai

def generate_embedding(text):
    response = openai.Embedding.create(
        input=text, 
        model="text-embedding-ada-002"
    )
    return response['data'][0]['embedding']

transcript = Transcript(content=text)
transcript.embedding = generate_embedding(text)
transcript.save()
2. 混合搜索实现

为了提高搜索的准确性,项目结合了向量搜索和全文搜索:

from django.contrib.postgres.search import SearchVector

def hybrid_search(query, top_k=5):
    # 向量搜索
    query_vector = generate_embedding(query)
    vector_results = Transcript.objects.order_by(models.F('embedding').cosine_distance(query_vector))[:top_k]
    
    # 全文搜索
    text_results = Transcript.objects.annotate(
        search=SearchVector('content')
    ).filter(search=query)[:top_k]
    
    # 使用RRF算法融合结果
    return combine_results(vector_results, text_results)
3. 查询转换

使用OpenAI的function calling功能,可以将自然语言查询转换为结构化的SQL条件:

import openai

def convert_to_sql(query):
    response = openai.ChatCompletion.create(
        model="gpt-3.5-turbo-0613",
        messages=[{"role": "user", "content": query}],
        functions=[{
            "name": "generate_sql_condition",
            "description": "Generate SQL WHERE condition from natural language query",
            "parameters": {
                "type": "object",
                "properties": {
                    "condition": {"type": "string", "description": "SQL WHERE condition"}
                },
                "required": ["condition"]
            }
        }],
        function_call={"name": "generate_sql_condition"}
    )
    return response.choices[0].function_call.arguments

部署和运维

项目设计为可以通过Azure Developer CLI轻松部署到Azure平台:

  1. 安装Azure Developer CLI
  2. 运行azd init -t rag-postgres-openai-python初始化项目
  3. 执行azd up进行资源配置和代码部署

系统还集成了Azure Monitor,可以方便地进行应用监控和日志分析。

安全性考虑

项目采用了托管身份(Managed Identity)来进行Azure服务之间的认证,避免了硬编码凭据的安全风险。同时,建议启用GitHub的secret scanning功能,防止敏感信息泄露。

结语

通过结合Azure Container Apps、PostgreSQL和OpenAI,我们实现了一个功能强大的RAG问答系统。这种架构不仅具有良好的可扩展性和弹性,还充分利用了云原生技术的优势。希望本文能为您在构建类似AI增强型应用时提供一些有益的思路和参考。

如果您对项目有任何问题或建议,欢迎在GitHub仓库中提出issue或贡献代码。让我们一起探索AI应用的无限可能!

项目链接:www.dongaigc.com/a/rag-postgresql-azure-container-apps-openai

https://www.dongaigc.com/a/rag-postgresql-azure-container-apps-openai

标签:RAG,Container,text,Apps,OpenAI,embedding,Azure,query
From: https://blog.csdn.net/Nifc666/article/details/141816857

相关文章

  • GraphRAG 检索增强+图模型
    https://arxiv.org/pdf/2404.16130往期的NaiveRAG基本都是显式检索,而GraphRAG通过知识图谱实现了总结能力。知识图谱通常是事先生成的,并存储在系统中,供用户查询和模型使用。1引入通常意义上,RAG的作用是从外部知识源中检索相关信息,使LLM能够回答有关私有或以前未见过的文档集......
  • 云存储抽象层-FluentStorage
    FluentStorage是一个.NET云存储抽象层,支持多种云服务提供商。它提供了一个统一的API来处理不同云服务提供商的Blob存储(如AWSS3,GCP,FTP,SFTP,AzureBlob/File/EventHub/DataLake)和消息传递(如AWSSQS,AzureQueue/ServiceBus)。这个库完全用C#编写,支持.NET5+和.NETStanda......
  • 大模型 | RAG 架构设计三阶段:Naive RAG 架构设计、Advanced RAG 架构设计、Agentic RA
    第一阶段:NaiveRAG架构设计大型语言模型(LLMs)虽然展现出卓越的性能,但在处理特定领域或知识密集型任务时,存在一些挑战,比如:产生虚假信息、知识陈旧以及推理过程的非透明性和不可追溯性。RAG技术作为一种有希望的解决方案,通过融合外部数据库的知识,有效应对了这些问题。它显著......
  • Day27-containerd
    containerd的历史(1)早在2016年3月,Docker1.11的DockerEngine里就包含了containerd,而现在则是把containerd从DockerEngine里彻底剥离出来,作为一个独立的开源项目独立发展,目标是提供一个更加开放、稳定的容器运行基础设施。和原先包含在DockerEngine里containerd相比,独立的conta......
  • 第二十九节 containerd的介绍与安装
    一、containerd的介绍1、containerd介绍(1)早在2016年3月,Docker1.11的DockerEngine里就包含了containerd,而现在则是把containerd从DockerEngine里彻底剥离出来,作为一个独立的开源项目独立发展,目标是提供一个更加开放、稳定的容器运行基础设施。和原先包含在DockerEngine里con......
  • 【K8s】专题十二(4):Kubernetes 存储之 StorageClass
    本文内容均来自个人笔记并重新梳理,如有错误欢迎指正!如果对您有帮助,烦请点赞、关注、转发、订阅专栏!专栏订阅入口Linux专栏 | Docker专栏 | Kubernetes专栏往期精彩文章【Docker】(全网首发)KylinV10下MySQL容器内存占用异常的解决方法【Docker】(全网首发)Kyli......
  • [kubernetes]使用kubeadm和containerd部署kubernetes
    前言因宿主机内核版本限制和垂直伸缩特性的需要,安装的k8s版本为1.25,runtime为containerd,cni为calico。containerd、kubeadm、kubelet也可以用包管理器来安装,因为不想配repo,也不想校验repo版有哪些区别,所以这几个都是用原生二进制方式安装的。环境信息IPHostnameOSVersio......
  • containerd:配置https私有镜像仓库的最新方法
    随着containerd应用越来越广泛,我们必须紧跟官网的节奏。之前配置https私有镜像仓库的方法比较繁琐,并且不易梳理,下边介绍一下目前最新的配置方法。配置https私有镜像仓库我假设你现在已经有私有仓库并且是https再假设你的harbor域名是harbor.example.cn你只需要在/etc/contain......
  • appsettins.json 复制到输出文件夹 CopyToOutpuDirectory 配置文件 csproj
    复制配置文件到输出文件夹<ItemGroup><NoneUpdate="appsettings.json"><CopyToOutputDirectory>Always</CopyToOutputDirectory></None><NoneUpdate="nlog.config"CopyToOutputDirectory="Always&qu......
  • 通过vue-draggable-plus实现一个简单的菜单拖拽功能
    <divclass="my-content-list"v-draggable="[nameList,{animation:300,}]":onStart="onStart":onUpdate="onUpdate">......