这个RAG系统竟然同时集成了BM25+向量+GraphRAG,小白也能轻松上手!三模态检索让AI精准度飙升300%!

OpenViking上下文数据库Golang集成实践 技术创新文件系统范式:将AI Agent的上下文管理从扁平向量存储提升为结构化文件系统分层检索策略:L0/L1/L2三层加载机制,减少62.1%的Token消耗记忆自迭代:会话提交触发Agent经验沉淀,实现越用越智能工程实践完整Golang实现:提供生产级可用的OpenViking客户端库企业级集成方案:涵盖文档摄入、检索、会话管理等全流程性能优化成果:检索准确率提升24.1%,响应时间减少53.3%可观测性提升可视化检索轨迹:实现检索过程的白盒化,调试效率提升77.1%全面监控指标。 阅读详情

但在实际生产环境中,你仍会面临一个痛苦的现实:

  • 向量检索 找到的是 语义相似 的内容,不一定是 正确 的内容。
  • GraphRAG 提升了 推理能力,但可能遗漏 精确事实(如ID、代码、条款)。
  • 关键词检索(BM25)能精准命中 完全匹配 的内容,却无法处理 同义转述。

因此,真正“生产级”的 RAG 应该是这样的:

三模态混合RAG = BM25(精确性)+ 向量(语义)+ GraphRAG(关系)+ 重排序(精度)

下面是一个 完整可运行的实现,你可以直接复制粘贴并运行。

我们将构建什么

一个完整的流水线:

  1. 文档分块与索引
  • BM25 索引

    (词汇检索)

  • 向量索引

    (语义检索)

  • GraphRAG 索引

    (实体图 + 块链接)

  • 混合融合

    (分数归一化 + 合并)

  • 交叉编码器重排序

    (最终精度)

  • 上下文构建器

    (LLM就绪的上下文)

安装依赖

pip install rank-bm25 sentence-transformers numpy networkx

完整代码:三模态混合RAG(BM25 + 向量 + GraphRAG + 重排序)

此代码可在本地运行,无需外部数据库。
此处的 GraphRAG 实现为轻量级的 实体图(共现图),用于扩展相关实体并检索关联的文本块。

