【项目实训】【项目博客#09】HarmonySmartCodingSystem系统后端智能API检索与代码助手实现(6.2-6.15)

文章目录

  • 【项目实训】【项目博客#09】HarmonySmartCodingSystem系统后端智能API检索与代码助手实现(6.2-6.15)
    • 项目博客概述
    • 一、整体架构设计
      • 1.1 系统模块组成
      • 1.2 整体流程设计
    • 二、API文档RAG检索系统实现
      • 2.1 RAG技术原理与优化
      • 2.2 RAG引擎核心实现
      • 2.3 回答生成与引用机制
      • 2.4 API接口实现
    • 三、智能代码文件助手实现
      • 3.1 代码替换服务设计
      • 3.2 代码助手请求实现
      • 3.3 提示词设计与后端API实现
      • 3.4 前端UI组件实现
    • 四、基于微调大模型的代码生成系统
      • 4.1 后端技术选型与实现

项目博客概述

在HarmonySmartCoding项目中,为提升开发者的编码效率和API学习体验,我们设计实现了一套包含RAG检索系统、智能代码助手和代码生成系统的开发辅助平台。本文将重点介绍各个系统模块的设计实现,包括API文档RAG检索后端、智能代码文件助手以及基于微调大模型的代码生成系统,展示如何通过AI技术提升HarmonyOS应用开发效率。

一、整体架构设计

1.1 系统模块组成

开发智能辅助系统由三个主要模块组成:

  1. API文档RAG检索系统

    • 基于检索增强生成的API文档智能问答
    • BGE-M3文本向量化和相似度检索
    • DeepSeek大模型问答生成
  2. 智能代码文件助手

    • 基于AI的代码修改建议生成
    • 自动代码替换与文件管理
    • 交互式代码编辑界面
  3. 微调大模型代码生成

    • 基于LoRA技术的大模型微调
    • 本地代码生成推理服务
    • 前端代码生成与编辑界面

1.2 整体流程设计

系统的整体工作流程如下:

  1. 开发者需求输入:开发者通过统一界面输入API查询、代码修改需求或代码生成需求
  2. 智能路由分发:系统根据请求类型分发到对应模块
  3. 并行请求处理:各模块独立处理请求,返回结果
  4. 结果整合展示:统一界面整合展示不同模块的结果,提供一体化体验

二、API文档RAG检索系统实现

2.1 RAG技术原理与优化

RAG(检索增强生成)系统通过检索相关文档内容作为上下文,增强大模型的回答能力。我们的系统实现了以下优化:

  1. 检索质量优化:采用BGE-M3模型替代原有向量化模型,提高语义理解能力
  2. 上下文构建优化:改进文档片段的选择和组织方式
  3. 引用追踪机制:新增文档引用标记系统,使生成的回答可溯源到具体文档

2.2 RAG引擎核心实现

以下是RAG引擎初始化的关键代码:

def __init__(self, bge_model_path, docs_path, doc_ids_path, embeddings_path, doc_links_path=None, api_summaries_path=None):# 加载本地 BGE 模型self.model = SentenceTransformer(bge_model_path)# 初始化DeepSeek客户端self.deepseek_client = DeepSeekOfficialClient()# 加载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)# 加载文档链接和API摘要# ... 省略部分代码 ...

查询向量化实现:

def get_query_embedding(self, query):"""使用本地 BGE 模型获取查询的向量表示"""embedding = self.model.encode([query], normalize_embeddings=True)emb = embedding[0]  # 取第一个结果return emb

文档检索实现:

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:# ... 处理文档内容和链接 ...

2.3 回答生成与引用机制

回答生成模块使用DeepSeek大模型,结合检索结果生成最终回答:

def generate_answer_from_docs(self, query, docs):"""基于检索到的文档使用DeepSeek生成智能回答"""if self.deepseek_client:# 构建上下文context = ""for i, doc in enumerate(docs):doc_content = self.extract_doc_content(doc)context += f"文档{i+1} (【DOC{i+1}】):\n{doc_content}\n\n"# 构建提示词prompt = f"""请基于以下HarmonyOS API文档内容回答用户的问题。引用格式要求:1. 引用文档内容时,必须使用特殊标记【DOC1】、【DOC2】等...用户问题: {query}文档内容:{context}"""# 调用模型生成回答# ... 省略部分代码 ...

