HarmonySmartCoding RAG功能实现详解

项目概述

本文介绍了HarmonySmartCoding项目中RAG(Retrieval-Augmented Generation)功能的完整实现,该功能为开发者提供了智能的API文档检索和问答服务。通过结合向量检索和语义理解,用户可以通过自然语言查询快速找到相关的HarmonyOS API文档和代码示例。

技术架构

整体架构设计

前端 (Vue.js) ←→ 后端 (Flask) ←→ RAG引擎 (BGE模型)
     ↓                ↓              ↓
  用户界面         API接口        向量数据库

核心组件

  1. 前端界面 (PureRAG.vue): 提供用户交互界面
  2. 后端API (app.py): 处理HTTP请求和响应
  3. RAG引擎 (rag_engine.py): 核心检索逻辑
  4. 样式系统 (pureRAG.scss): 界面样式定义

后端实现

RAG引擎核心 (rag_engine.py)

class RAGEngine:
    def __init__(self, bge_model_path, docs_path, doc_ids_path, embeddings_path):
        # 加载本地 BGE 模型
        self.model = SentenceTransformer(bge_model_path)
        
        # 加载RAG数据库
        with open(docs_path, 'r', encoding='utf-8') as f:
            self.docs = json.load(f)
        with open(doc_ids_path, 'r', encoding='utf-8') as f:
            self.doc_ids = json.load(f)
        with open(embeddings_path, 'rb') as f:
            self.embeddings = pickle.load(f)

核心特性:

  • 使用BGE(BAAI General Embedding)模型进行文本向量化
  • 支持本地模型部署,确保数据安全性
  • 预计算文档向量,提高检索效率

检索算法实现

def search(self, query, top_k=3):
    """根据查询检索相关文档"""
    query_emb = self.get_query_embedding(query)
    
    # 计算余弦相似度
    sims = np.dot(self.embeddings, query_emb) / \
           (np.linalg.norm(self.embeddings, axis=1) * np.linalg.norm(query_emb) + 1e-8)
    
    top_indices = sims.argsort()[-top_k:][::-1]
    
    # 构建结果列表
    results = []
    for idx in top_indices:
        doc = self.docs[idx]
        doc_id = self.doc_ids[idx]
        score = float(sims[idx])
        results.append({
            "doc_id": doc_id,
            "title": doc.get("title", ""),
            "overview": doc.get("overview", ""),
            "sections": doc.get("sections", []),
            "score": score
        })
    
    return results

算法优势:

  • 使用余弦相似度计算文档相关性
  • 支持可配置的返回结果数量
  • 包含相似度评分,便于结果排序

Flask API接口 (app.py)

@app.route('/api/rag_query', methods=['POST'])
def rag_query():
    data = request.get_json()
    query = data.get('query', '')
    top_k = data.get('top_k', 3)
    
    if not query:
        return jsonify({'error': 'No query provided'}), 400
    
    try:
        # 执行RAG搜索
        results = rag_engine.search(query, top_k=top_k)
        
        # 格式化响应
        resp = rag_engine.format_api_response(query, results)
        
        return jsonify(resp)
    except Exception as e:
        return jsonify({'error': f'RAG 查询失败: {str(e)}'}), 500

接口特性:

  • RESTful API设计
  • 完善的错误处理机制
  • 支持CORS跨域请求
  • 详细的调试日志

前端实现

Vue组件架构 (PureRAG.vue)

<template>
  <div class="pure-rag-page" :class="{ 'dark-mode': isDarkMode }">
    <!-- 搜索区域 -->
    <div class="search-area">
      <div class="search-box">
        <input 
          v-model="searchQuery" 
          type="text" 
          placeholder="输入自然语言问题或API名称..." 
          @keyup.enter="performSearch"
          class="search-input"
        />
        <!-- 自动补全下拉框 -->
        <div v-if="showAutocomplete" class="autocomplete-dropdown">
          <!-- 智能建议项 -->
        </div>
      </div>
    </div>
    
    <!-- 内容展示区 -->
    <div class="page-content">
      <!-- 历史记录侧边栏 -->
      <div class="history-sidebar">
        <!-- 搜索历史 -->
      </div>
      
      <!-- 搜索结果区 -->
      <div class="result-content">
        <!-- 智能回答 -->
        <div class="answer-section">
          <h3>智能回答</h3>
          <div class="answer-content" v-html="formatAnswer(apiResult.answer)"></div>
        </div>
        
        <!-- 相关文档列表 -->
        <div class="relevant-docs-section">
          <h3>相关文档 ({{ apiResult.total_docs }})</h3>
          <div class="docs-list">
            <!-- 文档项展示 -->
          </div>
        </div>
      </div>
    </div>
  </div>
</template>

核心功能实现

