当前位置:首页 > AI > 正文内容

凭借AI帮手快速解析LlamaIndex的Workflow规划与Java搬迁

邻居的猫1个月前 (12-09)AI1682

在前面的评论中,咱们经过AI帮手快速阅读并剖析了LlamaIndex的中心源码及其可视化部分。在前次的作业中,咱们已根本完结了运用Java版别完结的可视化部分,虽然在作业流(workflow)的剖析上仅仅进行了开端评论。今日,咱们将深入评论一个要害问题:能否将LlamaIndex在Python中的事务流程和中心代码,成功搬迁并转化为Java版别。

接下来,咱们将直接进入正题。首要,咱们回忆一下LlamaIndex的全体架构和中心功用,然后着手进行Java版别的开发完结。

Workflow

或许咱们现已有些遗忘了之前的细节,因而仅经过文字描述并记录下来,或许无法像可视化图示那样快速有效地协助咱们回忆起要害内容。为了更明晰地整理思路,并协助咱们更直观地了解和回忆,我制作一张扼要的总结结构图。

扼要总结结构图

首要,咱们将从一个简练的视点,回忆几个要害的中心类,并详细剖析它们各自的特点和办法。如图所示:

image

剩余的部分便是至关重要的事务流程类 workflow 了。为了保证咱们对全体事务流程有一个明晰的认知,咱们可以先对事务流程进行一个扼要的整理。这儿不需求过多重视细节,细节部分可以经过检查源码来进一步评论。

image

好的,接下来咱们将逐个经过AI帮手来协助咱们完结代码转化的作业。虽然咱们清楚地知道,AI的输出或许无法到达100%的完美作用,但即便如此,凭借AI的辅佐,至少可以大幅度进步功率,估计可以节约大约50%的编码时刻。咱们现在就开端吧。

规划

Event

相同直接问询帮手即可。

image

接下来,我将依据AI帮手供给的开端计划进行进一步的优化和调整。得到终究成果代码如下:

@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
@JsonInclude(JsonInclude.Include.NON_NULL)
 public abstract class  ToolEvent {

    /**
     * 事情id
     */
    private String eventId;

    /**
     * 事情name
     */
    private String eventName;

    /**
     * 存储各节点数据,并暴露出办法供其他人调用
     */
    private Map<String,Object> eventData = new HashMap<>();

    public ToolEvent(Map<String, Object> params) {
        this.eventData.putAll(params);
    }

    public Object get(String key) {
        key = this.getClass().getSimpleName() + "." + key;
        if (this.eventData.containsKey(key)) {
            return this.eventData.get(key);
        } else {
            throw new IllegalArgumentException("No such key: " + key);
        }
    }

    public void set(String key, Object value) {
        key = this.getClass().getSimpleName() + "." + key;
        this.eventData.put(key, value);
    }

    public boolean containsKey(String key) {
        key = this.getClass().getSimpleName() + "." + key;
        return this.eventData.containsKey(key);
    }

    public Set<String> keySet() {
        return this.eventData.keySet();
    }

    public Collection<Object> values() {
        return this.eventData.values();
    }

    public Set<Map.Entry<String, Object>> entrySet() {
        return this.eventData.entrySet();
    }

    public int size() {
        return this.eventData.size();
    }

    public boolean isEmpty() {
        return this.eventData.isEmpty();
    }

    public void clear() {
        this.eventData.clear();
    }

    public Map<String, Object> toMap() {
        return this.eventData;
    }

    /**
     * eventName默以为类名
     */
    public String getEventName() {
        if (this.eventName == null) {
            this.eventName = this.getClass().getSimpleName();
        }
        return this.eventName;
    }
}

可以看到,在此代码中我完结的是一个最根底的版别。咱们并不打算在初期阶段完结一切功用,而是先着手于构建一个简化版的作业流体系。这样做的意图是先完结一个根底的可运转版别,再在此根底上进行优化和改善,以便终究得到一个愈加高效且契合需求的解决计划。

接下来,完结作业流中的开端节点和完毕节点的生成,这一进程相同相对简略。以下是相应的代码完结:

@Data
@NoArgsConstructor
@Accessors(chain = true)
@JsonInclude(JsonInclude.Include.NON_NULL)
public class StartEvent extends ToolEvent {

    private String eventName = "start";
    public StartEvent(Map<String, Object> params) {
        super(params);
    }
}

