使用 AI 框架开发智能应用程序

已完成

构建生产就绪型 AI 应用程序不仅需要 AI 功能,还需要一种包含实时数据流式处理、自然语言界面、开发人员生产力工具和云集成的方法。 SQL Server 2025 提供了一个平台,用于开发从本地部署扩展到云原生体系结构的应用程序。

这种集成方法意味着,可以在使用企业功能实现安全性、性能和可靠性的同时,使用工具和框架生成 AI 应用程序。 无论你是构建由 AI 见解提供支持的实时建议引擎、对话式 AI 助手还是分析仪表板,SQL Server 2025 都提供了所需的基础。

生成对话式 AI 接口

自然语言界面使企业数据可供用户访问,而无需 SQL 知识或技术专业知识。

设计对话查询模式

对话查询模式使用户能够使用自然语言提问,并通过使用 GPT-4 等 AI 模型将查询转换为 SQL 来接收数据驱动的答案。

实现自然语言转换为 SQL(NL2SQL)功能的能力:

-- Create a stored procedure that interprets natural language queries
CREATE PROCEDURE sp_ConversationalQuery
    @user_question NVARCHAR(MAX),
    @context NVARCHAR(MAX) OUTPUT,
    @sql_query NVARCHAR(MAX) OUTPUT
AS
BEGIN
    -- Build a prompt for the AI model to generate SQL
    DECLARE @prompt NVARCHAR(MAX) = CONCAT(
        'You are a SQL expert. Given the following database schema and user question, generate a SQL query.',
        CHAR(10), CHAR(10),
        'Schema:', CHAR(10),
        'products (product_id INT, product_name NVARCHAR(100), price DECIMAL(10,2), category NVARCHAR(50))',
        CHAR(10),
        'sales (sale_id INT, product_id INT, quantity INT, sale_date DATE)',
        CHAR(10), CHAR(10),
        'Question: ', @user_question,
        CHAR(10),
        'Generate only the SQL query, no explanations.'
    );
    
    -- Call GPT-4 to generate SQL
    DECLARE @request NVARCHAR(MAX) = JSON_OBJECT(
        'messages': JSON_ARRAY(
            JSON_OBJECT('role': 'system', 'content': 'You are a SQL query generator.'),
            JSON_OBJECT('role': 'user', 'content': @prompt)
        ),
        'max_tokens': 500
    );
    
    DECLARE @response NVARCHAR(MAX);
    EXEC sp_invoke_external_rest_endpoint
        @url = N'https://myopenai.openai.azure.com/openai/deployments/gpt-4/chat/completions?api-version=2024-02-15-preview',
        @method = 'POST',
        @credential = [MyAzureOpenAICredential],
        @payload = @request,
        @response = @response OUTPUT;
    
    -- Extract the generated SQL
    SET @sql_query = JSON_VALUE(@response, '$.result.choices[0].message.content');
    SET @context = 'Query generated successfully';
END;

存储过程 使用 GPT-4 将自然语言问题翻译成 SQL 查询,从而允许对数据进行对话访问。

实施安全防护措施

安全防护措施可防止 AI 生成的 SQL 查询执行不正确的作,例如删除或修改数据,确保仅对数据库进行只读访问。

添加验证以确保生成的 SQL 安全:

CREATE PROCEDURE sp_SafeConversationalQuery
    @user_question NVARCHAR(MAX),
    @results NVARCHAR(MAX) OUTPUT
AS
BEGIN
    DECLARE @sql_query NVARCHAR(MAX);
    DECLARE @context NVARCHAR(MAX);
    
    -- Generate SQL from natural language
    EXEC sp_ConversationalQuery @user_question, @context OUTPUT, @sql_query OUTPUT;
    
    -- Validate the generated SQL
    IF @sql_query LIKE '%DROP%' 
        OR @sql_query LIKE '%DELETE%'
        OR @sql_query LIKE '%UPDATE%'
        OR @sql_query LIKE '%INSERT%'
        OR @sql_query LIKE '%ALTER%'
        OR @sql_query LIKE '%CREATE%'
    BEGIN
        SET @results = JSON_OBJECT('error': 'Generated query contains potentially unsafe operations');
        RETURN;
    END;
    
    -- Execute the query safely (read-only)
    BEGIN TRY
        EXEC sp_executesql @sql_query;
    END TRY
    BEGIN CATCH
        SET @results = JSON_OBJECT(
            'error': ERROR_MESSAGE(),
            'query': @sql_query
        );
    END CATCH;
