Dify混合检索源码解析

深入 Dify 源码,洞察 Dify RAG 切片机制实现细节 最近测试时发现 Dify 的 RAG 分片效果一般,不管是使用之前深入 Dify 源码,洞察 Dify RAG 核心机制中有调研过的默认解析还是 Unstructured 解析。因此调研比较了大量的开源框架实现了特定格式的结构化解析方案,并与 Dify 现有解析流程进行了适配。为了保证文件的解析能真正发挥出效果,需要保证预处理中其他环节也遵循前面的结构化方案进行处理,其中重要的一块就是文本的分片机制。深入了解 Dify 的实现细节后整理相关内容在这边,方便对 Dify RAG 实现机制感兴趣的同学。 阅读详情
AI摘要

本文对Dify混合检索源码进行解析。RetrievalService.retrieve函数按指定检索方法执行操作,之后进入DataPostProcessor进行混合检索和重排序。DataPostProcessor定义了数据后处理接口,_get_rerank_runner可创建重排序运行器,WeightRerankRunner能基于权重对搜索结果重排序。

混合检索源码解析

在这里插入图片描述

RetrievalService.retrieve

代码目录:api/core/rag/datasource/retrieval_service.py

该函数用于根据指定的检索方法执行检索操作

def retrieve(cls, retrival_method: str, dataset_id: str, query: str,
             top_k: int, score_threshold: Optional[float] = .0,
             reranking_model: Optional[dict] = None, reranking_mode: Optional[str] = None,
             weights: Optional[dict] = None):
    _"""_
_    根据指定的检索方法执行检索操作。_

_    :param retrival_method: 检索方法类型。 semantic_search full_text_search keyword_search,hybrid_search_
_    :param dataset_id: 数据集ID。_
_    :param query: 检索查询字符串。_
_    :param top_k: 返回结果的最大数量。_
_    :param score_threshold: 分数阈值,用于过滤结果。_
_    :param reranking_model: 重排序模型配置,用于对结果进行二次排序。_
_    :return: 检索结果列表。_
_    """_
_    _dataset = db.session.query(Dataset).filter(
        Dataset.id == dataset_id
    ).first()
    if not dataset or dataset.available_document_count == 0 or dataset.available_segment_count == 0:
        return []
    all_documents = [] # 存储所有检索结果
    keyword_search_documents = []
    embedding_search_documents = []
    full_text_search_documents = []
    hybrid_search_documents = []
    threads = [] # 存储执行检索的线程
    exceptions = []  # 存储执行过程中遇到的异常
    # retrieval_model source with keyword
    # 关键词检索
    if retrival_method == 'keyword_search':
        keyword_thread = threading.Thread(target=RetrievalService.keyword_search, kwargs={
            'flask_app': current_app._get_current_object(),
            'dataset_id': dataset_id,
            'query': query,
            'top_k': top_k,
            'all_documents': all_documents,
            'exceptions': exceptions,
        })
        threads.append(keyword_thread)
        keyword_thread.start()
    # 向量检索(混合检索中也会调用)

    if RetrievalMethod.is_support_semantic_search(retrival_method):
        embedding_thread = threading.Thread(target=RetrievalService.embedding_search, kwargs={
            'flask_app': current_app._get_current_object(),
            'dataset_id': dataset_id,
            'query': query,
            'top_k': top_k,
            'score_threshold': score_threshold,
            'reranking_model': reranking_model,
            'all_documents': all_documents,
            'retrival_method': retrival_method,
            'exceptions': exceptions,
        })
        threads.append(embedding_thread)
        embedding_thread.start()

    # 文本检索(混合检索中也会调用)
    if RetrievalMethod.is_support_fulltext_search(retrival_method):
        full_text_index_thread = threading.Thread(target=RetrievalService.full_text_index_search, kwargs={
            'flask_app': current_app._get_current_object(),
            'dataset_id': dataset_id,
            'query': query,
            'retrival_method': retrival_method,
            'score_threshold': score_threshold,
            'top_k': top_k,
            'reranking_model': reranking_model,
            'all_documents': all_documents,
            'exceptions': exceptions,
        })
        threads.append(full_text_index_thread)
        full_text_index_thread.start()
    # 等待所有线程完成
    for thread in threads:
        thread.join()
    # 如果执行过程中有异常,则合并异常信息并抛出
    if exceptions:
        exception_message = ';\n'.join(exceptions)
        raise Exception(exception_message)
    # 混合检索之后会执行向量和文本检索结果合并后的重排序
    if retrival_method == RetrievalMethod.HYBRID_SEARCH.value:
        data_post_processor = DataPostProcessor(str(dataset.tenant_id), reranking_mode,
                                                reranking_model, weights, False)
        all_documents = data_post_processor.invoke(
            query=query,
            documents=all_documents,
            score_threshold=score_threshold,
            top_n=top_k
        )
        # print("混合搜索",all_documents)
    return all_documents