@Data
@NoArgsConstructor
@Accessors(chain = true)
@JsonInclude(JsonInclude.Include.NON_NULL)
public class StopEvent extends ToolEvent {

    private String eventName = "end";
    /**
     * 成果回来
     */
    private String result;

    public StopEvent(String params) {
        result = params;
    }
}

LlamaIndex的事情封装了许多其他功用和细节,这些内容虽然很有用,但在当时阶段咱们先不深入评论。

Step注解

然后咱们看下注解,这部分也可以问询下AI帮手,如图所示:

image

不过Python的装修器并不好Java注解相同,所以咱们先来自己完结一下。

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Step {

//    String eventName();
    Class<? extends ToolEvent>[] acceptedEvents();
    int numWorkers() default 10;

//    Class<?>[]  returnTypes();
//    RetryPolicy retryPolicy() default RetryPolicy.DEFAULT;
}

workflow

接下来,咱们将着手完结作业流的首要流程。这一部分相对较为杂乱,首要因为触及的事务流程十分巨大且杂乱,因而需求必定的时刻和精力进行处理。为了简化咱们的作业,首要咱们可以参阅AI帮手的完结办法,经过剖析其规划思路和作业原理,协助咱们更好地了解怎么进行详细的完结。

在此根底上,咱们再依据实践需求对流程进行必要的裁剪和优化。如下图所示:

image

终究,这部分代码有些多,我就简略的将首要流程写下来。代码如下:

@Data
@Slf4j
public abstract class Workflow {

    /**
     * 作业流超时时刻
     */
    private  int timeout = 10;
    /**
     * 是否输出详细日志
     */
    private  boolean verbose = false;

    /**
     * 校验开关
     */
    private boolean validation = false;
    /**
     * 校验开关
     */
    private boolean showUI = false;
    
    /**
     * 1:扫描当时类的一切带有 @Step 注解的办法
     * 2:依据进程次序,顺次履行各个进程
     */
    public String run(String jsonString) throws IOException{}
    /**
     *初始化作业流
     */
    private WorkflowContext initialContext() {}

WorkflowContext

最要害的要素在于作业流上下文的规划,因为在这种架构下,一切节点都可以同享全局变量。这一特性保证了作业流中不同节点之间的数据传递和协调,然后进步了整个体系的灵活性和便利性。假如没有这样的同享机制,作业流的功率和可操作性将大大下降,失掉其本来的优势。

咱们先去问询下AI帮手怎么完结。如图所示:

image

因为LlamaIndex供给了许多功用,因而其完结显得相对杂乱。为了简化开发进程,咱们决议除去一些不必要的功用,比方类的序列化,这一功用首要用于康复和加载作业流。但是,咱们的方针是完结一个最根本且可行的作业流。终究代码如下:

@Slf4j
@Data
public class WorkflowContext {
    /**
     * 是否是单步形式
     */
    private boolean stepwise;
    /**
     * 是否正在运转
     */
    private boolean isRunning;

    /**
     * 当时运转的事情
     */
    private ToolEvent stepEventHolding;

    /**
     * 事情行列:k:办法名,v:行列
     */
    private Map<String, ArrayBlockingQueue<ToolEvent>> eventQueue;

    private List<Thread> tasks = new ArrayList<>();

    private Map<String,Object> globalContext;

    private String result;
    //画图
    private Graph graph = new MultiGraph("workflow");
    public WorkflowContext(boolean stepwise){
          System.setProperty("org.graphstream.ui", "swing");
          this.stepwise = stepwise;
          this.isRunning = false;
          this.eventQueue = new ConcurrentHashMap<>();
          this.stepEventHolding = null;
          this.globalContext = new ConcurrentHashMap<>();
          this.result = null;
          //增加开端和完毕节点
          Node nodeA = graph.addNode("start");
          Node nodeB = graph.addNode("end");
      }
      
    public void addThread(Thread thread) {
        tasks.add(thread);
    }
    
    public void sendEvent(ToolEvent value) {}

咱们去除了一些东西,加了一个上一章节咱们评论的流的可视化。而且需求完结发布事情功用。

WorkflowHandler

终究加一个处理类,相同直接问一下AI帮手,协助咱们去完结一下根本事务逻辑,如图所示:

image

然后我把一切没有用的逻辑全都去除去,终究剩余这些代码,如下所示:

@Slf4j
@Data
@AllArgsConstructor
public class WorkflowHandler {

    private WorkflowContext context;
    
