对接国内通义千问大模型的轻量级的Java SDK

105 阅读9分钟

dongye-fastChat-stater

一个轻量级的Java SDK,用于对接国内通义千问大模型API。一个方法帮你实现会话管理、历史消息管理、不同大模型切换以及SSE或Websocket输出的功能。喜欢本项目希望看客给个starlxs2601055687/fastchat: 对接国内大模型api的轻量级SDK,帮你一个方法实行会话管理,历史消息管理,不同大模型切换,SSE或Websocket输出。 (github.com)

引入:

一:

1克隆本项目

2将项目中dongye-fastChat-stater引入您的项目

       <dependency>
            <groupId>com.dongye.lxs</groupId>
            <artifactId>dongye-fastchat-starter</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>

二:

1克隆本项目

2自行打包或者使用海南大学大数据与知识图谱协会总群中我提供的jar包

3进入maven的bin目录

4cmd并输入一下目录

mvn -e install:install-file -Dfile=C:\Users\26010\Downloads\dongye-fastchat-starter-0.0.1-SNAPSHOT.jar -DgroupId=com.dongye.lxs  -DartifactId=dongye-fastchat-starter   -Dversion=0.0.1-SNAPSHOT  -Dpackaging=jar

5直接引入依赖

       <dependency>
            <groupId>com.dongye.lxs</groupId>
            <artifactId>dongye-fastchat-starter</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>

使用方法:

目前该sdk仅仅实现对接阿里通义千问模型

1:开通服务

阿里云百炼 (aliyun.com)

选择新建应用获取appId

点击查看api-key创建api-key

2:引入配置

  • application.yml引入
dongye:
  fastchat:
    dashscope:
      appId: 
      apiKey: 
  • 在你项目的启动类上填加

    @Import(com.dongye.lxs.chat.config.fastChatConfig.class)
    

3:参考我项目上的demo代码

 /**
 * 普通询问,非流式传输
 * @param fastChatRequestDto 请求参数
 * @return 响应结果
 */
public ClientResponse<ClientOutput> normalAsk(fastChatRequestDto fastChatRequestDto) {
        ClientInput clientInput = createClientInput(fastChatRequestDto, ModelSource.DASHSCOPE_Normal);

        ClientOutput data;
        try {
        ClientResponse<Object> response = DyChatClient.call(clientInput);
        data = (ClientOutput) response.getData();
        logChatContext(data.getContext());
        } catch (NoApiKeyException | InputRequiredException | ClientInputValidationException e) {
        log.error("请求大模型接口失败", e);
        return ClientResponse.errorRequest("请求大模型接口失败");
        }
        return ClientResponse.success(data);
        }

/**
 * 流式传输
 * @param fastChatRequestDto 请求参数
 * @return 响应结果
 */
public ClientResponse<ClientOutput> sseAsk(fastChatRequestDto fastChatRequestDto) {
        ClientInput clientInput = createClientInput(fastChatRequestDto, ModelSource.DASHSCOPE_SSE);
        ClientOutput data;
        try {
        ClientResponse<Object> response = DyChatClient.call(clientInput);
        data = (ClientOutput) response.getData();
        logChatContext(data.getContext());
        String sseUrl = data.getSseUrl();
        if (sseUrl == null) {
        log.error("回调错误,sseUrl为空");
        return ClientResponse.errorRequest("sseUrl is null");
        }
        } catch (NoApiKeyException | InputRequiredException | ClientInputValidationException e) {
        log.error("请求大模型接口失败", e);
        return ClientResponse.errorRequest("请求大模型接口失败");
        }
        return ClientResponse.success(data);
        }

/**
 * 创建ClientInput对象
 * @param fastChatRequestDto 请求参数
 * @param modelSource 模型来源
 * @return ClientInput对象
 */
private ClientInput createClientInput(fastChatRequestDto fastChatRequestDto, ModelSource modelSource) {
        ClientInput clientInput = ClientInput.builder()
        .modelSource(modelSource)
        .requestId(UUID.randomUUID().toString().replace("-", ""))
        .build();
        BeanUtils.copyProperties(fastChatRequestDto, clientInput);
        return clientInput;
        }

/**
 * 记录聊天上下文信息
 * @param context 聊天上下文
 */
private void logChatContext(ChatContext context) {
        if (context != null) {
        log.info("context: {}", context);
        log.info("summary: {}", context.getSummary());
        log.info("messageList: {}", context.getMessageList());
        }
    }

4:非打字机效果:

http://127.0.0.1:8080/fastChat/normalAsk
{
"userId":"1",
"userName":"lxs",
"question": "介绍一下海南大学",

}

返回值:

