dify使用&RAG开发指南(保姆级攻略)

一、访问Dify

  在浏览器中访问http://XXX.XXX.XXX.XXX/apps,然后使用账号信息登录图1。

image

图1 Dify登录界面

  成功登录后,可看到图2Dify工作室界面。

 

image

 图2 Dify工作室

二、构建RAG应用

2.1构建知识库

  点击图2上方的知识库标签,可看到图3中的知识库标签页。

image

 图3 知识库标签页

       点击图3左上的创建知识库,打开图4中的创建知识库—选择数据源页面。

image

 图4 创建知识库—选择数据源

       点击选择文件,选中需要导入的文件,如图5所示,注意Dify并不支持java文件直接导入,需将.java扩展名修改为图4中所示的文件类型,如.txt。

image

 图5 选择要导入知识库的文件

       选择文件并导入后,显示图6所示的已导入文件列表。

image

图6 已导入文件列表

       图6中点击下一步,进入图7的文本分段与清洗界面。

image

 图7 文本分段与清洗

       图6点击分段设置->自定义选项,参考图8进行设置,

image

图8 自定义分段设置

       继续接着图9检索设置。

image

图9 检索设置

       图9检索设置点击保存并处理,等待处理完成,便可看到图10中的知识库创建完成界面。

image

图10 知识库创建完成

       点击图10中的前往文档,打开图11中的文档列表页。

image

图11 文档列表页

       可在每个文档最右侧的按钮,对该文档进行设置调整,如图12所示。

image

图12 对单个文档进行设置

2.2 构建RAG应用

  点击图12正中上方的工作室,进入工作室标签页,如图2所示。
  点击图2左上方创建应用格子中的创建空白应用,进入图13中的创建空白应用界面。

image

图13 创建空白应用

       本文档演示如何构建聊天助手,因此参照图14填写构建信息。

image

图14 构建聊天助手

       点击图14中的创建按钮,进入图15所示的编排界面。

image

图15 编排界面

2.2.1设置提示词

  点击图15右上角的生成,打开图16所示的提示词生成器,并输入提示词指令,然后点击生成按钮,然后显示图17的提示词生成结果。

image

图16 提示词生成器

       确定图17中的提示词、变量等内容是否符合要求,然后点应用。

image

图17 生成的提示词

       图18为生成并应用提示词后的编排界面,可在此界面上调整提示词内容、编辑变量属性、设置变量初值(few shot)、选择和配置大模型,以及与大模型对话。

image

图18 生成并应用提示词后的编排界面

2.2.2编辑提示词

       图19为编辑提示词的控件,可根据实际需要调整提示词模板内容。

image

图19 编辑提示词区

2.2.3编辑变量

       图20为变量编辑区,可删除变量、设置变量是否必选,以及点击 ,进入变量详细设置界面,如图21所示,可设置变量类型、修改变量名称、最大长度等属性。

 

图20 变量编辑区

 

图21 变量详细属性编辑区


2.2.4上下文设置

  上下文设置即设置需要扫描的代码范围,即对应2.1节构建的知识库。
  点击图22右上角的添加,打开图23所示的选择引用的知识库界面。

 

图22 上下文区

image

图23 选择引用的知识库

       在图23中选择需要引用的知识库,并点击添加。

图24 选择知识库后的上下文区

       图24为选择知识库后的上下文区,此时可继续选择添加多个知识库,也可点击召回设置,设置RAG的召回行为,如图25所示,可选择Rerank模型、Top K设置、Score阈值等。

 

图25 召回设置

2.2.5变量初值设置

  图26为变量初值设置区,可对变量设置初值,该变量对应图19编辑提示词区内容的Few Shot部分,如图27所示。

图26 变量初值设置区

图27 提示词Few Shot部分

       图28为设置变量初值后的界面。

image

图28 填充变量初值

2.2.6 聊天对话区

  用户可在图29所示的聊天对话区,与大模型进行对话。

 

图29 聊天对话区

2.2.7大模型配置区

  图30为大模型配置区,可选择不同的大模型,以及对选中模型设置其温度、topP、惩罚因子等参数,也可多个模型并行调试。

image

图30 大模型配置区

 

       至此,一个基本RAG所需的功能都简单说明了下。

三、RAG测试效果

3.1 知识库

  知识库采用2.1节构建的知识库。