    public void handleTask(int timeout){}

接下来,咱们需求填充根本的事务逻辑部分,这一阶段的作业首要触及完结详细的功用和处理流程,保证作业流可以依照预期正常运转。因为这部分代码触及到特定的事务需求和内部完结细节,因而暂时不揭露。作业流发动日志如下:

image

终究的作用如图所示:

image

总结

经过以上的剖析和实践,咱们成功地对LlamaIndex的中心功用进行了回忆,并逐渐将其Python版的事务流程和中心代码搬迁到Java完结。虽然在进程中遇到了一些应战,如作业流的杂乱性、事情和注解的差异等,但凭借AI帮手的辅佐,咱们可以高效地完结了代码转化和开端完结。

接下来的进程,将是根据当时完结,进一步完善各个模块,优化作业流的履行功率,提高体系的可靠性和扩展性。


我是尽力的小雨,一名 Java 服务端码农,潜心研究着 AI 技能的奥妙。我酷爱技能交流与共享,对开源社区充满热情。一起也是一位腾讯云创造之星、阿里云专家博主、华为如此享专家、掘金优异作者。

💡 我将不惜共享我在技能道路上的个人探究与经历,期望能为你的学习与生长带来一些启示与协助。

🌟 欢迎重视尽力的小雨!🌟

扫描二维码推送至手机访问。

版权声明:本文由51Blog发布,如需转载请注明出处。

本文链接:https://www.51blog.vip/?id=343

分享给朋友:

“凭借AI帮手快速解析LlamaIndex的Workflow规划与Java搬迁” 的相关文章

scikit-learn中的Pipeline:构建高效、可保护的机器学习流程

scikit-learn中的Pipeline:构建高效、可保护的机器学习流程

咱们运用scikit-learn进行机器学习的模型练习时,用到的数据和算法参数会依据详细的状况相应调整改变, 可是,整个模型练习的流程其实迥然不同,一般都是加载数据,数据预处理,特征挑选,模型练习等几个环节。 假如练习的成果不尽善尽美,从数据预处理开端,再次从头练习。 今日介绍的Pipeline(中...

K-Means聚类分析以及差错平方和SSE(Python完成)

K-Means聚类分析以及差错平方和SSE(Python完成)

K-means聚类的原理。 K-Means算法的方针是将原始数据分为K簇,每一簇都有一个中心点,这也是簇中点的均值点,簇中所有的点到所属的簇的中心点的间隔都比到其他簇的中心点更近。 K-means聚类的算法流程。 1、随机确认K个点作为质心。 2、找到离每个点最近的质心,将这个点分配到这个质心代表的...

根据信息增益和基尼指数的二叉决策树

根据信息增益和基尼指数的二叉决策树

# coding: UTF-8 ''' 依据信息增益和基尼指数的二叉决议计划树的完成。 该决议计划树能够用于分类问题,经过挑选适宜的特征来区分样本。 ''' from collections import Counter class biTree_node: ''' 二叉树节点界...

大模型,引领未来智能化的浪潮

大模型,引领未来智能化的浪潮

“大模型”通常指的是那些拥有大量参数的机器学习模型,它们能够处理和理解复杂的数据,从而进行预测、分类、生成等任务。这些模型在自然语言处理、计算机视觉、语音识别等领域取得了显著的成果。大模型通常需要大量的计算资源和数据来训练,但它们在处理复杂任务时表现出色。大模型也面临一些挑战,如过拟合、计算成本高、...

机器学习联想,联想集团在机器学习领域的布局与发展

机器学习联想,联想集团在机器学习领域的布局与发展

1. 数据:机器学习依赖于大量的数据来进行训练和测试。这些数据可以是结构化的(如表格数据)或非结构化的(如图像、文本等)。2. 算法:机器学习算法是计算机系统用来从数据中学习的方法。常见的算法包括线性回归、决策树、支持向量机、神经网络等。3. 模型:机器学习模型是算法在训练数据上学习到的参数和结构。...

机器学习ppt,概述与重要性

机器学习ppt,概述与重要性

1. 温州大学《机器学习》课程课件: 这是由温州大学提供的机器学习课程课件,适用于研究生课程。课件内容丰富,适合深入学习。 下载地址:2. 吴恩达机器学习全套PPT课件及批注: 吴恩达是机器学习领域的知名学者,他的课程内容详尽,适合初学者和进阶学习者。 下载地址:3. 李宏毅...