from __future__ import annotationsimport refrom dataclasses import dataclassfrom typing import Dict, List, Tuple, Iterable, Optionalimport numpy as npimport networkx as nxfrom rank_bm25 import BM25Okapifrom sentence_transformers import SentenceTransformer, CrossEncoder# ===========================================================================# 数据结构定义# ===========================================================================@dataclass(frozen=True)class DocChunk:    chunk_id: str    text: str    meta: Dict[str, str]@dataclass(frozen=True)class Hit:    chunk: DocChunk    score: float    source: str  # "bm25" | "vector" | "graph" | "hybrid" | "rerank"# ===========================================================================# 文本工具函数(快速可靠)# ===========================================================================_WS = re.compile(r"\s+")_WORDS = re.compile(r"[a-z0-9]+")def normalize_text(s: str) -> str:    return _WS.sub(" ", s.strip())def bm25_tokenize(s: str) -> List[str]:    # BM25 喜欢小写分词    return _WORDS.findall(s.lower())def minmax_norm(scores: List[float]) -> List[float]:    if not scores:        return scores    mn, mx = min(scores), max(scores)    if abs(mx - mn) < 1e-12:        return [1.0] * len(scores)    return [(s - mn) / (mx - mn) for s in scores]def cosine_sim(q: np.ndarray, X: np.ndarray) -> np.ndarray:    # q: (d,), X: (n,d) -> (n,)    qn = q / (np.linalg.norm(q) + 1e-12)    Xn = X / (np.linalg.norm(X, axis=1, keepdims=True) + 1e-12)    return Xn @ qn# ===========================================================================# GraphRAG(轻量级):实体图 + 文本块链接# ===========================================================================class EntityGraphIndex:    """    轻量级 GraphRAG 风格索引:    - 从每个文本块中提取实体(简单启发式规则)    - 构建无向共现图    - 映射 实体 -> 文本块ID    - 查询扩展:从查询中提取实体,扩展邻居节点,获取关联文本块    """    def __init__(self) -> None:        self.g = nx.Graph()        self.entity_to_chunks: Dict[str, set[str]] = {}        self.chunk_entities: Dict[str, List[str]] = {}    @staticmethod    def extract_entities(text: str) -> List[str]:        """        简单的实体提取启发式规则:        - 保留首字母大写的词(如 "NeonDB", "SuccessFactors")        - 保留全大写词(如 "API", "HTTP")        - 保留错误代码类词(如 "E1127", "ERR_401", "0xA00F4244")        - 保留带点标识符(如 "apps.pricing.services")        """        # 首字母大写或驼峰式单词        titleish = re.findall(r"\b[A-Z][a-z]+(?:[A-Z][a-z]+)*\b", text)        # 全大写缩写词        acronyms = re.findall(r"\b[A-Z]{2,}\b", text)        # 错误码/十六进制/混合格式        codes = re.findall(r"\b(?:0x[a-fA-F0-9]{6,}|[A-Z]{1,5}[_-]?\d{2,}|E\d{3,6})\b", text)        # 带点路径(对开发者文档有用)        dotted = re.findall(r"\b[a-zA-Z_]\w*(?:\.[a-zA-Z_]\w*){2,}\b", text)        # 标准化:转为小写以保证节点ID稳定        raw = titleish + acronyms + codes + dotted        cleaned = []        for e in raw:            e = e.strip()            if len(e) < 3:                continue            cleaned.append(e.lower())        # 去重但保持顺序        seen = set()        out = []        for e in cleaned:            if e not in seen:                seen.add(e)                out.append(e)        return out    def build(self, chunks: List[DocChunk]) -> None:        for c in chunks:            ents = self.extract_entities(c.text)            self.chunk_entities[c.chunk_id] = ents            # 实体 -> 文本块ID 映射            for e in ents:                self.entity_to_chunks.setdefault(e, set()).add(c.chunk_id)            # 构建共现边            for i in range(len(ents)):                for j in range(i + 1, len(ents)):                    a, b = ents[i], ents[j]                    if a == b:                        continue                    if self.g.has_edge(a, b):                        self.g[a][b]["w"] += 1                    else:                        self.g.add_edge(a, b, w=1)    def expand_query_entities(self, query: str, depth: int = 1, max_nodes: int = 30) -> List[str]:        seeds = self.extract_entities(query)        if not seeds:            return []        visited = set(seeds)        frontier = list(seeds)        for _ in range(depth):            nxt = []            for node in frontier:                if node not in self.g:                    continue                # 按边权重降序排列邻居                neigh = sorted(                    self.g.neighbors(node),                    key=lambda x: self.g[node][x].get("w", 1),                    reverse=True                )                for nb in neigh[:10]:                    if nb not in visited:                        visited.add(nb)                        nxt.append(nb)                        if len(visited) >= max_nodes:                            return list(visited)            frontier = nxt        return list(visited)    def graph_retrieve_chunk_ids(self, query: str, depth: int = 1, per_entity_limit: int = 6) -> Dict[str, float]:        """        返回 文本块ID -> 分数,采用简单打分策略:        - 被种子实体匹配的文本块得分更高        - 被扩展实体匹配的文本块得分较低        """        expanded = self.expand_query_entities(query, depth=depth)        if not expanded:            return {}        seeds = set(self.extract_entities(query))        scores: Dict[str, float] = {}        for e in expanded:            chunk_ids = list(self.entity_to_chunks.get(e, []))            if not chunk_ids:                continue            # 种子实体权重更高            w = 1.0 if e in seeds else 0.55            # 限制每个实体返回数量,避免图泛洪            for cid in chunk_ids[:per_entity_limit]:                scores[cid] = scores.get(cid, 0.0) + w        return scores# ===========================================================================# 三模态混合RAG引擎# ===========================================================================class TriModalHybridRAG:    """    生产级模式:    - BM25(精确关键词)    - 向量检索(语义相似性)    - GraphRAG(实体图扩展)    - 归一化融合 + 权重    - 交叉编码器重排序(最终精度)    """    def __init__(        self,        embedding_model: str = "sentence-transformers/all-MiniLM-L6-v2",        rerank_model: str = "cross-encoder/ms-marco-MiniLM-L-6-v2",    ) -> None:        self.embedder = SentenceTransformer(embedding_model)        self.reranker = CrossEncoder(rerank_model)        self.chunks: List[DocChunk] = []        self._bm25: Optional[BM25Okapi] = None        self._bm25_tokens: List[List[str]] = []        self._embeddings: Optional[np.ndarray] = None  # (n, d)        self.graph_index = EntityGraphIndex()        self._chunk_by_id: Dict[str, DocChunk] = {}    # -------------------------------------------------------------------------    # 索引构建    # -------------------------------------------------------------------------    def index(self, chunks: List[DocChunk]) -> None:        self.chunks = [            DocChunk(c.chunk_id, normalize_text(c.text), c.meta)            for c in chunks        ]        self._chunk_by_id = {c.chunk_id: c for c in self.chunks}        # BM25        self._bm25_tokens = [bm25_tokenize(c.text) for c in self.chunks]        self._bm25 = BM25Okapi(self._bm25_tokens)        # 向量        texts = [c.text for c in self.chunks]        self._embeddings = np.array(self.embedder.encode(texts, normalize_embeddings=True))        # GraphRAG        self.graph_index.build(self.chunks)    # -------------------------------------------------------------------------    # BM25 检索    # -------------------------------------------------------------------------    def bm25_search(self, query: str, top_k: int = 12) -> List[Hit]:        if not self._bm25:            raise RuntimeError("请先调用 index() 方法。")        q = bm25_tokenize(query)        scores = self._bm25.get_scores(q)        idxs = np.argsort(scores)[::-1][:top_k]        return [Hit(self.chunks[int(i)], float(scores[int(i)]), "bm25") for i in idxs]    # -------------------------------------------------------------------------    # 向量检索    # -------------------------------------------------------------------------    def vector_search(self, query: str, top_k: int = 12) -> List[Hit]:        if self._embeddings is None:            raise RuntimeError("请先调用 index() 方法。")        q = np.array(self.embedder.encode([query], normalize_embeddings=True))[0]        sims = cosine_sim(q, self._embeddings)        idxs = np.argsort(sims)[::-1][:top_k]        return [Hit(self.chunks[int(i)], float(sims[int(i)]), "vector") for i in idxs]    # -------------------------------------------------------------------------    # GraphRAG 检索(实体图)    # -------------------------------------------------------------------------    def graph_search(self, query: str, depth: int = 1, top_k: int = 12) -> List[Hit]:        cid_to_score = self.graph_index.graph_retrieve_chunk_ids(query, depth=depth)        if not cid_to_score:            return []        # 按图分数降序排序        items = sorted(cid_to_score.items(), key=lambda x: x[1], reverse=True)[:top_k]        hits: List[Hit] = []        for cid, sc in items:            c = self._chunk_by_id.get(cid)            if c:                hits.append(Hit(c, float(sc), "graph"))        return hits    # -------------------------------------------------------------------------    # 三模态混合融合    # -------------------------------------------------------------------------    def hybrid_candidates(        self,        query: str,        bm25_top: int = 12,        vec_top: int = 12,        graph_top: int = 12,        graph_depth: int = 1,        merged_top: int = 18,        w_bm25: float = 0.34,        w_vec: float = 0.44,        w_graph: float = 0.22,    ) -> List[Hit]:        bm25_hits = self.bm25_search(query, top_k=bm25_top)        vec_hits = self.vector_search(query, top_k=vec_top)        graph_hits = self.graph_search(query, depth=graph_depth, top_k=graph_top)        # 各通道分数归一化        bm25_norm = minmax_norm([h.score for h in bm25_hits])        vec_norm = minmax_norm([h.score for h in vec_hits])        graph_norm = minmax_norm([h.score for h in graph_hits])        merged: Dict[str, Tuple[DocChunk, float]] = {}        def add(hits: List[Hit], norms: List[float], weight: float) -> None:            for h, ns in zip(hits, norms):                cid = h.chunk.chunk_id                prev = merged.get(cid, (h.chunk, 0.0))[1]                merged[cid] = (h.chunk, prev + ns * weight)        add(bm25_hits, bm25_norm, w_bm25)        add(vec_hits, vec_norm, w_vec)        add(graph_hits, graph_norm, w_graph)        out = [Hit(chunk=c, score=s, source="hybrid") for (c, s) in merged.values()]        out.sort(key=lambda x: x.score, reverse=True)        return out[:merged_top]    # -------------------------------------------------------------------------    # 重排序(交叉编码器)    # -------------------------------------------------------------------------    def rerank(self, query: str, candidates: List[Hit], top_k: int = 6) -> List[Hit]:        pairs = [(query, h.chunk.text) for h in candidates]        scores = self.reranker.predict(pairs)        reranked = [Hit(h.chunk, float(s), "rerank") for h, s in zip(candidates, scores)]        reranked.sort(key=lambda x: x.score, reverse=True)        return reranked[:top_k]    # -------------------------------------------------------------------------    # 构建LLM上下文    # -------------------------------------------------------------------------    def build_context(self, hits: List[Hit], max_chars: int = 5000) -> str:        parts: List[str] = []        used = 0        for h in hits:            src = h.chunk.meta.get("source", "doc")            header = f"[{src} | {h.chunk.chunk_id}]"            block = f"{header}\n{h.chunk.text}\n"            if used + len(block) > max_chars:                break            parts.append(block)            used += len(block)        return "\n---\n".join(parts)    # -------------------------------------------------------------------------    # 端到端检索    # -------------------------------------------------------------------------    def retrieve(        self,        query: str,        bm25_top: int = 12,        vec_top: int = 12,        graph_top: int = 12,        graph_depth: int = 1,        merged_top: int = 18,        rerank_top: int = 6,    ) -> List[Hit]:        candidates = self.hybrid_candidates(            query=query,            bm25_top=bm25_top,            vec_top=vec_top,            graph_top=graph_top,            graph_depth=graph_depth,            merged_top=merged_top,        )        return self.rerank(query, candidates, top_k=rerank_top)# ===========================================================================# 演示:在此处插入你的文本块# =========================================================================def demo_chunks() -> List[DocChunk]:    """    请替换为你的实际分块输出。    本演示特意混合了以下内容:    - ID 和代码(BM25 优势)    - 同义转述(向量优势)    - 实体关系(GraphRAG 优势)    """    return [        DocChunk(            "c1",            "错误 E1127 发生在访问令牌过期时。请刷新令牌后重试请求。",            {"source": "操作手册"}        ),        DocChunk(            "c2",            "如果认证失败并返回 HTTP 401,请轮换 API 密钥并重新生成客户端密钥。",            {"source": "操作手册"}        ),        DocChunk(            "c3",            "退款政策:年付套餐在购买后14天内可申请退款。月付套餐不可退款。",            {"source": "政策"}        ),        DocChunk(            "c4",            "取消订阅需至少在续订前7天联系计费部门,以避免产生费用。",            {"source": "政策"}        ),        DocChunk(            "c5",            "计费服务依赖于认证服务。认证服务会验证由 IdentityProvider 颁发的令牌。",            {"source": "架构文档"}        ),        DocChunk(            "c6",            "IdentityProvider 颁发 JWT 令牌。认证服务在允许访问前会验证 JWT 签名和声明。",            {"source": "架构文档"}        ),        DocChunk(            "c7",            "如果用户无法登录,请先检查 IdentityProvider 的健康状态,再查看认证日志中的 JWT 失败记录。",            {"source": "支持指南"}        ),    ]if __name__  "__main__":    rag = TriModalHybridRAG()    rag.index(demo_chunks())    query = "为什么我看到 E1127 错误?Auth 服务和 IdentityProvider 之间有什么关系?"    hits = rag.retrieve(query, graph_depth=2)    print("\n重排序后的最佳结果:\n")    for h in hits:        print(f"- {h.score:.4f} | {h.chunk.chunk_id} | {h.chunk.meta.get('source')}")    print("\n\nLLM 上下文:\n")    print(rag.build_context(hits))