假设本次选择的检索方法是 高质量-混合检索-权重则代码分别会开启两个线程走到 RetrievalMethod.is_support_semantic_search(retrival_method)

RetrievalMethod.is_support_fulltext_search(retrival_method)

执行向量以及全文检索查询,之后会走到 DataPostProcessor 中进行混合检索,然后根据是否开启 Rerank 模型进行重排序

DataPostProcessor

代码目录:api/core/rag/data_post_processor/data_post_processor.py

DataPostProcessor 定义了一个数据后处理接口,用于对搜索结果进行重排序和重新排序。构造函数初始化了重排序和重新排序运行器实例,而 invoke 方法则根据这些实例执行相应的操作,并返回处理后的文档列表。

class DataPostProcessor:
    """接口用于数据后处理文档。
    """

    def __init__(self, tenant_id: str, reranking_mode: str,
                 reranking_model: Optional[dict] = None, weights: Optional[dict] = None,
                 reorder_enabled: bool = False):
        _# 初始化 DataPostProcessor 实例_
        _# 创建重排序运行器实例_
        self.rerank_runner = self._get_rerank_runner(reranking_mode, tenant_id, reranking_model, weights)
        _# 创建重新排序运行器实例_
        self.reorder_runner = self._get_reorder_runner(reorder_enabled)
_get_rerank_runner

根据提供的配置来创建一个重排序(reranking)运行器实例,调整搜索结果的顺序以提高相关性。

####### 基于权重的重排序:

  1. 如果 reranking_mode 是 WEIGHTED_SCORE 且提供了 weights,则创建一个 WeightRerankRunner 实例,并使用给定的 weights 配置。
  2. weights 字典包含了 vector_setting 和 keyword_setting,这些设置分别用于向量和关键词的权重配置。

####### 基于模型的重排序:

  1. 如果 reranking_mode 是 RERANKING_MODEL 且提供了 reranking_model,则尝试获取对应的模型实例。
  2. 获取模型实例的过程可能抛出 InvokeAuthorizationError 异常,此时返回 None。
  3. 成功获取模型实例后,创建并返回一个 RerankModelRunner 实例。

####### 详细代码

def _get_rerank_runner(self, reranking_mode: str, tenant_id: str, reranking_model: Optional[dict] = None,
                       weights: Optional[dict] = None) -> Optional[RerankModelRunner | WeightRerankRunner]:
    # 根据提供的配置来创建一个重排序(reranking)运行器实例。重排序通常用于调整搜索结果的顺序以提高相关性。

    # 判断是否使用基于权重的重排序模式
    if reranking_mode == RerankMode.WEIGHTED_SCORE.value and weights:
        # 创建 WeightRerankRunner 实例
        return WeightRerankRunner(
            tenant_id,  # 租户ID
            Weights( # 创建 Weights 对象
                vector_setting=VectorSetting( # 创建 VectorSetting 对象
                    vector_weight=weights['vector_setting']['vector_weight'],  # 向量权重
                    embedding_provider_name=weights['vector_setting']['embedding_provider_name'], # 嵌入式提供商名称
                    embedding_model_name=weights['vector_setting']['embedding_model_name'],  # 嵌入式模型名称
                ),
                keyword_setting=KeywordSetting( # 创建 KeywordSetting 对象
                    keyword_weight=weights['keyword_setting']['keyword_weight'], # 关键词权重
                )
            )
        )
    # 判断是否使用基于模型的重排序模式
    elif reranking_mode == RerankMode.RERANKING_MODEL.value:
        if reranking_model:
            try:
                # 创建 ModelManager 实例
                model_manager = ModelManager()
                # 获取模型实例
                rerank_model_instance = model_manager.get_model_instance(
                    tenant_id=tenant_id, # 租户ID
                    provider=reranking_model['reranking_provider_name'], # 模型提供商名称
                    model_type=ModelType.RERANK,  # 模型类型
                    model=reranking_model['reranking_model_name'] # 模型名称
                )
            except InvokeAuthorizationError:
                return None
            return RerankModelRunner(rerank_model_instance)
        return None
    # 如果既不是基于权重也不是基于模型的重排序模式,则返回 None
    return None