{
    "code": 200,
    "message": "成功",
    "data": {
        "context": {
            "summary": "综合性大学海南大学",
            "messageList": [
                {
                    "messageMap": {
                        "USER": "介绍一下海南大学",
                        "MODEL": "<p>海南大学,创建于1958年,位于中国海南省,是海南省的重点综合性大学之一,提供本科、硕士和博士多层次教育。该校学科涵盖工、管、经、法、文、理、医、教、艺等多个领域,以培养具有国际视野、创新能力和实践技能的高级专门人才为目标。</p>\n"
                    }
                }   
            ],
            "time": "2024-08-03T16:16:44.0299741"
        },
        "answer": "<p>海南大学,创建于1958年,位于中国海南省,是海南省的重点综合性大学之一,提供本科、硕士和博士多层次教育。该校学科涵盖工、管、经、法、文、理、医、教、艺等多个领域,以培养具有国际视野、创新能力和实践技能的高级专门人才为目标。</p>\n,
        "sessionId": "1db0c7d8e2d248ae9b062ca0c8826612",
        "sseEmitter": null
    }
}

携带sessionId(上一个的返回值)

{
"userId":"1",
"userName":"lxs",
"question": "介绍一下海南大学的学院",
"sessionId":"1db0c7d8e2d248ae9b062ca0c8826612"
}

返回效果如下:自动返回该会话的历史消息,自动实现消息体的html格式

{
    "code": 200,
    "message": "成功",
    "data": {
        "context": {
            "summary": "",
            "messageList": [       
                {
                    "messageMap": {
                        "USER": "介绍一下海南大学",
                        "MODEL": "<p>海南大学,创建于1958年,位于中国海南省,是海南省的重点综合性大学之一,提供本科、硕士和博士多层次教育。该校学科涵盖工、管、经、法、文、理、医、教、艺等多个领域,以培养具有国际视野、创新能力和实践技能的高级专门人才为目标。</p>\n"
                    }
                },
                {
                    "messageMap": {
                        "USER": "介绍一下海南大学的学院",
                        "MODEL": "<p>海南大学设有多个学院,涵盖了广泛的学科领域,包括但不限于:</p>\n<ol>\n<li>\n<p><strong>管理学院</strong>:专注于管理科学与工程、工商管理、会计学、财务管理等领域的教学与研究。</p>\n</li>\n<li>\n<p><strong>经济学院</strong>:提供经济学、金融学、国际贸易等课程,培养学生在经济与金融领域的专业能力。</p>\n</li>\n<li>\n<p><strong>法学院</strong>:教授法律专业知识,包括法学理论、法律实务、国际法等,培养法律人才。</p>\n</li>\n<li>\n<p><strong>文学院</strong>:涵盖汉语言文学、新闻传播学、历史学、哲学等文科基础学科。</p>\n</li>\n<li>\n<p><strong>理学院</strong>:包括数学、物理学、化学、生物科学等自然科学基础学科。</p>\n</li>\n<li>\n<p><strong>信息科技学院</strong>:涉及计算机科学与技术、软件工程、网络空间安全、人工智能等领域,培养信息技术专业人才。</p>\n</li>\n<li>\n<p><strong>海洋学院</strong>:专注于海洋科学与技术、海洋资源与环境等领域的研究与教学,服务海洋经济发展。</p>\n</li>\n<li>\n<p><strong>医学院</strong>:提供医学及相关专业教育,包括临床医学、公共卫生、护理学等,培养医疗卫生领域专业人员。</p>\n</li>\n<li>\n<p><strong>外国语学院</strong>:教授英语、日语、法语、俄语等外语及翻译、跨文化交际等相关课程。</p>\n</li>\n<li>\n<p><strong>马克思主义学院</strong>:研究马克思主义理论及其应用,培养社会主义意识形态建设者。</p>\n</li>\n</ol>\n<p>海南大学的学院设置反映了其致力于全面发展的教育理念,为学生提供了广泛的专业选择和深入研究的机会。</p>\n"
                    }
                }
            ],
            "time": "2024-08-03T16:16:44.0299741"
        },
        "answer": "<p>海南大学设有多个学院,涵盖了广泛的学科领域,包括但不限于:</p>\n<ol>\n<li>\n<p><strong>管理学院</strong>:专注于管理科学与工程、工商管理、会计学、财务管理等领域的教学与研究。</p>\n</li>\n<li>\n<p><strong>经济学院</strong>:提供经济学、金融学、国际贸易等课程,培养学生在经济与金融领域的专业能力。</p>\n</li>\n<li>\n<p><strong>法学院</strong>:教授法律专业知识,包括法学理论、法律实务、国际法等,培养法律人才。</p>\n</li>\n<li>\n<p><strong>文学院</strong>:涵盖汉语言文学、新闻传播学、历史学、哲学等文科基础学科。</p>\n</li>\n<li>\n<p><strong>理学院</strong>:包括数学、物理学、化学、生物科学等自然科学基础学科。</p>\n</li>\n<li>\n<p><strong>信息科技学院</strong>:涉及计算机科学与技术、软件工程、网络空间安全、人工智能等领域,培养信息技术专业人才。</p>\n</li>\n<li>\n<p><strong>海洋学院</strong>:专注于海洋科学与技术、海洋资源与环境等领域的研究与教学,服务海洋经济发展。</p>\n</li>\n<li>\n<p><strong>医学院</strong>:提供医学及相关专业教育,包括临床医学、公共卫生、护理学等,培养医疗卫生领域专业人员。</p>\n</li>\n<li>\n<p><strong>外国语学院</strong>:教授英语、日语、法语、俄语等外语及翻译、跨文化交际等相关课程。</p>\n</li>\n<li>\n<p><strong>马克思主义学院</strong>:研究马克思主义理论及其应用,培养社会主义意识形态建设者。</p>\n</li>\n</ol>\n<p>海南大学的学院设置反映了其致力于全面发展的教育理念,为学生提供了广泛的专业选择和深入研究的机会。</p>\n",
        "sessionId": "1db0c7d8e2d248ae9b062ca0c8826612",
        "sseEmitter": null
    }
}

