
# 基于DWS构建RAG框架生成行业调研报告
在企业战略研判、行业竞品分析、政策研究等场景中，调研人员通常需要从大量行业报告、新闻稿、研究论文等长文本语料中提取关键信息，整合生成结构化的调研报告。然而，传统的人工撰写方式面临以下困难：
- **数据规模庞大**：一份调研报告往往需要阅读数十篇甚至上百篇长文档，人工筛选与整理耗时耗力。
- **信息碎片化**：关键信息散落在不同文档的不同章节中，难以快速定位和关联。
- **效率与一致性难以兼顾**：不同人员撰写的报告风格和深度差异大，质量参差不齐。
如何从海量语料中高效、准确地提取相关内容并自动生成高质量调研报告，成为企业亟待解决的问题。
DWS集成了**pgai** 和**pgvector** 插件，支持在数据库内直接调用**大语言模型（LLM）** **和Embedding模型** ，并提供向量存储与近似检索能力。基于DWS构建**RAG（Retrieval-Augmented Generation，检索增强生成）框架**，可以实现"语料入库 \> 智能分块 \> 向量检索 \> LLM生成"的端到端自动化流程，从而在保证内容可溯源的同时，显著提升调研报告的生成效率与质量。
#### 基本概念
在阅读本文档前，建议了解以下核心概念：
- **RAG（Retrieval-Augmented Generation，检索增强生成）：**
  一种将信息检索与大语言模型生成相结合的技术范式。核心思想是在LLM生成文本前，先从外部知识库中检索与任务相关的信息，将其作为上下文注入生成过程，从而缓解LLM幻觉和知识滞后问题。
  
- **LLM（Large Language Model，大语言模型）** ：
  基于深度学习的大规模预训练语言模型，能够根据输入的提示文本生成连贯的自然语言内容。本方案中用于根据检索到的文本块生成调研报告。
  
- **向量**
  将文本、图像等非结构化数据通过数学方式映射为固定维度的数值数组（如\[0.12, 0.34, -0.21, ...\]），使计算机能够通过数值计算来衡量数据之间的语义相似度。例如描述一个人的年龄、身高、体重，可以用\[30, 175, 70\]这个三维向量表示，让计算机可以理解其语义特征。
  
- **Embedding（向量化/嵌入）** ：
  将非结构化数据（如文本）转换为向量的过程，通常借助大语言模型（如BERT、GPT等）完成。Embedding后的向量能够保留原始数据的语义信息，语义相近的文本在向量空间中距离也相近，使得通过向量相似度比较即可实现语义级别的文本检索。
  
- **Chunk（文本分块）** ：
  将长文本按照一定粒度切分为语义完整的短文本片段的过程。分块后的文本便于向量化处理和精确检索，避免长文本整体向量导致的语义模糊。
  
- **ANN（Approximate Nearest Neighbor，近似最近邻）**
  一种在高维向量空间中快速查找与目标向量最相似的Top-K向量的算法。相比精确搜索，ANN以极小的精度损失换取数量级的性能提升，适合大规模向量检索场景。
  
- **pgai**：DWS集成的AI插件，支持在数据库内调用LLM和Embedding模型，并提供文本分块（chunk_text_recursively）、文本排序（rank）、文本生成（openai_chat_complete）、向量化（openai_embed）等AI Functions。
- **pgvector**：DWS集成的向量存储与检索插件，提供vector数据类型和基于HNSW算法的向量索引，支持高效的近似最近邻搜索(ANN)。
 
#### 约束与限制
- DWS版本需为9.1.1.200及以上。如需使用，请联系技术支持设置GUC参数**feature_support_options** 为**enable_pgvector** 、**enable_pgai_extension**。
- 如果是存算分离集群，pgvector扩展功能（CREATE EXTENSION语句）仅支持在主VW上执行。
 