invoke

根据返回的实例 WeightRerankRunner/ModelManager 调用对应的 run 方法 在构造函数初始化了重排序和重新排序运行器实例

def invoke(self, query: str, documents: list[Document], score_threshold: Optional[float] = None,
           top_n: Optional[int] = None, user: Optional[str] = None) -> list[Document]:
    #根据返回的实例WeightRerankRunner/ModelManager调用对应的run方法
    if self.rerank_runner:
        _# 执行重排序_
        documents = self.rerank_runner.run(query, documents, score_threshold, top_n, user)
        
    if self.reorder_runner:
        _# 执行重新排序_
        documents = self.reorder_runner.run(documents)

    return documents
WeightRerankRunner

代码目录:api/core/rag/rerank/weight_rerank.py

基于权重的重排序功能,用于对搜索结果中的文档进行重新排序,以提高相关性。

run

执行重排序逻辑,包括去除重复文档、计算关键词得分、计算向量得分、合并得分、应用分数阈值、更新文档元数据中的得分、排序文档以及返回指定数量的文档。

def run(self, query: str, documents: list[Document], score_threshold: Optional[float] = None,
        top_n: Optional[int] = None, user: Optional[str] = None) -> list[Document]:
    _"""_
_   执行基于权重的重排序_

_    :param query:  搜索查询_
_    :param documents:  文档列表_
_    :param score_threshold:  分数阈值_
_    :param top_n: 返回的文档数量上限_
_    :param user: unique user id if needed_

_    :return:  重排序后的文档列表_
_    """_
_    _docs = [] # 用于存储文档内容
    doc_id = []  # 用于存储文档ID
    unique_documents = []  # 用于存储去重后的文档
    for document in documents:
        if document.metadata['doc_id'] not in doc_id:
            doc_id.append(document.metadata['doc_id'])  # 添加文档ID
            docs.append(document.page_content) # 添加文档内容
            unique_documents.append(document) # 添加文档

    documents = unique_documents  # 更新文档列表为去重后的列表

    rerank_documents = []   # 用于存储重排序后的文档
    # 计算关键词
    query_scores = self._calculate_keyword_score(query, documents)
    # 计算向量
    query_vector_scores = self._calculate_cosine(self.tenant_id, query, documents, self.weights.vector_setting)
    # 合并
    for document, query_score, query_vector_score in zip(documents, query_scores, query_vector_scores):
        # 计算文档的最终
        score = self.weights.vector_setting.vector_weight * query_vector_score + \
                self.weights.keyword_setting.keyword_weight * query_score
        # 应用分数阈值
        if score_threshold and score < score_threshold:
            continue
        # 更新文档元数据中的得分
        document.metadata['score'] = score
        # 添加文档到重排序列表
        rerank_documents.append(document)
    # 排序文档
    rerank_documents = sorted(rerank_documents, key=lambda x: x.metadata['score'], reverse=True)
    # 返回指定数量的文档
    return rerank_documents[:top_n] if top_n else rerank_documents

####### _calculate_keyword_score

根据关键词计算文档与查询之间的余弦相似度得分。