END;

此包装器添加了安全检查以防止破坏性作,确保用户只能查询数据,而不能对其进行修改。

创建多轮次对话

多轮对话允许用户与您的数据展开自然的上下文对话,支持在维护对话历史记录的基础上提出后续问题,而无需重复上下文。

以下示例构建了一个对话式 AI,该 AI 能够在多次交互中保持上下文,从而能够回答后续问题并与你的数据进行自然对话:

CREATE TABLE conversation_history (
    conversation_id UNIQUEIDENTIFIER DEFAULT NEWID(),
    user_id NVARCHAR(100),
    turn_number INT,
    user_message NVARCHAR(MAX),
    assistant_message NVARCHAR(MAX),
    timestamp DATETIME2 DEFAULT GETDATE(),
    PRIMARY KEY (conversation_id, turn_number)
);

CREATE PROCEDURE sp_ConversationalChat
    @conversation_id UNIQUEIDENTIFIER,
    @user_id NVARCHAR(100),
    @user_message NVARCHAR(MAX),
    @response NVARCHAR(MAX) OUTPUT
AS
BEGIN
    -- Get conversation history
    DECLARE @history NVARCHAR(MAX);
    
    SELECT @history = STRING_AGG(
        JSON_OBJECT(
            'role': CASE WHEN turn_number % 2 = 1 THEN 'user' ELSE 'assistant' END,
            'content': CASE WHEN turn_number % 2 = 1 THEN user_message ELSE assistant_message END
        ),
        ','
    )
    FROM conversation_history
    WHERE conversation_id = @conversation_id
    ORDER BY turn_number;
    
    -- Build messages array with history
    DECLARE @messages NVARCHAR(MAX) = CONCAT('[', @history, ',', 
        JSON_OBJECT('role': 'user', 'content': @user_message), ']');
    
    -- Call GPT-4 with conversation context
    DECLARE @chat_request NVARCHAR(MAX) = JSON_OBJECT('messages': @messages);
    
    EXEC sp_invoke_external_rest_endpoint
        @url = N'https://myopenai.openai.azure.com/openai/deployments/gpt-4/chat/completions?api-version=2024-02-15-preview',
        @method = 'POST',
        @credential = [MyAzureOpenAICredential],
        @payload = @chat_request,
        @response = @response OUTPUT;
    
    -- Extract and store the response
    DECLARE @assistant_response NVARCHAR(MAX) = JSON_VALUE(@response, '$.result.choices[0].message.content');
    
    -- Save to conversation history
    DECLARE @next_turn INT = (SELECT ISNULL(MAX(turn_number), 0) + 1 FROM conversation_history WHERE conversation_id = @conversation_id);
    
    INSERT INTO conversation_history (conversation_id, user_id, turn_number, user_message, assistant_message)
    VALUES (@conversation_id, @user_id, @next_turn, @user_message, @assistant_response);
    
    SET @response = @assistant_response;
END;

使用 AI 工具提高开发人员工作效率

SQL Server 2025 与新式开发工具集成,以加速 AI 应用程序开发。

将适用于 Visual Studio Code 的 MSSQL 扩展与 GitHub Copilot 配合使用

Visual Studio Code 的 MSSQL 扩展包括 GitHub Copilot 集成,为数据库开发提供 AI 支持的帮助。

注释

GitHub Copilot 与 MSSQL 扩展的集成目前为预览版。 特性和功能可能会更改。 有关最新信息,请参阅 MSSQL 扩展文档