5:打字机式SSE流式传输效果

http://127.0.0.1:8080/fastChat/sseAsk
{
"userId":"1",
"userName":"lxs",
"question": "介绍一下海南大学"
}
{
    "code": 200,
    "message": "成功",
    "data": {
        "context": {
            "summary": "海南大学是海南省重点建设的综合性大学。",
            "messageList": [
                {
                    "messageMap": {
                        "USER": "介绍一下海南大学",
                        "MODEL": "<p>海南大学,位于中国海南省海口市,是海南省属重点综合性大学,具有博士学位授予权和推荐免试研究生资格。学校创建于1958年,经过数十年的发展,现已形成了以工学、管理学、经济学为主体,多学科协调发展的学科体系。海南大学设有多个学院,提供本科、硕士和博士层次的教育,涵盖了工、管、经、法、文、理、医、教育、艺术等多个学科领域。学校注重科学研究与社会服务,致力于培养具有国际视野、创新精神和实践能力的高素质人才。</p>\n"
                    }
                }
            ],
            "time": "2024-08-05T11:11:52.1406344"
        },
        "answer": "<p>海南大学,位于中国海南省海口市,是海南省属重点综合性大学,具有博士学位授予权和推荐免试研究生资格。学校创建于1958年,经过数十年的发展,现已形成了以工学、管理学、经济学为主体,多学科协调发展的学科体系。海南大学设有多个学院,提供本科、硕士和博士层次的教育,涵盖了工、管、经、法、文、理、医、教育、艺术等多个学科领域。学校注重科学研究与社会服务,致力于培养具有国际视野、创新精神和实践能力的高素质人才。</p>\n",
        "sessionId": "431be7c385c849b7b782f7b487b0b925",
        "sseUrl": "/fastChat/sse/431be7c385c849b7b782f7b487b0b925"
    }
}

使用该接口返回的回调地址(参数就是会话id):/fastChat/sse/431be7c385c849b7b782f7b487b0b925

6:由于SSE场景较为复杂提供前端例子如下:

async function fetchInitialResponse(clientInput) {
    const response = await fetch('/fastChat/sseAsk', {
        method: 'POST',
        headers: {
            'Content-Type': 'application/json',
        },
        body: JSON.stringify(clientInput),
    });

    const data = await response.json();
    return data;
}
function setupSseConnection(sseUrl) {
    //建立SSE连接
    const eventSource = new EventSource(sseUrl);
    eventSource.onmessage = function (event) {
        const result = JSON.parse(event.data);
        // 处理接收到的 SSE 数据
        console.log('New SSE Data:', result);
    };
    eventSource.onerror = function (error) {
        console.error('SSE error:', error);
        eventSource.close();
    };
}
async function initiateSseCommunication(clientInput) {
    const initialResponse = await fetchInitialResponse(clientInput);
    const { sessionId, question, summary, sseUrl } = initialResponse;

    // 显示初始响应(总结)
    console.log('Initial Response:', summary);
    // 建立 SSE 连接
    setupSseConnection(sseUrl);
}

// 示例用法
const clientInput = {
    sessionId: null, // 新的会话第一次不传递
    userId:"",
    userName:"",
    question: '你的问题'
};

initiateSseCommunication(clientInput);

最后:

因本人目前实习以及秋招事情过多,当然还有懒惰的原因,计划实现的websocket模块和对接其他厂模型的计划暂时搁置,欢迎其他小伙伴给本项目提交pr。