def _calculate_keyword_score(self, query: str, documents: list[Document]) -> list[float]:
    _"""_
_      计算文档与查询之间的余弦相似度得分。_
_    :param query: search query_
_    :param documents: documents for reranking_

_    :return:   每个文档的BM25得分列表_
_    """_
_    _keyword_table_handler = JiebaKeywordTableHandler() # 创建关键词处理实例
    query_keywords = keyword_table_handler.extract_keywords(query, None) # 提取查询关键词
    documents_keywords = [] # 用于存储文档关键词
    for document in documents:
        # # 提取文档关键词
        document_keywords = keyword_table_handler.extract_keywords(document.page_content, None)
        document.metadata['keywords'] = document_keywords  # 将关键词存入文档元数据
        documents_keywords.append(document_keywords)  # 添加文档关键词到列表

    # 统计查询关键词的词频(TF)
    query_keyword_counts = Counter(query_keywords)
    # 总文档数
    total_documents = len(documents)

    #  计算所有文档关键词的逆文档频率(IDF)
    all_keywords = set()  # 用于存储所有文档中的关键词
    for document_keywords in documents_keywords:
        all_keywords.update(document_keywords) # 更新所有关键词集合

    keyword_idf = {}   # 用于存储关键词的IDF值
    for keyword in all_keywords:
        # 计算包含特定关键词的文档数量
        doc_count_containing_keyword = sum(1 for doc_keywords in documents_keywords if keyword in doc_keywords)
        # 计算IDF
        keyword_idf[keyword] = math.log((1 + total_documents) / (1 + doc_count_containing_keyword)) + 1

    query_tfidf = {} # 用于存储查询关键词的TF-IDF值

    for keyword, count in query_keyword_counts.items():
        tf = count  # 查询关键词的词频
        idf = keyword_idf.get(keyword, 0)  # 查询关键词的IDF
        query_tfidf[keyword] = tf * idf # 计算查询关键词的TF-IDF值

    # 计算所有文档的TF-IDF值
    documents_tfidf = []
    for document_keywords in documents_keywords:
        document_keyword_counts = Counter(document_keywords) # 统计文档关键词的词频
        document_tfidf = {} # 用于存储文档关键词的TF-IDF值
        for keyword, count in document_keyword_counts.items():
            tf = count # 文档关键词的词频
            idf = keyword_idf.get(keyword, 0) # 文档关键词的IDF
            document_tfidf[keyword] = tf * idf  # 计算文档关键词的TF-IDF值
        documents_tfidf.append(document_tfidf) # 添加文档TF-IDF值到列表

    # 定义余弦相似度计算函数
    def cosine_similarity(vec1, vec2):
        # 计算两个向量的交集
        intersection = set(vec1.keys()) & set(vec2.keys())
        # 计算分子
        numerator = sum(vec1[x] * vec2[x] for x in intersection)
        # 计算分母
        sum1 = sum(vec1[x] ** 2 for x in vec1.keys())
        sum2 = sum(vec2[x] ** 2 for x in vec2.keys())
        denominator = math.sqrt(sum1) * math.sqrt(sum2)
        # 避免除以零的情况
        if not denominator:
            return 0.0
        else:
            return float(numerator) / denominator

    # 初始化用于存储文档相似度得分的列表
    similarities = []
    # 计算每个文档与查询之间的相似度得分
    for document_tfidf in documents_tfidf:
        similarity = cosine_similarity(query_tfidf, document_tfidf)
        similarities.append(similarity)

    # for idx, similarity in enumerate(similarities):
    #     print(f"Document {idx + 1} similarity: {similarity}")
    # 返回相似度得分列表
    return similarities

####### _calculate_cosine

根据向量计算_查询与文档之间的余弦相似度得分。_

def _calculate_cosine(self, tenant_id: str, query: str, documents: list[Document],
                      vector_setting: VectorSetting) -> list[float]:
    _"""_
_    计算查询与文档之间的余弦相似度得分。_

_    :param tenant_id: 租户ID,用于获取特定租户的模型实例_
_    :param query: 搜索查询字符串_
_    :param documents: 包含多个文档的列表_
_    :param vector_setting: 向量设置对象,包含嵌入模型的信息_
_    :return: 每个文档与查询之间的余弦相似度得分列表_
_    """_
_    _# 初始化用于存储查询与文档之间余弦相似度得分的列表
    query_vector_scores = []
    # 创建模型管理器实例
    model_manager = ModelManager()
    # 获取指定租户的嵌入模型实例
    embedding_model = model_manager.get_model_instance(
        tenant_id=tenant_id, # 租户ID
        provider=vector_setting.embedding_provider_name, # 嵌入模型提供商名称
        model_type=ModelType.TEXT_EMBEDDING, # 模型类型为文本嵌入
        model=vector_setting.embedding_model_name # 嵌入模型名称

    )
    # 创建缓存嵌入实例
    cache_embedding = CacheEmbedding(embedding_model)
    # 为查询生成嵌入向量
    query_vector = cache_embedding.embed_query(query)
    # 遍历每个文档
    for document in documents:
        # 如果文档元数据中已经存在得分,则直接使用
        if 'score' in document.metadata:
            query_vector_scores.append(document.metadata['score'])
        else:
            # 获取文档的嵌入向量
            content_vector = document.metadata['vector']
            # 将查询向量和文档向量转换为NumPy数组
            vec1 = np.array(query_vector)
            vec2 = np.array(document.metadata['vector'])

            # 计算点积
            dot_product = np.dot(vec1, vec2)

            # 计算向量范数
            norm_vec1 = np.linalg.norm(vec1)
            norm_vec2 = np.linalg.norm(vec2)

            # 计算余弦相似度
            cosine_sim = dot_product / (norm_vec1 * norm_vec2)
            # 将余弦相似度得分添加到列表中
            query_vector_scores.append(cosine_sim)

    return query_vector_scores