为什么这个实现真正有效?

✅ BM25 捕捉“关键术语”

ID、错误码、政策措辞、条款表述。

✅ 向量检索捕捉意图

同义转述、近义词、概念相似性。

✅ GraphRAG 捕捉关系

“为什么”、“如何”、依赖关系、多跳推理。

✅ 重排序将召回率转化为精度

没有重排序,混合检索常返回“接近但不准确”的结果。

GraphRAG + 混合RAG 流程图

┌───────────────┐                 │   用户查询     │                 └───────┬───────┘                         │        ┌────────────────┼────────────────┐        │                │                │   ┌────▼────┐      ┌────▼────┐      ┌────▼──────┐   │  BM25   │      │ 向量检索 │      │  GraphRAG  │   │关键词匹配│      │语义相似 │      │实体+知识图谱│   └────┬────┘      └────┬────┘      └────┬──────┘        │                │                │        └────────────────┼────────────────┘                         │                 ┌───────▼───────┐                 │ 融合 + 归一化  │                 └───────┬───────┘                         │                 ┌───────▼───────┐                 │   重排序器     │                 └───────┬───────┘                         │                 ┌───────▼───────┐                 │ LLM + 生成答案 │                 └───────────────┘

#AI #AI工具 #软件开发 #LLM #大模型 #agent #Agent #智能体


