系列文章:
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和问题: