AI Model Hub:一个高效的大模型应用开发集成框架(5)- 编排一个针对网页提问示例

系列文章:
AI Model Hub:一个高效的大模型应用开发集成框架(1)
AI Model Hub:一个高效的大模型应用开发集成框架(2)- 对接本地llama3
AI Model Hub:一个高效的大模型应用开发集成框架(3)- 存储设计
AI Model Hub:一个高效的大模型应用开发集成框架(4)- 使用salt-function-flow实现LLM流程编排

这篇文章我们介绍一下使用AI Model Hub编排一个针对网页内容的提问的LLM流程,类似《LangChain实现文档检索和增强生成的示例》,先看下DEMO演示:

屏幕录制2024-07-24 19.06.46

我们使用jsoup组件来获取网页内容,jsoup不是很强大,只能处理一些偏静态的内容,后续会提供更加专业的抓取工具或程序。

下面我们看下具体代码实现:

ai-model-hub github:https://github.com/flower-trees/ai-model-hub

增加Flow节点

节点功能:查询网页内容并缓存,将网页内容添加为System Prompt。

@NodeIdentity(nodeId = "jsoupGetUrl")
public class JsoupGetUrl extends FlowNodeWithReturn<AiChatDto> {

    @Resource
    RedisTemplate redisTemplate;

    @Override
    public AiChatDto doProcess(IContextBus iContextBus) {

        //Init param
        AiChatRequest aiChatRequest = (AiChatRequest) iContextBus.getParam();
        AiChatDto aiChatDto = (AiChatDto) iContextBus.getTransmitInfo(AiChatDto.class.getName());

        String prompt = "Answer the question based on this article:%s";

        String pageContent;
        try {
            String key = EncipherUtil.MD5(aiChatRequest.getUrl());
            assert key != null;
            pageContent = (String)redisTemplate.opsForValue().get(key);
            if (pageContent == null) {
                pageContent = extractTextFromUrl(aiChatRequest.getUrl());
                redisTemplate.opsForValue().set(key, pageContent);
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

        AiChatDto.Message message = new AiChatDto.Message();
        message.setRole(RoleType.SYSTEM.getCode());
        message.setContent(String.format(prompt, pageContent));
        if (aiChatDto.getMessages() == null) aiChatDto.setMessages(new ArrayList<>());
        aiChatDto.getMessages().add(message);

        return aiChatDto;
    }

    public static String extractTextFromUrl(String url) throws IOException {
        Document doc = Jsoup.connect(url).get();
        return extractTextFromHtml(doc);
    }

    private static String extractTextFromHtml(Document htmlContent) {
        StringBuilder textContent = new StringBuilder();
        Elements paragraphs = htmlContent.select("p");
        for (Element paragraph : paragraphs) {
            textContent.append(paragraph.text()).append("\n");
        }
        return textContent.toString();
    }
}
编排流程

在FlowInit注册一个流程,ID为analyze_webpage_jsoup,增加jsoupGetUrl等节点,这里使用chatgpt处理问答(chatGPTLLM)。

@Component
public class FlowInit implements IFlowInit {

    @Override
    public void configure(FlowEngine flowEngine) {
    
		// 初始化参数 -> 获取网页内容 -> 构建对话上下文 -> 请求模型 -> 保存对话记录
        flowEngine.builder()
                .id("analyze_webpage_jsoup")
                .next("paramBuilder")
                .next("jsoupGetUrl")
                .next("contextBuilder")
                .next("chatGPTLLM")
                .next("chatSaver")
                .build();
    }
}
增加API

使用/ai-model-hub/ai/stream/chat/flow/{id}直接处理flow调用。

curl --location 'http://127.0.0.1:8080/ai-model-hub/ai/stream/chat/flow/analyze_webpage_jsoup' \
--header 'Content-Type: application/json' \
--data '{
    "agent": "1aaa015747c84315f34d799f3fdcd839",
    "url": "https://mp.weixin.qq.com/s/zPQTX_5qG8nMEkQCzYP4ow",
    "content": "总结文章内容"
}'
测试

运行项目,需要启动Mysql、Redis,建表语句在 /项目路径/script/db_create.sql。
打开测试网页:/项目路径/html/demo_url.html
输入URL和问题:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值