学AI大模型的正确顺序,千万不要搞错了

🤔2026年AI风口已来!各行各业的AI渗透肉眼可见,超多公司要么转型做AI相关产品,要么高薪挖AI技术人才,机遇直接摆在眼前!

有往AI方向发展,或者本身有后端编程基础的朋友,直接冲AI大模型应用开发转岗超合适!

就算暂时不打算转岗,了解大模型、RAG、Prompt、Agent这些热门概念,能上手做简单项目,也绝对是求职加分王🔋

在这里插入图片描述

📝给大家整理了超全最新的AI大模型应用开发学习清单和资料,手把手帮你快速入门!👇👇

学习路线:

✅大模型基础认知—大模型核心原理、发展历程、主流模型(GPT、文心一言等)特点解析
✅核心技术模块—RAG检索增强生成、Prompt工程实战、Agent智能体开发逻辑
✅开发基础能力—Python进阶、API接口调用、大模型开发框架(LangChain等)实操
✅应用场景开发—智能问答系统、企业知识库、AIGC内容生成工具、行业定制化大模型应用
✅项目落地流程—需求拆解、技术选型、模型调优、测试上线、运维迭代
✅面试求职冲刺—岗位JD解析、简历AI项目包装、高频面试题汇总、模拟面经

以上6大模块,看似清晰好上手,实则每个部分都有扎实的核心内容需要吃透!

我把大模型的学习全流程已经整理📚好了!抓住AI时代风口,轻松解锁职业新可能,希望大家都能把握机遇,实现薪资/职业跃迁~

这份完整版的大模型 AI 学习资料已经上传优快云,朋友们如果需要可以微信扫描下方优快云官方认证二维码免费领取【保证100%免费】

在这里插入图片描述

用AI学习graphify Graphify是一个AI驱动的知识图谱构建工具,能够将代码、文档、论文、图像和视频等多模态数据转换为结构化知识图谱。其核心技术特点包括: 多模态处理能力: 支持25+编程语言的AST解析 处理PDF、Markdown等文档 集成Whisper进行音视频转录 高效知识提取: 采用确定性AST解析与LLM语义提取结合 相比直接读取源文件,查询token消耗最多减少71.5倍 增量更新机制仅处理变更文件 智能分析功能: 自动识别高中心性的"上帝节点" 发现跨领域的"意外连接&quo 阅读详情

相关推荐

到底什么是Harness工程?一篇文章从入门到企业落地全解析

随着OpenClaw爆火,Harness Engineering(驾驭工程)成为AI编程时代的热门概念,很多小白对其感到陌生。本文用通俗类比和真实案例,避开复杂术语,从基础定义入手,讲清Harness Engineering的核心逻辑——人类工程师设计“约束系统”(马具),让AI模型(烈马)安全高效地完成代码工作,同时拆解其核心组件、企业落地场景和实战成果,帮小白快速入门,读懂这项能解放人力、提升效率的新技术,轻松掌握它的核心价值和落地思路。

program哲学 3288

基于RAG的企业智能客服项目,已拿70万offer!

基于 RAG 构建一套企业智能客服系统📖。

m0_59164520的博客 1448

STM32串口调试踩坑记:HAL_UART_ErrorCallback里不先解锁,你的中断接收就废了

本文深入分析了STM32串口调试中HAL_UART_ErrorCallback的锁机制陷阱,指出在错误回调中不先解锁会导致中断接收失效的问题。通过解析HAL库源码,提出了正确的错误处理实现方法,并分享了预防措施与最佳实践,帮助开发者提升串口通信的可靠性。

weixin_33733810的博客 516

从Vibe Coding到可控生产力:Harness Engineering的实践启示

摘要:OpenAI提出的Harness Engineering(工程化治理)理念为AI Agent时代的软件工程提供了关键方法论,旨在解决代码高产出下的质量闭环、上下文管理等核心矛盾。其三大目标包括重构工程师角色、将AI纳入可控体系、实现低成本纠错,通过六大举措(如角色重构、机械化约束、反熵机制等)重构工程流程。该理念与vibe coding高度互补,既保留灵感驱动的敏捷性,又通过工程化体系保障稳定性,最终推动工程师从"代码生产者"升级为"工程体系设计者"。

小程故事多的博客 4401

AT32F421玩转AM32电调:手把手教你调试过零点比较器,告别电机抖动

本文详细介绍了如何使用AT32F421芯片调试AM32电调的过零点比较器,解决电机抖动问题。通过硬件配置、软件环境搭建、比较器电路原理分析及filter_level参数动态调整等实战步骤,帮助开发者精准诊断和优化电机控制性能。

weixin_42525632的博客 277

Raid5损坏两块盘

  以下为浪潮Inspur NF5460M4型号服务器故障处理过程: 设备raid5组损坏两块硬,并raid组处理离线状态,情况如图:     由于硬盘数据比较重要,面对此情况不要慌我们尽量做到安全保守的保证数据尽可能完整,以下为处理方法,(遇raid5两块盘出现问题处理方法)   以下截图均为遇相同问题的解决图案,并非现场截图。 Ctrl+H 进WebBios界面,发现两...

chen_lipeng的博客 2万+

RAG与LLM原理实战:从面试高频题到生产级落地

大语言模型(LLM)已从理论研究迈入工程化深水区,其核心能力——如注意力机制、上下文建模与指令遵循——直接决定生成结果的可靠性与可控性。RAG作为缓解幻觉、重建可信输出的关键范式,其效果高度依赖分块策略、混合检索、重排序及Faithfulness等可量化指标。当前技术选型不再比拼参数规模,而聚焦于如何让模型‘不瞎编’、让检索‘不丢关键信息’、让系统在128K上下文与‘lost in the middle’现实约束下依然稳定输出。本文结合37场一线AI岗位真实面试场景,解析LLM底层原理与RAG全链路工程实践

weixin_30443075的博客 355

SAP 销售订单及发票 利润中心替代 Userexit出口 配置及程序

在跨公司销售业务中,跨公司销售订单的发票时无法从销售订单中将利润中心带到发票中,所以在跨公司的发票创建过程中需要配置出口来获取对应销售订单行项目的利润中心。 事务代码: 0KEM 配置步骤: 1、创建一个新的替代 2、创建一个步骤 3、维护一个先决条件,比如针对于特定工厂 PCASUB-VKBUR = '0001' 4、选择替代程序FORM,FORM必须为指定程序中存在的FORM名 5、编辑替代程序FORM 实现效果: 在程序FORM中打上断点 ...

李威威wiwi的博客 5069

大模型工程化:从Prompt到Harness,驾驭AI生产力新时代

大模型工程化三大范式:提示词工程、上下文工程与驾驭工程 摘要:随着大模型技术的成熟,行业焦点转向如何实现能力稳定落地。文章系统阐述大模型工程化的三大范式:提示词工程(Prompt Engineering)作为基础,通过标准化指令引导模型输出;上下文工程(Context Engineering)通过信息注入解决知识边界与幻觉问题;驾驭工程(Harness Engineering)构建全链路管控体系。三者呈递进互补关系,共同支撑生产级应用。当前趋势呈现三大特点:自动化Prompt优化、多模态场景融合、体系化管控

m0_63171455的博客 1855

18、未来医疗信息学中的太赫兹天线技术

本文探讨了太赫兹天线技术在医疗信息学中的关键作用,重点分析了分裂环谐振器和纳米结构光导天线(PCA)的设计与性能提升方法,介绍了相干与非相干太赫兹检测技术,并通过等效电路模型和数值模拟深入解析PCA工作机理。文章还展示了太赫兹技术在无创血糖监测、肿瘤检测等医疗诊断中的实验应用,总结了其非侵入性、高分辨率成像和多参数分析等优势,同时指出信号检测难、成本高和技术复杂等挑战。未来趋势包括设备小型化、效率提升及与人工智能融合,拓展至药物研发、皮肤与神经疾病诊断等领域,展现出变革医疗健康的巨大潜力。

milk8的博客 146

RT-Thread GD32F4xx HWTIMER驱动

GD32F4xx RT-Thread 硬件定时器驱动调试使用记录

madao1234的博客 1482

graphify构建代码知识库,一行代码搭建属于自己的知识图谱

graphify 是一个将任意文件夹(代码、文档、图片、视频等)转化为可查询知识图谱的工具。它的核心理念是:与其让 AI 逐文件读取,不如先把所有内容构建成一张图,让 AI 按图索骥。 你可以把它理解为一个"代码库地图生成器"。输入一个项目目录,它会分析所有文件,提取概念、关系、调用链,然后用可视化的方式呈现给你。更重要的是,这张图是可以查询的——你可以问"认证模块和数据库之间有什么关系",而不需要自己去 grep 几十个文件。

努力前行,总会成为自己心中的那道光 8543

【YOLO目标检测全栈实战】98 YOLO模型在低光照环境下的自适应增强策略

你有没有遇到过这种情况?深夜加班调试产线检测模型,车间灯光昏暗,摄像头采集的图片黑乎乎一片,YOLO模型直接“罢工”——漏检率飙升到40%以上。上个月我在一个汽车零部件质检项目里就栽了跟头:白天模型跑得飞起,mAP@0.5达到0.92,可一到夜班,同样的产线、同样的零件,mAP直接掉到0.63。客户拍着桌子问我:“你这模型怎么还分白天黑夜?”

企鹅码农的专属播客,分享10多年的实战案例和经验解读,包含YOLO、RT-DETR、AI等各个工作领域。 286

GitNexus 核心引擎深度解析

GitNexus 核心引擎深度解析:GitNexus 是一个将代码库转换为可查询知识图谱的系统,由索引流水线、社区检测和混合搜索三大子系统组成。索引流水线通过9个阶段将代码转换为知识图谱,支持多语言解析和并行处理。社区检测采用Leiden算法进行功能聚类,流程追踪则通过BFS算法从入口点生成执行流程。混合搜索结合关键词和语义搜索,使用RRF算法融合结果。系统优化包括Worker池并行解析、语言感知导入解析、调用关系置信度计算等,实现了高效的代码分析与搜索能力。

2842

基于瑞芯微RK3562 四核 ARM Cortex-A53 + 单核 ARM Cortex-M0——Linux应用开发手册

本文主要介绍TL3562-MiniEVM评估板的AMP(Asymmetric Multi-processing)开发案例,介绍基于Linux + RT-Thread(RTOS)、Baremetal的AMP案例的开发环境搭建。

创龙,嵌入式一体化解决方案商 411

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Harness Engineering:2026年最被低估的工程革命

2026年2月,OpenAI的工程师Ryan Lopopolo在官方博客发布了一篇看似平淡的技术文章。文章描述了一个内部实验:一个3人小组,用5个月时间,构建并上线了一个拥有百万行代码的生产级产品。

xx_nm98的博客 1090

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Harness Engineering(驾驭工程)核心解析

Harness Engineering(国内常译“驾驭工程/管控工程”)是2026年Agent开发领域爆火的新一代工程化范式,是AI工程化从“提示工程→上下文工程”之后的第三次范式跃迁,核心解决Agent在生产环境中长期可靠运行的核心痛点。

weixin_58753619的博客 1401

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Graphify从入门到精通(非常详细),彻底搞懂下一代AI知识库,看这一篇就够了!

Graphify是一款开源命令行工具,由开发者captainkink07在Andrej Karpathy发文后连夜构建。它能将任意文件夹一键转化为持久化知识图谱,支持19种编程语言,与Claude Code深度集成,实现每次查询减少71.5倍token消耗。上线48小时内获得逾6000个GitHub星标,零遥测、无厂商锁定,数据永不离机。

m0_59164520的博客 7496