3.2 测试样本

  表1为测试样本,共计3个样本,其中1个非问题,2个是问题。

  表1 测试样本

image

 

3.3 测试效果

  图31为测试效果截图,2个是问题的样本,大模型回基本正确,1个非问题的分析有点出入。

image

图31 测试效果截图

  图31对应的完整回答文本如下:

好,我现在需要分析用户提供的代码,找出其中的多线程问题。首先,我会逐一查看每个类,寻找与多线程相关的关键词和潜在问题。

OaReassignServiceImpl类:

 

使用了CompletableFuture和Executor来执行异步任务。

在executeReassign方法中,使用CompletableFuture.runAsync来异步执行reassignLotService.reassignLotByLock方法。这里需要注意的是,如果reassignLotService的方法内部没有正确处理并发,可能会导致数据不一致。

在waitAllReassignComplete方法中,遍历所有CompletableFuture并调用join()。如果其中一个任务失败,join()会抛出异常,但当前代码只是捕获异常并记录日志,没有重试或回滚机制,可能导致部分任务执行失败但整体返回成功,引发不一致。

checkDifferentUpgradeTags方法中,多个线程可能同时修改reassignRes列表,但由于使用的是CopyOnWriteArrayList,所以线程安全,没有问题。

YYYYLotOpenController类:

 

使用了CompletableFuture.runAsync来异步执行批量Hold操作,但没有处理可能的并发问题,比如多个线程同时修改相同的数据,可能会导致竞态条件。

batchHoldByAsync方法中,异步任务直接提交到executor,但没有控制任务的数量和顺序,可能导致资源耗尽或处理顺序混乱。

HandlerManager类:

 

没有明显的多线程问题,主要是注册和处理逻辑,但handlerMap的访问没有同步机制,如果多个线程同时注册或处理,可能会导致不一致。

总结一下,主要的多线程问题集中在异步任务的处理和资源管理上,特别是在结果处理和异常管理方面可能存在问题。

在分析提供的代码后,发现了以下几个潜在的多线程问题:

 

1. XXXXServiceImpl 类

问题:在 executeReassign 方法中使用了 CompletableFuture.runAsync 来执行异步任务。虽然每个任务都提交到线程池中,但如果 reassignLotService.reassignLotByLock 方法内部没有正确处理并发,可能会导致数据不一致。

分析:reassignLotService.reassignLotByLock 方法的实现未在上下文中提供,但如果没有正确的锁机制或事务管理,可能会导致多个线程同时修改相同的数据。

2. YYYYOpenController 类

问题:在 batchHoldByAsync 方法中,使用了 CompletableFuture.runAsync 来异步执行批量Hold操作。然而,该方法没有处理可能的并发问题,例如多个线程同时处理相同的数据,可能会导致竞态条件。

分析:异步任务直接提交到 executor,但没有控制任务的数量和顺序,可能导致资源耗尽或处理顺序混乱。

3. HandlerManager 类

问题:handlerMap 的访问没有同步机制。如果多个线程同时调用 register 或 handle 方法,可能会导致 handlerMap 的状态不一致。

分析:在 register 和 handle 方法中,handlerMap 的访问是无锁的,这在多线程环境下可能导致竞态条件。

总结

以上代码中存在潜在的多线程问题,特别是与异步任务的处理和共享资源的访问有关。建议在多线程环境下使用适当的锁机制或同步工具来确保数据的一致性和线程安全。

 

引用

 

四、总结

  •  知识库构建,文档分段最大长度是4000个token,每个token 3~4个字符,即一个文档分段(chunk)最多覆盖1.2w~1.6w个字符;
  • DeepSeek-R1-Distill-Qwen-32B,prompt最大长度限制在20K个token左右,其实DeepSeek-R1-Distill-Qwen-32B的上下文长度在128K个token,尝试在Dify模型供应商那里设置上下文长度为128K,但没有用;
  • Top K最大值为10,太小了,对实际应用场景没有意义;
  • document=>chunks的切分方式单一,只能根据一个分割符分段;
  • 通过RAG定位多线程代码,效果没能达预期的效果,需要通过其他方式探索。

 

关注更多安卓开发、AI技术、股票分析技术及个股诊断等理财、生活分享等资讯信息,请关注本人公众号(木圭龙的知识小屋)

 

posted @ 2026-03-27 16:03  tgltt  阅读(3)  评论(0)    收藏  举报