likes
comments
collection
share

尝试做一个集成多个大模型的AI助手

作者站长头像
站长
· 阅读数 6

一个很朴素的想法是:既然市面上存在这么多大模型,秉持着存在即合理的原则,每个模型应该都有其优势。比如说:文心一言的API产品矩阵十分丰富、通义千问API分区以及内容生成更加完善、豆包有算法帝的算法、GPT是传统王者...

2万字大模型调研:横向对比文心一言、百川、Minimax、通义千问、讯飞星火、ChatGPT | 人人都是产品经理 (woshipm.com)

那有没有一个现成的产品能兼容所有优点,或者至少能从中选出最适合当前场景的大模型?

EeroEternal/delibird: Delibird 是一个多合一大模型接口网关。主要针对国内的大模型,包括文心、百川、千问、星火、智谱等提供统一的接口调用。基于 Python 开发,容易集成。原生提供 Streaming 接口、多进程异步调度模式,性能较好、调用接口完全兼容 openai APi,方便集成。 (github.com)

github上还有大佬的成熟项目,我也尝试写一个,此博客记录我从零开始编写自己的LLM-Client

  • 如果从一个产品的角度思路这个项目,一期要先实现简单的API调用和呈现,二期解决延迟、重试、VPN切换等待性能问题

现阶段效果:

尝试做一个集成多个大模型的AI助手

后端实现方式有很多,由于我是Java程序员,项目框架选择Spring-boot

  • 想法1:由Java调用python脚本,在不同python脚本中调各大模型的包,远程调用API

    问题:

    • 异构语言,不易联调
  • 想法2:Java语言中封装请求的Request Body,直接调用远程API

    由于大模型提供的Java client不完善,所以大部分只能自己手写封装JSON的逻辑 不同模型RequestBody规范不同,Response Body也不同,同时还有不同场景的不同规范...工程量较大

  • 想法3:在调用接口过程中发现响应太慢,官方文档提供的解决方案是使用流式查询,查询过程中实时刷新client页面内容;除此之外,我想要不干脆把模型迁移到本地?GPT提供了开源版本,其他模型应该也会提供,如果我将开源的模型在本地用同样的文本训练,最终结果的不同就完全是算法的不同...

现阶段核心代码:

public class PythonEngine {  
  
public static String execPythonScript(String content,AIModules modules){  
    Process proc;  
    try {  
        String[] args1=new String[]{  
            "C:\\Users\\吴松林\\PycharmProjects\\pythonProject\\.venv\\Scripts\\python.exe",  
            modules.path,  
            content,  
            "user"};  
        proc = Runtime.getRuntime().exec(args1);  
        InputStream is = proc.getInputStream();  
        byte[] bytes = is.readAllBytes();  
        String ans = new String(bytes, Charset.forName("gbk"));  
        proc.waitFor();  
        return ans.length() == 0?"接口异常":ans;  
    } catch (IOException | InterruptedException e) {  
        e.printStackTrace();  
        return "接口异常";  
    }  
}

dashscope.api_key = "yours"

content = sys.argv[1]
def call_with_messages():
    messages = [
        # {'role': 'system', 'content': 'You are a helpful assistant.'},
                {'role': 'user', 'content': content}]

    response = dashscope.Generation.call(
        dashscope.Generation.Models.qwen_turbo,
        messages=messages,
        result_format='message',  # set the result to be "message" format.
    )
    if response.status_code == HTTPStatus.OK:
        choices = response.output.choices
        for choice in choices:
            print(choice.message.content)
    else:
        print('Request id: %s, Status code: %s, error code: %s, error message: %s' % (
            response.request_id, response.status_code,
            response.code, response.message
        ))


if __name__ == '__main__':
    call_with_messages()

希望看到这里的大佬多多指教