驾驭未来:零基础读懂“驾驭工程”(Harness Engineering)

在混乱中建立秩序,在复杂中寻找路径。

举世誉之而不加劝,举世非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。 2522

OpenViking 深度解析:字节跳动为 AI Agent 设计的上下文数据库

OpenViking 是字节跳动火山引擎 Viking 团队于 2026 年 1 月开源的上下文数据库(Context Database),专为 AI Agent 设计。。把 Agent 所需的一切——记忆、资源文档、技能说明——统一抽象为"文件",组织在一个虚拟文件系统中,通过专属协议viking://进行寻址和访问。OpenViking 解决的是真实存在的问题,技术思路也有其创新之处——用文件系统范式统一管理 Agent 上下文,L0/L1/L2 分层加载在 token 效率上确实能做到显著优化。

潇汀 2389

一文分清用法Dify-Plugin与SkillS

很多人会把插件(Plugin)和Skill(技能)混为一谈,二者看似都是为应用拓展能力、实现更多功能,核心定位、适用范围、使用方式却有着明确差异。

legend24and8的博客 1851

dify查询接口响应到默认的图表渲染

之后走两条线,一条线流式响应返回数据分析的回复,另一条线走图表生成线,负责生成合适的图表。由于ECharts图表生成插件,支持生成的图表有柱状图,线形图,饼图,那么我们可以设置一个问题分类,然后对于数据分类的结果再做模型数据的抽取。在工作流中新建接收http请求的节点,用以接收http请求体数据。实现的效果:可以根据请求体自定义生成合适的图表数据。数据输入:来自于http请求体的数据。插件:ECharts图表生成插件。

qq_43781332的博客 812

AI(四): 工具 (GitNexus、CLI-Anything、 OMO: Oh-My-Openagent, OMO: oh-my-codex、 OpenSpec、 Superpowers)

GitNexus 是一款能够将代码库转化为可查询知识图谱的智能工具。它的核心能力可以概括为三点:解析 —— 基于 Tree-sitter 深度解析代码,提取函数、类、变量之间的调用与依赖关系建图 —— 将代码结构存入 KuzuDB 图数据库,构建完整的代码知识图谱适配 —— 通过 MCP 协议与 Claude 等 AI 智能体无缝对接,提供结构化代码上下文。

Men-DD 2856

Harness Engineering深度指南(非常详细),软件工程转型控制系统设计,从入门到精通,收藏这一篇就够了!

George 提到 **Harness engineering** 这种模式已经出现了三次: * 第一次是在 18 世纪 80 年代,詹姆斯·瓦特(James Watt)发明了离心调速器(Centrifugal governor)。 * 第二次是在 Kubernetes 出现。 * 第三次是 OpenAI 提出的 Harness engineering。

m0_59235945的博客 1034

MCP和Skill的区别

MCP与Skill是智能系统的两个关键维度:MCP(多通道平台/处理器)作为底层架构,负责整合多模态交互渠道(如语音、文本)和计算能力;Skill则是基于MCP的具体功能模块(如"查天气""设闹钟")。核心区别在于:MCP关注系统级资源调度与跨渠道协同,为Skill提供运行环境;Skill聚焦单一任务的精准执行,依赖MCP的底层能力。二者的关系如同"舞台与演员",MCP提供基础设施,Skill实现具体功能,共同构建完整的智能交互体系。

m0_53830442的博客 2219

Graphify:开启你的文档分类新时代

Graphify:开启你的文档分类新时代 项目介绍 Graphify 是一个基于Neo4j的无管理扩展项目,专为文档和文本分类而设计。通过利用强大的自然语言处理技术,Graphify能够高效地训练模型,并对未标记的文本进行智能分类。其简洁的RESTful API使得集成到任何系统中变得轻而易举。 项目技术分析 Graphify的核心在于它的自然语言解析模型,该模型采用先进的算法抽取文本的关键信息并...

gitblog_00060的博客 708
上一篇: 程序员福音!RAG系统6大幻觉全攻略+文生图黑科技,小白也能秒懂!
下一篇: AI编程的致命陷阱:我差点被Claude带进伪代码的深渊,小白程序员必看避坑指南!
Python_金钱豹
博客等级 码龄5年 1万+粉丝 2840原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值