Dify v1.16.1知识库检索源码深度解析:pgvector与rerank机制 知识库检索是RAG系统的核心环节,其本质是召回与重排序(rerank)的协同过程。基于向量数据库(如pgvector)的语义召回提供广度,而rerank模型则通过精细化打分提升精度。Dify v1.16.1采用混合检索架构,融合BM25关键词匹配与向量相似度计算,并在底层深度耦合pgvector的HNSW索引参数与rerank触发逻辑。该版本将rerank设为默认关闭的可选模块,其开关隐藏于源码注释中,需手动启用并适配模型加载、元数据过滤及embedding维度一致性等工程细节。本文聚焦Dify v1.16 阅读详情

相关推荐

Dify深度实践:从安装部署到排错与二次开发全指南

在LLM应用开发项目中,如何高效构建知识库问答、Agent工作流等场景,是工程落地的关键挑战。传统的编码方式需要串联Prompt模板、上下文检索、工具调用与多轮记忆,调试成本极高。RAG架构通过文档解析、分块、向量化与混合检索,让模型基于私有知识生成可靠回答,而Dify则将这些固定动作沉淀为可视化组件,大幅降低试错门槛。无论是本地服务器还是Windows环境,开发者都能通过Docker Compose快速拉起环境,并借助路由召回、Rerank重排与引用溯源优化效果。面对SSL校验失败、文档解析器未配置、Fu

weixin_29062865的博客 235

Dify源码解析:基础架构与核心概念

Dify支持通过插件扩展功能,用户可以开发自己的插件来满足特定需求。例如,开发一个与企业内部系统的集成插件。Python# 自定义逻辑Dify工作流是一个功能强大且灵活的自动化工具,适用于多种应用场景。通过本文的介绍,我们深入了解了Dify工作流的高级应用、性能优化、安全策略以及与其他系统的集成方法。希望读者通过本文对Dify工作流有更深入的了解,并能够在实际工作中应用它来提升效率。

加入“Super Entity”,与全能开发团队共探AI智能体与数字人项目,开启前沿技术之旅。 3519

手把手教你用Dify 0.6.0源码搭建自己的AI工作流引擎(附避坑指南)

本文详细介绍了如何使用Dify 0.6.0源码搭建企业级AI工作流引擎,包括开发环境配置、核心架构解析、企业级功能增强和生产环境调优。通过源码深度解析和实战案例,帮助开发者掌握Dify的插件化模型路由系统和工作流引擎的DAG实现,提升企业级AI应用的开发效率。

weixin_29269441的博客 231

深入 Dify 源码,定位知识库检索的大模型调用异常

之前在 GPU 服务器上部署了Dify 服务,使用的是 Dify 与 Xinference 组合,Xinference 部署的大模型是。基于本地部署的服务构建了知识库,并利用首页提供的任务流模板创建了一个 RAG 工作流知识库检索环节预期不需要调用大模型,实际却调用了大模型;本地没有配置 GPT3.5, 为什么会选择 GPT3.5 模型;这篇文章就从问题出发,借助源码与对应的服务 API 请求信息,定位问题的根本原因。从本轮的追踪来看,知识库检索选择N选1召回。

易迟的专栏 6603