1. 智能搜索
const performSearch = async () => {
  if (!searchQuery.value.trim()) return;
  
  loading.value = true;
  try {
    const response = await RAGService.query({
      query: searchQuery.value,
      top_k: 5
    });
    
    apiResult.value = response.data;
    // 保存搜索历史
    saveToHistory(searchQuery.value);
  } catch (error) {
    console.error('搜索失败:', error);
  } finally {
    loading.value = false;
  }
};
2. 自动补全功能
const handleInput = _.debounce(() => {
  const query = searchQuery.value.trim();
  
  if (!query) {
    showAutocomplete.value = false;
    return;
  }
  
  // 智能问答模式
  if (/如何|怎么|怎样/.test(query)) {
    const matchedKeywords = Object.keys(questionToApiMap)
      .filter(keyword => query.includes(keyword));
    
    if (matchedKeywords.length > 0) {
      autocompleteItems.value = matchedKeywords
        .flatMap(keyword => 
          questionToApiMap[keyword].map(api => ({
            text: `智能推荐:${api}`,
            type: 'smart',
            fullText: api,
            description: getAPIDescription(api)
          }))
        )
        .slice(0, 5);
      
      showAutocomplete.value = true;
    }
  }
}, 300);
3. 搜索历史管理
const saveToHistory = (query) => {
  const historyItem = {
    id: Date.now(),
    query: query,
    timestamp: new Date(),
    language: codeLanguage.value
  };
  
  history.value.unshift(historyItem);
  
  // 限制历史记录数量
  if (history.value.length > 50) {
    history.value = history.value.slice(0, 50);
  }
  
  // 持久化存储
  localStorage.setItem('rag_search_history', JSON.stringify(history.value));
};

样式系统 (pureRAG.scss)

响应式布局设计
.pure-rag-page {
  display: flex;
  flex-direction: column;
  height: 100%;
  background-color: var(--bg-color);
  
  .page-content {
    display: flex;
    flex: 1;
    overflow: hidden;
    
    .history-sidebar {
      width: 300px;
      min-width: 300px;
      border-right: 1px solid var(--border-color);
    }
    
    .result-content {
      flex: 1;
      overflow-y: auto;
      padding: 16px;
    }
  }
}
暗黑模式支持
:root {
  --primary-color: #4361ee;
  --text-color: #2d3748;
  --bg-color: #ffffff;
  --border-color: #e2e8f0;
}

.dark-mode {
  --primary-color: #4dabf7;
  --text-color: #e2e8f0;
  --bg-color: #1a202c;
  --border-color: #2d3748;
}

功能特性

1. 智能检索

  • 语义理解:基于BGE模型的语义向量检索
  • 多模态查询:支持自然语言问题和API名称查询
  • 相似度评分:提供检索结果的相关性评分

2. 用户体验

  • 实时搜索:输入即搜索,响应迅速
  • 自动补全:智能推荐相关API和问题
  • 搜索历史:保存和管理搜索记录
  • 暗黑模式:支持明暗主题切换

3. 内容展示

  • 结构化展示:清晰的文档结构和层次
  • 代码高亮:语法高亮的代码示例
  • 表格支持:完整的表格内容展示
  • 展开收起:可折叠的详细内容

4. 交互功能

  • 一键复制:快速复制代码和内容
  • 反馈机制:用户反馈和建议收集
  • 快捷操作:键盘快捷键支持

技术亮点

1. 本地化部署

  • 使用本地BGE模型,确保数据安全
  • 离线运行能力,不依赖外部API
  • 可定制化的模型配置

2. 高性能检索

  • 预计算文档向量,检索速度快
  • 向量化存储,内存使用效率高
  • 批量处理能力,支持大规模文档库

3. 前后端分离

  • RESTful API设计,接口清晰
  • 前端组件化开发,易于维护
  • 响应式设计,适配多种设备

4. 可扩展架构

  • 模块化设计,易于功能扩展
  • 配置化参数,灵活调整
  • 插件化接口,支持自定义功能

部署和使用

后端启动

# 安装依赖
pip install -r requirements.txt

# 启动Flask服务
python app.py

前端启动

# 安装依赖
npm install

# 启动开发服务器
npm run serve

配置说明

# config.py
BGE_MODEL_PATH = "./models/bge-small-zh-v1.5"
DOCS_PATH = "./data/rag_db/docs.json"
DOC_IDS_PATH = "./data/rag_db/doc_ids.json"
EMBEDDINGS_PATH = "./data/rag_db/embeddings.pkl"

总结

本RAG功能实现展示了现代AI应用开发的完整流程,从后端的向量检索引擎到前端的用户交互界面,每个环节都经过精心设计和优化。通过结合语义理解和传统检索技术,为开发者提供了高效、准确的API文档查询服务。

该实现不仅在技术上具有先进性,在用户体验上也做了大量优化,包括智能补全、搜索历史、暗黑模式等功能,做到了技术与体验的结合。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值