GitHub Copilot 集成工具为数据库开发任务提供代码辅助。

  • 查询生成: 使用自然语言描述所需内容,获取 T-SQL 代码
  • 查询优化: 获取有关提高查询性能的建议
  • 架构探索: 询问有关数据库架构的问题
  • 迁移帮助: 生成用于架构更改和数据迁移的脚本
  • 解释: 使用 AI 生成的解释了解复杂的查询

以下示例演示 GitHub Copilot 如何从自然语言注释生成完整的存储过程:

-- Type a comment describing what you want
-- Generate a stored procedure that finds products similar to a given product using vector search

-- GitHub Copilot suggests:
CREATE PROCEDURE sp_FindSimilarProducts
    @product_id INT,
    @top_n INT = 5
AS
BEGIN
    DECLARE @query_embedding VECTOR(1536);
    
    -- Get the embedding of the reference product
    SELECT @query_embedding = embedding
    FROM products
    WHERE product_id = @product_id;
    
    -- Find similar products
    SELECT TOP (@top_n)
        product_id,
        product_name,
        category,
        price,
        VECTOR_DISTANCE('cosine', @query_embedding, embedding) AS similarity_score
    FROM products
    WHERE product_id != @product_id
    ORDER BY similarity_score;
END;

将 Entity Framework Core 与 AI 功能配合使用

Entity Framework Core 可用于使用 SQL Server 生成 AI 应用程序。 可以使用原始 SQL 查询来处理 SQL Server 的 VECTOR 数据类型和 AI 函数:

由于 Entity Framework Core 本身不支持 VECTOR 数据类型,因此此示例用于 FromSqlRaw 直接执行 T-SQL,同时受益于 EF Core 的异步作和对象映射。 该方法将嵌入到 JSON 的查询序列化、使用 VECTOR_DISTANCE矢量相似性搜索,并返回具有类似嵌入的产品,非常适合建议系统和语义搜索。

using Microsoft.EntityFrameworkCore;
using System.Text.Json;

public class Product
{
    public int ProductId { get; set; }
    public string ProductName { get; set; }
    public string Description { get; set; }
    public decimal Price { get; set; }
}

public class AppDbContext : DbContext
{
    public DbSet<Product> Products { get; set; }
}