三周逆向六款开源RAG,提炼自研企业级知识库架构蓝图

检索增强生成(RAG)通过“检索+生成”的架构,让大模型在私有知识库中精准获取上下文并给出可溯源的答案。其核心原理涉及文档解析、文本切分、向量化、混合检索与重排,形成从数据接入到答案输出的完整链路。在工程实践中,向量数据库、Embedding模型与Rerank组件的选型直接影响召回效果。开源项目虽然提供了丰富的参考实现,但面对政企私有化部署、中文长文档多轮对话和深度工作流定制,往往需要自研改造。本文基于六款主流开源RAG项目的源码拆解,归纳共性骨架、关键参数与踩坑实录,并沉淀出一套可复用的七层自研架构蓝图,

weixin_29040367的博客 246

【Dify(v1.x) 核心源码深入解析】Agent 模块

Agent 模块是 Dify 中负责处理用户请求的核心组件。接收用户输入并解析请求。根据请求内容调用合适的工具或模型。生成响应并返回给用户。管理整个交互流程,包括工具调用、消息处理和状态管理。通过本文的详细解析,我们深入了解了 Dify 的 Agent 模块的架构设计和实现细节。Agent 模块通过灵活的策略、丰富的工具、高效的消息处理和状态管理,为开发者提供了一个强大的 AI 应用开发平台。希望本文能帮助你更好地理解和使用 Dify 的 Agent 模块。更智能的策略。

1593

Dify 1.8.0源码深度剖析:大模型应用架构设计与实战技巧全解析!大模型应用

Dify 1.8.0作为开源AI应用开发平台,采用蜂巢架构设计。本文详细解析其异步工作流引擎、RAG混合检索机制和Agent双策略实现,提供源码阅读导航与调试技巧,并通过实际案例展示问题解决方案。文章最后总结核心学习路径与资源,帮助开发者从架构理解到实战应用,全面掌握大模型应用开发关键技术。

m0_65555479的博客 1375

【Dify(v1.x) 核心源码深入解析】errors、extension 和 external_data_tool 模块

通过对 Dify 中 errors、extension 和 external_data_tool 模块的深入剖析,我们不仅了解了其各个模块内部的精细结构和工作原理,还掌握了它们之间的关联与协同机制。这些模块为 Dify 应用提供了强大的错误处理、灵活的扩展能力和便捷的外部数据集成支持,是构建现代化、高性能软件系统的重要基石。希望本文的讲解能够帮助您更好地理解和运用 Dify,激发您在软件开发领域的更多创意和实践。

500

Dify深度解析:从源码部署到工作流实战的完整指南

LLM应用开发中,RAG链路、工作流编排与知识库管理常是最耗时的重复性工作。可视化AI应用开发平台通过抽象“应用-工作流-知识库”三层结构,将复杂业务逻辑以拖拽节点的方式呈现,其底层基于DAG调度实现节点执行,并以事件流反馈运行状态。在工程实践中,本地部署与源码二次开发提供了扩展空间,能够快速落地企业内部知识助手、多轮客服机器人等场景。结合知识库的ETL、检索调优和工作流条件分支设计,可显著降低交付成本。基于Dify的源码阅读、部署实践与故障排查,揭示了平台的能力边界与选型思路,适合正在构建LLM应用的团队

weixin_42667269的博客 190

【随机过程】 3 - 随机过程的频域分析1 - 功率谱

随机过程的频域分析 文章目录随机过程的频域分析1. 什么是谱2. 确定信号的频谱2.1 周期信号的频谱2.2 非周期信号的频谱3. 随机信号的谱3.1 随机信号做傅里叶分析的困难3.2 功率谱密度的物理和数学表示形式3.2.1 功率谱密度的物理表示3.2.2 功率谱密度的数学表示3.3 功率谱密度的解读3.3.1 量纲分析3.3.2 谱3.3.3 密度3.3.4 wiener和khinchin3.4 功率谱密度的性质3.4.1 非线性3.4.2 偶函数3.5 wiener-khinchin关系的应用3.6

qq_41741344的博客 3133

计算机模拟爆破过程,基于LSDYNA岩石爆破模拟建模分析