#### 前提条件
- 已创建DWS集群，且集群状态为"可用"。如需创建集群，请参见[创建DWS集群](https://support.huaweicloud.com/mgtg-dws/dws_01_0019.html)。
- **使用本功能前，请先联系技术支持安装pgai插件。**
- **模型API** ：需提前准备好可访问的大模型API服务（兼容OpenAI接口规范），并获取有效的Base URL和API Key。API服务需提供以下模型能力：
  - Embedding模型：用于文本向量化（如text-embedding-ada-002等）。
  
  - Chat模型：用于文本生成与排序（如GPT-4、GPT-3.5-turbo等）。
   
- **网络连通**：DWS集群需能访问模型API服务地址。若API服务部署在公网，需确保集群已配置公网访问能力；若使用华为云ModelArts等服务，需确保VPC网络互通。
 
#### 基于DWS构建的RAG架构
**Naive RAG**
Naive RAG框架的核心思想是：在大语言模型（LLM）生成文本前，先通过检索模块从外部知识库中获取与任务高度相关的信息，并将其作为上下文注入生成过程。这一机制有效缓解了LLM幻觉、知识滞后和领域适配性弱等问题，特别适用于需依赖特定领域知识的复杂任务，如专业问答、长文档摘要、行业调研报告生成等。
- **检索阶段（Retrieval）**：根据用户输入的问题或提示，从预构建的知识库中检索出若干相关文本片段（如段落或文档块）。
- **生成阶段（Generation）**：将检索结果与原始查询组合为结构化提示（Prompt），交由LLM生成最终输出，确保回答内容有据可依、逻辑严谨。
![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002633115226.png "点击放大")
在系统初始化阶段，原始文本数据源（Data Sources）会被预处理并切分为语义完整的文本块（chunks）；每个chunk经Embedding模型转换为高维向量后，持久化存储于DWS中（借助pgvector的向量存储和HNSW索引能力）。
当接收到用户查询时，系统同步将查询文本编码为向量，并在DWS中执行近似最近邻搜索（ANN），召回语义最相关的Top-K文本块。这些检索结果与用户原始查询共同构成增强型Prompt，输入LLM以生成准确、可溯源的响应。
#### 步骤一：创建扩展与存储表
创建pgai和pgvector扩展，并建立用于存储长文本语料、分块文本向量及调研报告结果的数据表，为后续RAG流程提供数据存储基础。
1. 确认GUC参数feature_support_options已打开**enable_pgvector** 和***enable_pgai_extension***。请联系技术支持进行设置。
2. **联系技术支持部署pgai插件**。
3. 连接DWS数据库，创建所需扩展。 
   ```
   CREATE EXTENSION ai;
   CREATE EXTENSION pgvector;
   ```
   如提示以下类似报错，均是GUC参数未开通，请联系技术支持设置。
   ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002633480290.png "点击放大")
   如开通GUC参数后，提示以下错误，则是未安装pgai插件，请联系技术支持安装。
   ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002663878609.png "点击放大")
   
   

4. 创建长文本语料表。documents表中每一行代表一个长文本语料：id作为主键区分行，topic记录长文本语料的主题，content记录长文本语料的所有内容。 
   ```
   CREATE TABLE documents(
       id SERIAL PRIMARY KEY,
       topic text,
       content text
   );
   ```
   
   

5. 创建长文本向量化表。chunk_text表记录所有长文本分块后的内容：chunk记录分块后的文本内容，embedding记录分块后文本的向量表示。hnsw索引用于加速向量近似检索。 
   ```
   CREATE TABLE chunk_text(
       id SERIAL PRIMARY KEY,
       chunk text,
       embedding vector
   );
   CREATE INDEX ON chunk_text USING hnsw(embedding vector_cosine_ops);
   ```
   
   

6. 创建调研报告结果表。reports表每一行代表一篇调研报告，content中存储一篇调研报告的文本内容。 
   ```
   CREATE TABLE reports(
       id SERIAL PRIMARY KEY,
       content text
   );
   ```
   
   
#### 步骤二：配置模型API
为pgai函数配置模型API服务的连接信息和模型名称，使DWS能够调用外部大模型服务。
1. 请先准备好可调用的模型，例如华为云MaaS，参见相关[产品文档](https://support.huaweicloud.com/maas/index.html)进行购买。
2. 设置API服务的Base URL和API Key。 
   将baseurl替换为模型API服务的地址（如https://api.openai.com/v1），将apikey替换为有效的API Key。API Key将加密存储在DWS中。
   ```
   SELECT ai.dws_pgai_encrypt_info('baseurl', 'apikey');
   ```
   
   

3. 设置各AI函数所使用的模型名称。 
   ```
   -- 设置Embedding模型（用于文本向量化）
   SELECT ai.set_func_model('openai_embed', 'text-embedding-ada-002');
   -- 设置Chat模型（用于文本生成）
   SELECT ai.set_func_model('openai_chat_complete', 'gpt-4');
   -- 设置排序模型（用于文档粗筛）
   SELECT ai.set_func_model('rank', 'gpt-4');
   ```
   
   
 
#### 步骤三：导入实践测试数据
1. **导入长文本语料** 。将原始的长文本语料导入语料表documents，作为RAG检索的知识库。根据实际语料来源，可通过INSERT语句逐条导入，或使用DWS的批量导入工具（如\\copy命令、GDS导入等）从文件中批量加载。
   
   ```
   INSERT INTO documents(topic, content) VALUES ('数据库市场需求', '随着数字化转型的加速，全球数据库市场需求不断攀升。企业在数据驱动决策、提升效率和创新方面的需求推动了数据库技术的广泛应用。从传统的关系型数据库（RDBMS）到新兴的非关系型数据库（NoSQL），不同类型的数据库在各种行业中得到了应用，尤其是在金融、电商、医疗和物联网领域。尤其是大数据分析的普及，使得企业需要处理海量数据，并快速从中提取有价值的信息，这推动了对分布式数据库和高性能数据库的需求增长。此外，云计算的普及也是推动数据库市场需求的一个重要因素。越来越多的企业选择将数据库迁移到云端，利用云数据库的弹性和可扩展性来支持其快速发展的业务需求。根据市场研究公司Gartner的数据，2023年全球云数据库市场将达到约60亿美元，预计未来几年将继续增长。尤其是在企业对快速数据访问和分析的需求日益增加的背景下，数据库技术的角色变得愈发重要。从数据安全的角度来看，随着数据泄露事件的频发，数据库安全性已成为企业不可忽视的议题。越来越多的企业开始重视数据加密、身份验证、访问控制等安全功能，这对数据库厂商提出了更高的技术要求。企业不仅希望从数据库中获得高效的数据处理能力，还要求其具备强大的安全保护能力。');
   INSERT INTO documents(topic, content) VALUES ('数据库技术热点', '近年来，数据库技术持续创新，出现了一些显著的技术热点。首先，分布式数据库逐渐成为技术发展的主流。随着云计算、大数据以及人工智能的不断发展，传统的单机数据库难以满足处理海量数据的需求。分布式数据库通过将数据存储和计算任务分配到多个节点，提供了更高的可扩展性和容错能力。其次，多模态数据库和图数据库正在引领数据库技术的另一个热点。多模态数据库能够支持不同的数据模型（如文档型、关系型、图形、列存储等），使得企业能够在同一个平台上处理各种类型的数据。图数据库，因其在社交网络、推荐系统和路径分析等领域的强大优势而受到越来越多企业的关注。另外，随着 人工智能（AI） 和 机器学习（ML） 的发展，智能数据库成为了一个新兴趋势。智能数据库通过集成AI功能，能够自动化数据处理过程，包括自动索引优化、查询优化、异常检测等。这不仅提高了数据库的效率，还帮助用户降低了维护成本。Serverless 和 无服务器数据库也是当前的热点技术之一，特别是在云数据库领域。这种架构使得用户只需为使用的计算资源付费，而无需管理和维护数据库实例。无服务器架构简化了数据库管理，特别适合短期、大量负载波动的应用场景。');
   INSERT INTO documents(topic, content) VALUES ('数据库未来方向', '未来，数据库行业将朝着更高效、更智能、更安全的方向发展。一方面，随着数据量的剧增，自动化和智能化将成为未来数据库技术发展的重要方向。AI和ML的集成将使得数据库能够自主学习、优化自身的性能，例如通过预测查询负载、自动调整索引等方式来提升整体效率。数据库的自动化管理也将大大减轻开发人员和运维人员的负担，提升企业的生产力。云数据库的进一步普及和无服务器架构的推广也是未来的关键发展趋势。随着更多企业采用混合云和多云架构，云数据库的弹性、扩展性和成本效益将成为企业选择云数据库的主要动力。云数据库不仅能够支持高效的数据存储，还能够为企业提供高可用性、容错性和灾难恢复能力。此外，随着 数据隐私保护 和 合规性要求 的不断提高，数据库厂商将不断增强数据加密、访问控制和审计等功能。区块链技术也有望在数据库领域得到应用，通过去中心化的方式提升数据安全性和透明度，尤其是在涉及敏感数据和财务数据的场景中。边缘计算的兴起也将影响数据库技术的发展。未来的数据库不仅仅会在数据中心中运行，还将能够在网络边缘设备上运行，支持实时数据处理和低延迟的应用场景，特别是在物联网（IoT）和智能设备领域，数据库将具备更强的边缘计算能力。');
   INSERT INTO documents(topic, content) VALUES ('数据库营收状态', '近年来，数据库市场的营收状态整体呈现出稳定增长的态势。根据IDC和Gartner的数据显示，2022年全球数据库市场的整体规模达到了近500亿美元。随着数字化转型的推进，企业对数据库的需求不断增长，预计未来几年这一市场将继续扩展。云数据库的普及尤其推动了市场的增长，许多大型云服务提供商的云数据库产品不断取得市场份额，成为营收增长的重要来源。其中，数据库即服务（DBaaS）作为云计算的一个重要分支，正在成为最具增长潜力的市场之一。DBaaS能够为企业提供即插即用的数据库服务，减少了企业在硬件、软件、运维等方面的投入。因此，DBaaS已成为一些数据库厂商（如 MongoDB、Snowflake）的主要营收来源。在传统数据库厂商中，如 Oracle 和 Microsoft SQL Server，尽管其依然在全球市场占据领先地位，但其增长速度相对放缓。为了应对云数据库的挑战，这些传统厂商也在逐步将其数据库产品转向云端，提供混合云数据库和云数据库服务。此外，随着更多企业将数据存储和计算需求迁移到云端，NoSQL 数据库和 NewSQL 数据库的兴起为市场提供了新的增长动力。随着大数据和人工智能应用场景的增加，这些数据库产品的市场需求也在不断扩大，进一步推动了数据库行业的营收增长。');
   ```
   
   
2. **粗筛相关文档** 。使用rank函数先对documents表中的topic与用户问题进行粗略的相关性匹配，返回相关性最高的5个长文本语料，再利用chunk_text_recursively函数划分chunk，存入chunk_text表中。
   
   ```
   WITH topics AS (
       SELECT array_agg(topic) AS topics_array
       FROM documents
   ),
   rank_result AS (
       SELECT 
           ai.rank('请生成一份2020年到2025年数据库行业的发展情况的调研报告，重点涵盖市场需求、技术热点和未来方向三个方面', topics_array) AS result
       FROM topics
   ),
   rank_score AS (
       SELECT 
           (jsonb_each_text(result)).key AS content,
           (jsonb_each_text(result)).value AS score
       FROM rank_result
   ),
   related_documents AS (
       SELECT content, score
       FROM rank_score
       ORDER BY score DESC
       LIMIT 5
   )
   INSERT INTO chunk_text (chunk)
   SELECT unnest(ai.chunk_text_recursively(rd.content, 300)) AS chunk
   FROM related_documents rd;
   ```
   
   
3. 将文本分块（chunk）进行向量化。将每个chunk经Embedding模型转换为高维向量，持久化存储于DWS。 
   ```
   UPDATE chunk_text
   SET embedding = ai.openai_embed(chunk)::VECTOR;
   ```
   
   
 
#### 步骤四：生成调研报告
1. **检索相似chunk并生成调研报告** 。
   
   ```
   WITH query_embedding AS (
       SELECT ai.openai_embed('请生成一份2020年到2025年数据库行业的发展情况的调研报告，重点涵盖市场需求、技术热点和未来方向三个方面')::VECTOR AS embedding
   ),
   similarity_chunks AS (
       SELECT 
           ct.id, 
           ct.chunk, 
           (ct.embedding <=> qe.embedding) AS similarity
       FROM 
           chunk_text ct, query_embedding qe
       ORDER BY similarity
       LIMIT 10
   ),
   chunks AS (
       SELECT string_agg(chunk, ' ') AS concatenated_chunks
       FROM similarity_chunks
   ),
   report AS (
       SELECT ai.openai_chat_complete(
           jsonb_build_array(
               jsonb_build_object(
                   'role', 'system', 
                   'content', '请基于我给你的问题和文本内容生成一份调研报告'
               ),
               jsonb_build_object(
                   'role', 'user', 
                   'content', '请生成一份2020年到2025年数据库行业的发展情况的调研报告，重点涵盖市场需求、技术热点和未来方向三个方面 ' || concatenated_chunks
               )
           )
       ) AS report_content
       FROM chunks
   )
   INSERT INTO reports (content)
   SELECT report_content FROM report;
   ```
   
   
2. **查看生成结果** **。** 示例的结果是将Markdown格式以纯文本的形态存入reports表中，可以直接导出content保存为.md文件。
   
   ```
   SELECT * FROM reports;
   ```
   
   
 
#### 导出的Markdown格式展示
以下为reports表中，content列导出文本数据的Markdown展示。（报告中具体数值在本示例中仅供参考，不代表具体真实结果）
![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002633405244.png "点击放大")