// Query with vector similarity using raw SQL
public async Task<List<Product>> FindSimilarProducts(float[] queryEmbedding, int topN = 5)
{
    var embeddingJson = JsonSerializer.Serialize(queryEmbedding);
    
    var similarProducts = await _context.Products
        .FromSqlRaw(@"
            SELECT TOP {0} 
                product_id, 
                product_name, 
                description, 
                price
            FROM products
            WHERE VECTOR_DISTANCE('cosine', CAST({1} AS VECTOR(1536)), embedding) < 0.5
            ORDER BY VECTOR_DISTANCE('cosine', CAST({1} AS VECTOR(1536)), embedding)
        ", topN, embeddingJson)
        .ToListAsync();
    
    return similarProducts;
}

与 Microsoft Fabric 集成

Microsoft Fabric 提供了一个统一的分析平台,用于补充 SQL Server 的 AI 功能。 SQL Server 2025 支持 数据库镜像到 Microsoft Fabric,无需传统 ETL 管道的复杂性即可对作数据进行近实时分析。

SQL Server 2025 到 Microsoft Fabric 数据库镜像的示意图。

关系图显示镜像到 Microsoft Fabric 的 SQL Server 2025 数据库。 在左侧,SQL Server 2025 数据库持续将数据复制到 Microsoft Fabric OneLake。 该图演示了零 ETL 体系结构,其中操作数据流向分析平台。

配置 Fabric 镜像

Fabric 镜像是通过 Microsoft Fabric 门户使用可视化界面进行配置的。 镜像功能以 Delta Lake 格式将数据持续复制到 Fabric 的 OneLake,使其可用于分析,而不会影响作运营工作负载。

注释

有关分步配置说明,请参阅 教程:从 SQL Server 配置 Microsoft Fabric 镜像数据库

Fabric 镜像的一些优点包括:

  • 准实时分析: 数据更改会持续复制,延迟最小
  • Zero-ETL 体系结构: 无需生成和维护复杂的数据管道
  • 打开数据格式: 数据以 Delta Lake 格式存储在 OneLake 中,以便实现广泛的工具兼容性
  • AI 就绪分析:与 Fabric 的 AI 和机器学习功能直接集成
  • SQL 分析终结点: 使用熟悉的 T-SQL 语法查询镜像数据
  • 无操作影响: 镜像使用更改跟踪,而不会影响生产工作负荷

优化镜像性能

配置镜像后,可以使用 SQL Server 的资源 调控器 来管理其对作工作负荷的性能影响:

下面的代码示例创建一个资源调控器配置,用于限制 Fabric 镜像作使用的 CPU 和内存资源。

-- Create resource pool for mirroring
CREATE RESOURCE POOL FabricMirrorPool
WITH (
    MIN_CPU_PERCENT = 5,
    MAX_CPU_PERCENT = 20,
    MIN_MEMORY_PERCENT = 5,
    MAX_MEMORY_PERCENT = 20
);

-- Create workload group for mirroring
CREATE WORKLOAD GROUP FabricMirrorGroup
WITH (
    IMPORTANCE = MEDIUM
)
USING FabricMirrorPool;

-- Apply classifier function
CREATE FUNCTION dbo.FabricMirrorClassifier()
RETURNS SYSNAME
WITH SCHEMABINDING
AS
BEGIN
    DECLARE @workload_group SYSNAME = 'default';
    
    IF APP_NAME() LIKE '%Fabric Mirror%'
        SET @workload_group = 'FabricMirrorGroup';
    
    RETURN @workload_group;
END;

-- Enable resource governor
ALTER RESOURCE GOVERNOR 
WITH (CLASSIFIER_FUNCTION = dbo.FabricMirrorClassifier);

ALTER RESOURCE GOVERNOR RECONFIGURE;

在此示例中,资源池 FabricMirrorPool 限制镜像在 CPU 和内存的 5-20% 之间使用,从而阻止它影响生产工作负荷。 分类器函数根据应用程序名称标识镜像会话,并将其路由到专用工作负荷组,确保作和分析工作负荷的资源分配和可预测的性能一致。

资源调控器可确保 Fabric 镜像不会影响操作工作负荷。

优化 AI 应用程序性能

性能对于生产 AI 应用程序至关重要。

优化矢量搜索查询

使用查询提示和索引优化:

优化矢量搜索性能对于生产 AI 应用程序至关重要,其中响应时间直接影响用户体验。

以下示例演示了两种关键优化技术:创建以特定数据子集(如产品类别)为目标的筛选 矢量索引 ,并使用 查询提示 来控制执行行为。

筛选的索引 idx_electronics_embedding 通过仅为相关矢量编制索引、减少搜索空间并提高查询速度,从而加速电子类别中的搜索。 该 MAXDOP 4 提示将并行处理限制为四个线程,将性能与资源消耗平衡,这对于防止矢量搜索垄断服务器资源和影响其他工作负荷至关重要。

-- Create filtered vector index for specific categories
CREATE VECTOR INDEX idx_electronics_embedding 
ON products(embedding)
WHERE category = 'Electronics';

-- Use query hints for better performance
DECLARE @query_embedding VECTOR(1536) = AI_GENERATE_EMBEDDINGS(@user_query USE MODEL Ada2Embeddings);

SELECT TOP 10
    product_id,
    product_name,
    VECTOR_DISTANCE('cosine', @query_embedding, embedding) AS score
FROM products WITH (INDEX(idx_electronics_embedding))
WHERE category = 'Electronics'
ORDER BY score
OPTION (MAXDOP 4);

可以使用索引和查询提示来优化特定方案的矢量搜索。

遵循这些做法并使用 SQL Server 2025 的 AI 功能,可以构建、部署和运营生产就绪型应用程序,这些应用程序可提供真正的业务价值,同时维护企业安全、性能和可靠性标准。