2.4 API接口实现

@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'}), 400try:# 执行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

三、智能代码文件助手实现

3.1 代码替换服务设计

代码替换服务是智能代码文件助手的核心组件,负责解析AI生成的代码修改建议,并应用到实际文件中:

// 处理生成的代码 - 移除注释标记
export const processGeneratedCode = (code: string): string => {// 移除"// ... existing code ..."注释行return code.split('\n').filter(line => !line.trim().startsWith('// ... existing code ...')).join('\n');
};

3.2 代码助手请求实现

代码助手请求的核心是将用户需求和上下文文件发送给后端API,并处理返回的响应:

// 代码助手请求实现(简化版)
static async generateCodeAssistant(request: CodeAssistantRequest): Promise<CodeGenerationResponse> {try {// 发送请求到后端APIconst response = await axios.post(`${this.apiUrl}/code_assistant`, request);return {code: response.data.result || '',suggestions: response.data.suggestions};} catch (error) {// 处理请求失败的情况,返回友好的错误消息// ...}
}

3.3 提示词设计与后端API实现

提示词设计是智能代码文件助手的关键部分,它直接影响了AI生成代码的质量和格式:

# 提示词构建函数(简化版)
def get_code_assistant_prompt(user_input, language='', api_version='', selected_files=None):# 读取提示词模板prompt_template = read_prompt_template()# 添加选中的文件内容selected_files_str = format_selected_files(selected_files)# 组合最终提示词final_prompt = f"{prompt_template}\n\n用户需求: {user_input} {selected_files_str}"return final_prompt

代码助手API的实现是后端服务的核心:

@app.route('/api/code_assistant', methods=['POST'])
def code_assistant():# 获取请求数据data = request.get_json()prompt = data.get('prompt', '')# ...try:# 构建提示词assistant_prompt = get_code_assistant_prompt(prompt, language, api_version, selected_files)# 调用DeepSeek客户端messages = [{"role": "user", "content": assistant_prompt}]result = ds_client.chat_completion(messages, temperature=0.7)# 移除思考标签result = remove_think_tags(result)# 保存请求历史db = get_db()db.save_snippet(f"智能助手: {prompt[:30]}", result, "assistant")return jsonify({'result': result})except Exception as e:# 处理异常情况# ...

3.4 前端UI组件实现

输出面板组件是智能代码文件助手的用户界面,主要功能区域包括:

  1. 用户输入区:采用可扩展的文本输入框,支持多行输入
  2. 文件选择区:直观的文件选择交互,支持添加和删除文件
  3. 结果展示区:使用语法高亮显示代码修改建议
  4. 操作区:提供应用、忽略等操作按钮

文件修改建议展示区实现:

<!-- 文件修改建议展示区(简化版) -->
<div class="file-changes-container"><div class="file-changes-list"><!-- 遍历所有文件修改建议 --><div v-for="change in parsedFileChanges" class="file-change-item"><!-- 文件路径和操作按钮 --><!-- 代码预览(使用语法高亮) --></div></div>
</div>

四、基于微调大模型的代码生成系统

4.1 后端技术选型与实现

代码生成系统后端基于Flask搭建,集成LoRA微调的大语言模型:

@app.route('/api/generate', methods=['POST'])
def generate_code():print("[DEBUG] 收到/generate_code请求")data = request.get_json()print(f"[DEBUG] 请求内容: {data}")prompt = data.get('prompt', '')

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/87634.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/87634.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/87634.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【JVM】- 类加载与字节码结构3

类加载阶段 1. 加载 加载&#xff1a;将类的字节码载入方法区中&#xff0c;内部采用C的instanceKlass描述java类。如果这个类的父类还没加载&#xff0c;则先加载父类加载和链接可能是交替运行的 通过全限定名获取字节码 从文件系统&#xff08;.class 文件&#xff09;、JA…

Qt蓝图式技能编辑器状态机模块设计与实现

设计概述 这个模块是一个基于Qt的蓝图式技能编辑器状态机&#xff0c;主要用于游戏开发中的技能状态管理。核心功能包括&#xff1a; 状态节点&#xff08;开始、结束、普通状态&#xff09;的可视化 状态间连线的绘制与管理 状态转换逻辑的可视化编辑 动作选择与配置 核…

Unity AR识别物体的内容语音读取+使用说明功能

因之前一直在开发项目&#xff0c;断断续续写了一点博客&#xff0c;最后统一写了一下博客记录学习内容。 可以看到我的工作一直在进行。 目录 一、识别内容语音读取 二、点击齿轮按钮弹出使用说明界面 开发步骤 1. 创建齿轮按钮 UI 2. 创建使用说明面板 UI 3. 编写控制…

Unable to start embedded Tomcat

通常是由于xml文件配置错误导致 1. mapper 指向错误 <resultMap id"Waybill" type"c.Waybill"> 2. 字段类型错误 <result column"wstatus" property"stus" javaType"TINYINT"/>TINYINT 是数据库类型<resu…

Mac电脑 充电限制保护工具 AlDente Pro

AlDente Pro一款充电限制保护工具&#xff0c;是可以限制最大充电百分比来保护电池的工具。 锂离子和聚合物电池&#xff08;如 MacBook 中的电池&#xff09;在40&#xff05; 至 80&#xff05; 之间运行时&#xff0c;使用寿命最长。 始终将电池电量保持在 100&#xff05…

KungfuBot——基于物理约束和自适应运动追踪的人形全身控制PBHC,用于学习打拳或跳舞(即RL下的动作模仿和运控)

前言 昨天618&#xff0c;我司「七月在线」同事朝阳为主力&#xff0c;我打杂&#xff0c;折腾了整整一天&#xff0c;终于可以通过VR摇操宇树G1了——当然&#xff0c;摇操是为了做训练数据的采集&#xff0c;从而方便 下一步的模型(策略)训练&#xff0c;最终实现机器人自主…

Kafka多副本机制

副本和副本因子 Kafka 会为每个 Partition 创建多个副本。这些副本分布在不同的 Broker 上。副本确保了数据的冗余存储&#xff0c;即使某个 Broker 宕机或失效&#xff0c;其他副本可以继续提供服务。 副本因子指的是每个 Partition 有多少个副本。副本因子的设置决定了一个…

Vue3类似百度风格搜索框组件

Vue3百度风格搜索框组件&#xff0c;使用vue3进行设计&#xff0c;亦有vue3TS的版本。 vue3组件如下&#xff1a; <template><!-- 搜索组件容器 --><div class"search-container"><!-- 百度Logo - 新样式 --><div class"logo-conta…

智净未来:华为智选IAM以科技巧思优化家庭健康饮水体验

在中国家庭中&#xff0c;净水器早已成为厨房标配&#xff0c;但传统净水设备的使用体验却远未达到理想状态。根据《2023年中国家庭净水器使用调研报告》显示&#xff0c;超过65%的用户对传统净水器存在不满&#xff0c;主要痛点集中在功能单一、操作复杂、维护麻烦、噪音大、废…

细说STM32单片机SPI-Flash芯片的FatFS移植

目录 一、SPI-Flash芯片硬件电路 二、CubeMX项目基础设置 1、RCC、SYS、Code Generator、USART6、NVIC 2、RTC 3、SPI2 4、GPIO 5、FatFS模式 6、FatFS参数设置概述 &#xff08;1&#xff09;Version组 &#xff08;2&#xff09;Function Parameters组 1&#x…

ubuntu 22.04 安装部署logstash 7.10.0详细教程

安装部署logstash 7.10.0详细教程 一、下载并安装二、新建配置文件三、赋权文件权限四、检测文件grok语法是否异常五、启动服务六、安装启动常见问题 【背景】 整个elk安装是基于ubuntu 22.04和jdk 11环境。logstash采用 *.deb方式安装&#xff0c;需要服务器能联网。ubuntu 22…

JVM对象创建与内存分配机制深度剖析

对象创建的主要流程 类加载检查 在创建对象之前&#xff0c;JVM 首先会检查该类是否已经加载、解析并初始化&#xff1a; 如果没有&#xff0c;则会通过类加载机制加载类元信息&#xff08;Class Metadata&#xff09;到方法区。 这个过程包括&#xff1a;加载&#xff08;load…

Navicat 技术指引 | TiDB 的 AI 查询交互功能

目前&#xff0c;Navicat 两款工具支持对 TiDB 数据库的管理开发功能&#xff1a;一款是旗舰款 Navicat Premium&#xff0c;另一款是其轻量化功能的 Navicat Premium Lite&#xff08;官方轻量级免费版&#xff09;。Navicat 自版本 17.1 开始支持 TiDB 7。它支持的系统有 Win…

以list为输入条件,查询数据库表,java中的mapper层和mybatis层应该怎么写?

根据一个 List 中的两个字段 rangeCode 和 unitcd&#xff0c;查询数据库表 model_engineering_spatial_unit。这个需求在 Java MyBatis 项目中非常常见&#xff0c;下面我将为你详细写出 Mapper 接口&#xff08;Java&#xff09; 和 MyBatis XML 映射文件 的写法。 ✅ 前提…

pyspark 创建DataFrame

from pyspark.sql import SparkSession from pyspark.sql import StructType, StructField, IntegerType,StringType spark SparkSession.builder.appName(test).getOrCreate() 1、 从列表中创建DataFrame data [(1,"alice"),(2,Blob),(3,Charlie)] columns [&qu…

Vim:从入门到进阶的高效文本编辑器之旅

目录 一、Vim简介 二、Vim的基础操作 2.1 进入和退出Vim 2.2 Vim的三种模式 2.3 基础移动 三、Vim的高效编辑技巧 3.1 文本编辑 3.2 文本删除与修改 3.3 复制与粘贴 四、Vim的进阶使用 4.1 搜索与替换 4.2 寄存器与宏 4.3 插件与配置 五、结语 在编程界&#xff0…

Docker基础理论与阿里云Linux服务器安装指南

文章目录 一、Docker核心概念二、阿里云环境准备三、Docker安装与配置四、核心容器部署示例五、开发环境容器化六、运维管理技巧七、安全加固措施 一、Docker核心概念 容器化本质&#xff1a; 轻量级虚拟化技术&#xff0c;共享主机内核进程级隔离&#xff08;cgroups/namespac…

c#使用笔记之try catch和throw

一、try catch 一种报错的捕捉机制&#xff0c;try块里运行的代码出现错误的时候就会去执行catch块所以一般catch块里都是把错误打印出来或者保存到log日志里&#xff1b; 1.1、具体使用 catch可以用&#xff08;&#xff09;来选择捕捉什么类型的错误&#xff0c;一般用Exc…

(新手友好)MySQL学习笔记(9):索引(常见索引类型,查找结构的发展(二分查找法,二叉搜索树,平衡二叉树,B树,B+树))

目录 索引 常见索引类型 B树 二分查找法 二叉搜索树和平衡二叉树 B树和B树 索引 index&#xff0c;是存储引擎用于快速找到数据的一种数据结构。 MySQL默认使用InnoDB存储引擎&#xff0c;该存储引擎是最重要&#xff0c;使用最广泛的&#xff0c;除非有非常特别的原因需要使用…

进程间通信1(匿名管道)Linux

1 进程间通信的必要性 首先要明确进程间是相互独立的&#xff08;独享一份虚拟地址空间&#xff0c;页表&#xff0c;资源&#xff09;&#xff0c;那怎么样才能使得两个进程间实现资源的发送&#xff1f;所以&#xff0c;两个进程一定需要看到同一份资源&#xff0c;并且⼀个…