原标题:基于LSDYNA岩石爆破模拟建模分析 Ls Dyna岩石爆破模拟仿真作者:dyna_focus擅长领域:dyna/abaqus/hypermesh一、 数值模型的建立1.1 单元及算法的选择岩石,炸药,空气都采用solid164实体单元。岩石采用常应力实体单元,该种单元属于纯粹的lagrange算法,该种算法单元网格附着在材料上,随着材料的流动而产生单元网格的变形,但是在结构变形巨大时,有...

weixin_29494379的博客 7316

Dify实战指南:从零部署到工作流与知识库深度应用

大语言模型(LLM)和检索增强生成(RAG)是当前构建智能应用的核心技术。LLM提供了强大的理解和生成能力,而RAG通过结合外部知识库,有效解决了模型幻觉与知识时效性问题,显著提升了回答的准确性与可靠性。这些技术的价值在于,它们能将非结构化的数据转化为可推理、可交互的智能体,广泛应用于智能客服、内容创作、数据分析等场景。本文以Dify这一可视化AI应用开发平台为例,深入探讨其核心架构与部署实战,特别是如何利用其工作流模块进行复杂的逻辑编排,以及通过知识库构建专属的AI记忆体,从而实现高效、可控的AI应用搭建

weixin_33812433的博客 398

微信小程序推送微信服务号模板消息

微信小程序中发送微信服务号模板消息,无需用户手动确认订阅,无需绑定开放平台,无需使用UnionId。

qq_20751269的博客 1556

【AI大模型落地】构建行业RAG应用系统:金融、财务、保险、医疗等行业该怎么做?

金融、财务、保险和医疗行业创建 RAG 应用系统的意义 RAG 应用系统在金融、财务、保险和医疗行业中具有重要意义,可高效识别 PDF 和图片中的表格信息,如财务报表、资产负债表、保险理赔单和医疗化验结果等。通过将这些表格转化为结构化数据并存储于向量数据库,RAG 系统能快速检索和分析数据,支持智能决策、优化规划、提升效率,并实现个性化服务。

Android23333的博客 1353

手把手拆解:储能电站如何实现‘孤岛运行’与‘黑启动’?从SVPWM控制到无缝并网

本文深入解析储能电站的孤岛运行与黑启动技术,从SVPWM控制策略到电网重构实战。通过详细的三环控制架构和黑启动五阶段技术路线,展示储能电站在电网故障时如何快速切换为独立电压源并实现电网重建。文章还探讨了虚拟惯量补偿、多站协同控制等前沿技术,为电力系统应急恢复提供关键解决方案。

weixin_30509393的博客 305

新手避坑指南:用COMSOL Multiphysics仿真气体放电(汤逊vs.流注)

本文详细介绍了使用COMSOL Multiphysics仿真气体放电的实战指南,涵盖汤逊理论和流注模型的实现方法。通过对比两种放电模型的关键参数和物理场配置,帮助新手避免常见错误,准确预测气体击穿过程。文章还提供了工程应用案例,如高压绝缘子设计优化,展示了仿真技术在电力设备绝缘设计中的实际价值。

weixin_28716181的博客 473

WeKnora实战:从部署到调优,打造企业级RAG知识库

检索增强生成(RAG)已成为企业构建智能问答系统的核心技术,但落地效果常受限于文档解析、分块策略与检索精度。本文从RAG基础原理出发,梳理了从文档入库到混合检索、重排生成的关键链路,并结合WeKnora这一开源知识库平台,给出了完整的部署实战与调优经验。通过对比Dify、RAGFlow、MaxKB等主流方案,帮助读者在企业知识库、私有化问答等场景下做出合理的选型决策。文中还分享了大量真实案例,如解析失败排查、命中率从30%提升到85%的调优过程,以及Ollama私有化部署小模型的实践,对希望将RAG落地到实

weixin_33309048的博客 242

PyQt5数据库开发3 6 QSqlQuery完整实操案例【图文详解】

PyQt5数据库开发3 6.1 QSqlQuery实操案例【多图详解】,本文有点长,主要每一个步骤都有对应的图文教程!!!

qq_53317005的博客 2963

拆解六款开源RAG:自研知识库的架构蓝图与避坑指南

