gen similarity compute

1.similar_gen.cpp

#include <string.h>
#include <iostream>
#include <string>
#include <algorithm>
#include "boost/noncopyable.hpp"
using namespace std;
class similar_gen : public boost::noncopyable {
public:
    inline static similar_gen &get() {
        static similar_gen obj;
        return obj;
    }
    int compute_similarity(const string &gen_str0, const string &gen_str1) {
        if (false == check_gen_str(gen_str0) ||  false == check_gen_str(gen_str1)) {
            cerr << "invalid gen string...!" << endl;
            return -1;
        }
        make_status_equation(gen_str0, gen_str1);
        int size0 = gen_str0.size();
        int size1 = gen_str0.size();
        for (int i = 1;i <= size0;i++) {
            for (int j = 1;j <= size1;j++) {
                status_equation_[i][j] = max(status_equation_[i][j], status_equation_[i - 1][j - 1] + get_similarity(gen_str0[i - 1], gen_str1[j - 1]));
                status_equation_[i][j] = max(status_equation_[i][j], status_equation_[i][j - 1] + get_similarity(gen_str1[j - 1], '-'));
                status_equation_[i][j] = max(status_equation_[i][j], status_equation_[i - 1][j] + get_similarity(gen_str0[i - 1], '-'));
            }
        }
        return status_equation_[size0][size1];

    }
private:
    bool check_gen_str(const string &gen_str) {
        if (gen_str.size() > max_gen_len) {
            return false;
        }
        for (auto &ch : gen_str) {
            if (ch != 'A' && ch != 'C' && ch != 'G' && ch != 'T') {
                return false;
            }
        }
        return true;
    }
    void make_similarity() {
        similarity_array_['A']['A'] = 5;
        similarity_array_['A']['C'] = -1;
        similarity_array_['A']['G'] = -2;
        similarity_array_['A']['T'] = -1;
        similarity_array_['A']['-'] = -3;

        similarity_array_['C']['A'] = -1;
        similarity_array_['C']['C'] = 5;
        similarity_array_['C']['G'] = -3;
        similarity_array_['C']['T'] = -2;
        similarity_array_['C']['-'] = -4;

        similarity_array_['G']['A'] = -2;
        similarity_array_['G']['C'] = -3;
        similarity_array_['G']['G'] = 5;
        similarity_array_['G']['T'] = -2;
        similarity_array_['G']['-'] = -2;

        similarity_array_['T']['A'] = -1;
        similarity_array_['T']['C'] = -2;
        similarity_array_['T']['G'] = -2;
        similarity_array_['T']['T'] = 5;
        similarity_array_['T']['-'] = -1;

        similarity_array_['-']['A'] = -3;
        similarity_array_['-']['C'] = -4;
        similarity_array_['-']['G'] = -2;
        similarity_array_['-']['T'] = -1;
        similarity_array_['-']['-'] = -10;
    }
    inline int get_similarity(char ch0, char ch1) {
        return similarity_array_[ch0][ch1];
    }
    void make_status_equation(const string &gen_str0, const string &gen_str1) {
        memset(status_equation_, 0, sizeof(status_equation_));
        int size = gen_str0.size();
        for (int i = 1;i <= size;i++) {
            status_equation_[i][0] = status_equation_[i - 1][0] + get_similarity(gen_str0[i - 1], '-');
        }
        size = gen_str1.size();
        for (int i = 1;i <= size;i++) {
            status_equation_[0][i] = status_equation_[0][i - 1] + get_similarity(gen_str1[i - 1], '-');
        }
    }
private:
    similar_gen() {
        make_similarity();
    }
    virtual ~similar_gen() = default;
private:
    static const int max_gen_len = 100;
private:
    int similarity_array_[256][256];
    int status_equation_[max_gen_len + 1][max_gen_len + 1];

};
int main() {
    string str0 = "AGTGATG";
    string str1 = "GTTAG";
    cout << similar_gen::get().compute_similarity(str0, str1) << endl;

    return 0;
}

2.make.sh

g++ -std=c++14 -g -o Test similar_gen.cpp -I ../boost_1_69_0/ -L ../boost_1_69_0/libs/

import json import torch import os from transformers import AutoTokenizer, AutoModel, AutoModelForCausalLM from tqdm import tqdm from typing import List, Dict, Any, Tuple, Optional from sentence_transformers import util class MiniLMEvaluator: def __init__(self, model_path: str, test_data_path: str, gen_model_path: Optional[str] = None, similarity_threshold: float = 0.7): """初始化评估器 - 完全离线模式""" self.device = "cuda" if torch.cuda.is_available() else "cpu" self.similarity_threshold = similarity_threshold # 加载MiniLM模型(相似度计算)- 完全离线 print(f"正在加载本地相似度模型: {model_path}...") self.tokenizer = AutoTokenizer.from_pretrained(model_path, local_files_only=True) self.model = AutoModel.from_pretrained(model_path, local_files_only=True).to(self.device) self.model.eval() # 加载生成模型 - 完全离线 self.gen_model = None self.gen_tokenizer = None if gen_model_path and os.path.exists(gen_model_path): print(f"正在加载本地生成模型: {gen_model_path}...") try: # 强制使用本地文件 self.gen_tokenizer = AutoTokenizer.from_pretrained( gen_model_path, trust_remote_code=True, local_files_only=True ) print("成功加载本地tokenizer") self.gen_model = AutoModelForCausalLM.from_pretrained( gen_model_path, device_map="auto", torch_dtype=torch.float16 if self.device == "cuda" else torch.float32, trust_remote_code=True, local_files_only=True ).eval() print("成功加载本地模型") except Exception as e: print(f"加载本地模型失败: {str(e)}") print("请确保模型文件完整且路径正确") self.gen_model = None else: print(f"警告: 生成模型路径不存在 {gen_model_path}") # 加载测试数据 print(f"正在加载测试数据: {test_data_path}...") self.test_data = self._load_test_data(test_data_path) if not self.test_data: raise ValueError("测试数据加载失败或为空") def _load_test_data(self, test_data_path: str) -> List[Dict[str, Any]]: """加载测试数据""" try: with open(test_data_path, 'r', encoding='utf-8') as f: data = json.load(f) if not isinstance(data, list): raise ValueError(f"测试数据应为列表,但得到 {type(data)}") print(f"成功加载 {len(data)} 条测试数据") return data except Exception as e: raise ValueError(f"加载测试数据失败: {str(e)}") def get_embedding(self, text: str) -> torch.Tensor: """获取文本的嵌入向量""" if not text.strip(): return torch.zeros(384).to(self.device) inputs = self.tokenizer( text, return_tensors="pt", padding=True, truncation=True, max_length=512 ).to(self.device) with torch.no_grad(): outputs = self.model(**inputs) # 平均池化生成句子嵌入 return self._mean_pooling(outputs, inputs['attention_mask']).cpu().squeeze(0) def _mean_pooling(self, model_output, attention_mask): """平均池化生成句子嵌入""" token_embeddings = model_output.last_hidden_state input_mask_expanded = attention_mask.unsqueeze(-1).expand(token_embeddings.size()).float() return torch.sum(token_embeddings * input_mask_expanded, 1) / torch.clamp(input_mask_expanded.sum(1), min=1e-9) def generate_response(self, prompt: str) -> str: """使用生成模型生成回复""" if not self.gen_model or not self.gen_tokenizer: # 如果没有生成模型,则返回空字符串 return "" inputs = self.gen_tokenizer(prompt, return_tensors="pt").to(self.device) with torch.no_grad(): outputs = self.gen_model.generate( **inputs, max_new_tokens=512, temperature=0.1, top_p=0.8, do_sample=True ) response = self.gen_tokenizer.decode(outputs[0][inputs.input_ids.shape[1]:], skip_special_tokens=True) return response def evaluate_pair(self, text1: str, text2: str) -> Dict[str, Any]: """评估文本对相似度""" emb1 = self.get_embedding(text1) emb2 = self.get_embedding(text2) similarity = util.pytorch_cos_sim(emb1.unsqueeze(0), emb2.unsqueeze(0)).item() return { "text1": text1, "text2": text2, "similarity": similarity, "is_correct": similarity >= self.similarity_threshold, "threshold": self.similarity_threshold } def evaluate(self) -> Tuple[float, float, List[Dict[str, Any]]]: """执行完整评估流程""" if not self.test_data: raise ValueError("无有效测试数据") total_similarity = 0.0 correct_count = 0 results = [] for sample in tqdm(self.test_data, desc="评估进度"): try: # 提取对话内容 if not isinstance(sample, dict) or "conversations" not in sample: print(f"跳过无效样本: {sample.get('id', '未知')}") continue # 获取最后一轮对话 conversations = sample["conversations"] user_input = None reference_reply = None # 拼接完整的对话历史 full_dialog = "" for i, turn in enumerate(conversations): if turn.get("from") == "user": user_input = turn.get("value", "").strip() full_dialog += f"用户: {user_input}\n" elif turn.get("from") == "assistant": reference_reply = turn.get("value", "").strip() if i < len(conversations) - 1: # 不是最后一轮 full_dialog += f"助手: {reference_reply}\n" if not user_input or not reference_reply: print(f"跳过不完整对话: {sample.get('id', '未知')}") continue # 生成模型回复(基于完整对话历史) prompt = full_dialog + "助手:" generated_reply = self.generate_response(prompt) if self.gen_model else reference_reply # 评估生成结果 eval_result = self.evaluate_pair(generated_reply, reference_reply) results.append({ "id": sample.get("id", len(results)), "user_input": user_input, "generated_reply": generated_reply, "reference_reply": reference_reply, **eval_result }) total_similarity += eval_result["similarity"] if eval_result["is_correct"]: correct_count += 1 except Exception as e: print(f"处理样本出错: {str(e)}") continue # 计算指标 valid_samples = len(results) if valid_samples == 0: return 0.0, 0.0, [] avg_similarity = total_similarity / valid_samples accuracy = correct_count / valid_samples return avg_similarity, accuracy, results def save_results(self, results: List[Dict[str, Any]], output_path: str): """保存评估结果""" with open(output_path, 'w', encoding='utf-8') as f: json.dump({ "summary": { "total_samples": len(results), "avg_similarity": sum(r["similarity"] for r in results) / len(results), "accuracy": sum(r["is_correct"] for r in results) / len(results), "threshold": self.similarity_threshold }, "details": results }, f, ensure_ascii=False, indent=2) if __name__ == "__main__": # 配置参数 - 全部使用本地路径 CONFIG = { "model_path": "/root/autodl-tmp/paraphrase-multilingual-MiniLM-L12-v2", # 本地相似度模型路径 "gen_model_path": "/root/autodl-tmp/Qwen3-14b", # 本地生成模型路径 "test_data_path": "/root/autodl-tmp/test_new.json", # 测试数据路径 "output_path": "/root/autodl-tmp/evaluation_results.json", # 输出路径 "similarity_threshold": 0.7 # 相似度阈值 } try: print("="*50) print("开始评估 - 离线模式".center(40)) print("="*50) # 检查模型路径是否存在 if not os.path.exists(CONFIG["model_path"]): raise FileNotFoundError(f"相似度模型路径不存在: {CONFIG['model_path']}") # 初始化评估器 evaluator = MiniLMEvaluator( model_path=CONFIG["model_path"], test_data_path=CONFIG["test_data_path"], gen_model_path=CONFIG["gen_model_path"], similarity_threshold=CONFIG["similarity_threshold"] ) # 执行评估 avg_sim, accuracy, results = evaluator.evaluate() # 打印结果 print("\n" + "评估结果".center(40, "-")) print(f"评估样本数: {len(results)}") print(f"平均相似度: {avg_sim:.4f}") print(f"准确率(≥{CONFIG['similarity_threshold']}): {accuracy:.2%}") print(f"正确样本数: {int(accuracy * len(results))}/{len(results)}") # 保存结果 evaluator.save_results(results, CONFIG["output_path"]) print(f"\n结果已保存至: {CONFIG['output_path']}") except Exception as e: print(f"\n评估过程出错: {str(e)}") print("请确保:") print("1. 所有模型路径都是本地绝对路径") print("2. 模型文件完整且未损坏") print("3. 测试数据文件存在且格式正确") print("4. 有足够的存储空间") root@autodl-container-8bf9409db0-3243e00c:~/autodl-tmp# python utils_one.py ================================================== 开始评估 - 离线模式 ================================================== 正在加载本地相似度模型: /root/autodl-tmp/paraphrase-multilingual-MiniLM-L12-v2... 正在加载本地生成模型: /root/autodl-tmp/Qwen3-14b... 成功加载本地tokenizer 加载本地模型失败: argument of type 'NoneType' is not iterable 请确保模型文件完整且路径正确 正在加载测试数据: /root/autodl-tmp/test_new.json... 成功加载 5434 条测试数据 评估进度: 100%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 5434/5434 [00:48<00:00, 111.78it/s] ------------------评估结果------------------ 评估样本数: 5434 平均相似度: 1.0000 准确率(≥0.7): 100.00% 正确样本数: 5434/5434为什么评估结果一直是100
06-05
AI 代码审查Review工具 是一个旨在自动化代码审查流程的工具。它通过集成版本控制系统(如 GitHub 和 GitLab)的 Webhook,利用大型语言模型(LLM)对代码变更进行分析,并将审查意见反馈到相应的 Pull Request 或 Merge Request 中。此外,它还支持将审查结果通知到企业微信等通讯工具。 一个基于 LLM 的自动化代码审查助手。通过 GitHub/GitLab Webhook 监听 PR/MR 变更,调用 AI 分析代码,并将审查意见自动评论到 PR/MR,同时支持多种通知渠道。 主要功能 多平台支持: 集成 GitHub 和 GitLab Webhook,监听 Pull Request / Merge Request 事件。 智能审查模式: 详细审查 (/github_webhook, /gitlab_webhook): AI 对每个变更文件进行分析,旨在找出具体问题。审查意见会以结构化的形式(例如,定位到特定代码行、问题分类、严重程度、分析和建议)逐条评论到 PR/MR。AI 模型会输出 JSON 格式的分析结果,系统再将其转换为多条独立的评论。 通用审查 (/github_webhook_general, /gitlab_webhook_general): AI 对每个变更文件进行整体性分析,并为每个文件生成一个 Markdown 格式的总结性评论。 自动化流程: 自动将 AI 审查意见(详细模式下为多条,通用模式下为每个文件一条)发布到 PR/MR。 在所有文件审查完毕后,自动在 PR/MR 中发布一条总结性评论。 即便 AI 未发现任何值得报告的问题,也会发布相应的友好提示和总结评论。 异步处理审查任务,快速响应 Webhook。 通过 Redis 防止对同一 Commit 的重复审查。 灵活配置: 通过环境变量设置基
【直流微电网】径向直流微电网的状态空间建模与线性化:一种耦合DC-DC变换器状态空间平均模型的方法 (Matlab代码实现)内容概要:本文介绍了径向直流微电网的状态空间建模与线性化方法,重点提出了一种基于耦合DC-DC变换器的状态空间平均模型的建模策略。该方法通过数学建模手段对直流微电网系统进行精确的状态空间描述,并对其进行线性化处理,以便于系统稳定性分析与控制器设计。文中结合Matlab代码实现,展示了建模与仿真过程,有助于研究人员理解和复现相关技术,推动直流微电网系统的动态性能研究与工程应用。; 适合人群:具备电力电子、电力系统或自动化等相关背景,熟悉Matlab/Simulink仿真工具,从事新能源、微电网或智能电网研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①掌握直流微电网的动态建模方法;②学习DC-DC变换器在耦合条件下的状态空间平均建模技巧;③实现系统的线性化分析并支持后续控制器设计(如电压稳定控制、功率分配等);④为科研论文撰写、项目仿真验证提供技术支持与代码参考。; 阅读建议:建议读者结合Matlab代码逐步实践建模流程,重点关注状态变量选取、平均化处理和线性化推导过程,同时可扩展应用于更复杂的直流微电网拓扑结构中,提升系统分析与设计能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值