检索增强生成(RAG)是解决大模型知识幻觉与私有数据接入的关键技术路径。其核心原理并非简单的“向量库+大模型”,而是由数据接入、文档解析切分、混合检索、重排、上下文生成与状态管理构成的完整工程链路。针对复杂排版文档、精确匹配需求与知识库动态更新等场景,采用向量检索与BM25关键词融合、引入Rerank重排、维护文档与分块状态机,可显著提升问答质量与系统可维护性。通过逆向六款开源项目(RAGFlow、QAnything、Dify、FastGPT、LlamaIndex、Haystack)的架构,可提炼出通用五层

weixin_42528974的博客 331

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

从零搭建RAG提示流编排器:知识库架构与画布节点实战

向量检索与关键词检索的混合召回是提升RAG系统检索精度的关键技术,其原理在于结合语义匹配与精确匹配的优势,通过RRF等融合算法实现互补。在技术价值上,混合检索能显著提高专有名词、错误码等场景的召回率,同时保持语义泛化能力。典型应用场景包括企业私有知识库、技术文档问答和客服系统。进一步地,将RAG流程拆解为可组合的画布节点,如检索、重排、生成等,能实现更灵活的编排与调试。本文深入探讨如何从零构建提示流编排器,重点解析知识库架构与RAG画布节点的设计,并借鉴Dify的流水线思想,给出可落地的工程实践方案。

weixin_29047919的博客 289

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

从Dify学习:自研RAG知识库与提示流编排器实战

RAG(检索增强生成)是企业构建私有知识问答系统的核心技术,它通过将外部文档检索与生成模型结合,让AI回答更精准、可溯源。一个完整的RAG链路涉及文档解析、文本分块、向量化、混合检索与重排序等关键环节,每个环节的工程实现都直接影响最终效果。同时,编排器作为连接检索、提示词与模型调用的桥梁,决定了系统能否灵活应对复杂业务场景。本文从Dify源码出发,拆解其数据集解耦、文档流水线和三段式检索设计,并基于FastAPI与pgvector实现轻量级RAG知识库,封装为可复用的画布节点,支持私有部署和深度定制。通过混

weixin_30694389的博客 287

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

六款开源RAG框架逆向分析与自研RAG蓝图落地实践

检索增强生成(RAG)是提升大模型私有域问答能力的关键技术,其原理是通过检索外部知识库来辅助生成,无需重新训练模型。在实际落地中,文档解析、文本分块、向量化、索引构建、检索召回、重排序和上下文组装等环节环环相扣,任一环节失配都会影响整体效果。直接套用开源框架虽快速,却常面临抽象层过深、默认参数不适配、私有化部署受限和升级不可控等隐性成本。为此,本文逆向拆解LangChain、LlamaIndex、Haystack、Dify、RAGFlow、FastGPT六款主流开源项目的设计取舍,提炼出分层模块解耦、标准数

weixin_32678995的博客 225

用WeKnora搭建RAG知识库:解析、召回与编排全解

RAG(检索增强生成)是企业落地AI应用的关键技术,它通过把私域知识注入大模型,让回答有据可依。但真实场景中,从文档解析到答案生成,中间涉及文本切片、向量化、混合检索、重排序以及流程编排等复杂环节,任一短板都会拖累最终效果。WeKnora是腾讯微信团队开源的知识库系统,将这些能力整合为开箱即用的产品,提供可视化后台、灵活的参数配置与API接口,并支持本地模型和云端大模型混合部署。本文从RAG的三大核心问题出发,拆解WeKnora的架构与模块,分享Docker部署、文档预处理、召回优化与常见排错经验,帮助团队

weixin_28678151的博客 266

Dify 解析-RAG

Dify 是一个流行的开源大模型应用开发平台。其核心理念是 "Do It For You"。Dify 内置了构建 LLM 应用所需的关键技术栈,包括插件、代理/反向代理、数据库/缓存、实验训练和可观测(Open Telemetry)。Dify 通过 RAG 技术,实现了对外部知识的高效利用,极大地提升了大模型生成内容的质量和相关性。RAG 架构中的知识库管理、检索引擎、提示词管理和模型推理服务等组件相互配合,共同构成了一个完整的 RAG 系统。

CCbleach的专栏 3012
上一篇: 启航,带着梦想出发!
下一篇: Dify 知识库操作源码解析
AI航海家(Ethan)
博客等级 码龄7年 477粉丝 91原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值