目前做网站最好的语言是网站建设的看法有哪些

当前位置: 首页 > news >正文

目前做网站最好的语言是,网站建设的看法有哪些,职友集 一家做公司点评的网站,昆明网站在当今AI技术飞速发展的背景下#xff0c;大语言模型如Qwen2和GLM-4凭借其强大的语言处理能力#xff0c;在诸多领域展现出了巨大的潜力。然而#xff0c;大模型并非全知全能#xff0c;它们在处理特定任务时#xff0c;尤其是在需要与外部系统交互或执行具体功能时#…在当今AI技术飞速发展的背景下大语言模型如Qwen2和GLM-4凭借其强大的语言处理能力在诸多领域展现出了巨大的潜力。然而大模型并非全知全能它们在处理特定任务时尤其是在需要与外部系统交互或执行具体功能时会遇到一定的局限性。这主要是因为大模型通常被设计为封闭的文本生成系统缺乏直接调用外部工具或API的能力。这种局限性凸显了工具调用在实际应用中的必要性它能够扩展模型的功能边界使其能够在真实世界场景中执行更加复杂和具体的操作。 工具调用的必要性 尽管大模型在自然语言理解和生成上取得了显著进步但它们往往受限于训练数据的内容无法直接访问网络资源、执行代码或操作数据库等。这意味着在解决实际问题时模型可能无法提供直接、即时且准确的解决方案尤其是那些需要实时数据处理或特定功能执行的任务。因此通过工具调用来增强大模型的功能成为提升其实用性和灵活性的关键。 在此背景下ChatGLM3以及最近的GLM-4原生就已经支持了工具调用这就非常方便通过直接与外部工具交互减少了中间环节提高了响应速度和效率。 tools [{name: track,description: 追踪指定股票的实时价格,parameters: {type: object,properties: {symbol: {description: 需要追踪的股票代码}},required: [symbol]}},{name: text-to-speech,description: 将文本转换为语音,parameters: {type: object,properties: {text: {description: 需要转换成语音的文本},voice: {description: 要使用的语音类型男声、女声等},speed: {description: 语音的速度快、中等、慢等}},required: [text]}} ] system_info {role: system, content: Answer the following questions as best as you can. You have access to the following tools:, tools: tools}但是Qwen1.5以及Qwen2并不具备原生的工具调用功能得借助于其Qwen-Agent框架或者langChain框架。那不借助Python框架我就要使用Java实现该怎么做呢 使用Java实现Qwen2工具调用 首先我们需要自定义两个注解FunctionDef​和FunctionParam​ Inherited Retention(RetentionPolicy.RUNTIME) Target({ElementType.METHOD}) public interface FunctionDef {/*** 函数名称* return 函数名称/String name() default ;/** 函数描述* return 函数描述/String description(); }Inherited Retention(RetentionPolicy.RUNTIME) Target({ElementType.PARAMETER}) public interface FunctionParam {/** 参数名称* return 参数名称/String name();/** 参数描述* return 参数描述/String description();/** 参数枚举* return 参数枚举/String[] enums() default {};/** 是否必填* return 必填/boolean required() default false; }然后我们可以根据自己的需求创建几个工具插件。下面是我创建的一个查询天气的插件 public class WeatherTool {/** 查询天气* param city 城市* return 天气信息/FunctionDef(name getWeatherInfo, description get the weather info)public static String getWeatherInfo(FunctionParam(name city, description the city name) String city) {if (city null || city.isEmpty()) {throw new IllegalArgumentException(City name must not be null or empty);}OkHttpClient client new OkHttpClient.Builder().connectTimeout(60, TimeUnit.SECONDS).writeTimeout(60, TimeUnit.SECONDS).readTimeout(60, TimeUnit.SECONDS).build();try {MapString, String headers new HashMap(16);headers.put(Content-Type, application/json);Request.Builder builder new Request.Builder().url(https://query.asilu.com/weather/baidu/?citycity);builder.headers(Headers.of(headers));builder.method(GET, null);Request request builder.build();Response response client.newCall(request).execute();if (response.isSuccessful()) {ResponseBody responseBody response.body();JSONObject jsonObject JSONObject.parseObject(responseBody.string());return jsonObject.toString();} else {throw new OpenAIChatException(Failed with status code %d. messages: %s, response.code(), response.message());}} catch (IOException e) {e.printStackTrace();return Error encountered while fetching weather data!;}} }再然后我们把所有的工具插件都交给大模型让它判断要满足用户的提问应该选择哪个工具插件 public String getToolResult(String sessionId,String prompt, ListFunction baseTools){String class2Json buildClass2Json(new BaseFunction());String finalPrompt String.format(你是一个AI助手我会给你一个工具对象集合工具对象包括name工具名、description工具描述、clazz工具类名、parameters工具参数。 你可以结合工具对象从用户的问句中提取到关键词确定要实现用户的任务应该选择哪个工具对象和工具的参数。 【工具集合】%s。 【用户提问】%s 您的响应结果必须为JSON格式并且不要返回任何不必要的解释只提供遵循此格式的符合RFC8259的JSON响应。以下是输出必须遵守的JSON Schema实例%s,JSON.toJSONString(baseTools),prompt,class2Json);String funcParams chat(sessionId,finalPrompt);funcParams JSON.parseObject(funcParams, OpenAIChatResponse.class).getChoices().get(0).getMessage().getContent();funcParams funcParams.substring(funcParams.indexOf({), funcParams.lastIndexOf(})1);return LoadFunctions.load(JSON.parseObject(funcParams, BaseFunction.class));}确定哪个工具插件后再使用LoadFunctions.load加载执行这个工具插件 public static String load(BaseFunction baseFunction){String className baseFunction.getClazz();String methodName baseFunction.getFunctionName();MapString,String arg baseFunction.getParams();ListString params new ArrayList();String result ;try {// 加载类Class? clazz Class.forName(className);//可以使用arg.size确定几个参数我为了演示方便这里就默认只有一个参数了//int size arg.size();Method method clazz.getMethod(methodName,String.class);Parameter[] parameters method.getParameters();// 如果方法有参数并且参数类型已知例如只有一个String类型的参数for (int i 0; i parameters.length; i){params.add(arg.values().stream().skip(i).findFirst().orElse(null));}// 创建类的实例如果CarBean有一个无参构造函数Object instance clazz.newInstance();result method.invoke(instance,params.toArray()).toString();} catch (ClassNotFoundException e) {LOG.error(类未找到: {} , className);} catch (NoSuchMethodException e) {LOG.error(找不到方法: {} , methodName);} catch (InstantiationException | IllegalAccessException | InvocationTargetException e) {LOG.error(无法调用方法: {} , e.getMessage());}return result;}最后我们就可以拿到工具执行的结果然后把工具执行结果直接给到大模型让它组织语言回答用户提问就可以了 public FluxString streamChatWithTools(String sessionId, String prompt, ListFunction baseTools) {//获取工具结果String toolResult getToolResult(null,prompt, baseTools);LOG.info(工具调用结果为{},toolResult);String promptFormat String.format(基于工具查询的结果{%s}。请回答%s, toolResult, prompt);return streamChat(sessionId, promptFormat);}到这里我们就完成了像Qwen2这种没有原生支持Function_call的大模型的工具调用的功能了。 改进优化 在最初的版本中我们是把普通问答和工具调用的问答分开设计的这样的设计虽然能实现各种不同的功能但是对于用户并不友好“我怎么知道什么时候该使用工具模式呢”。 ​ 因此我们打算将普通问答模式和工具调用问答模式进行合并。这样用户只需要专注于自己的问题即可不用在纠结该选择哪个模式。 首先我们定义一个返回空字符串的工具插件 /** 返回一个空字符串* return 归属地*/FunctionDef(name getEmptyResult, description get a empty result)public static String getEmptyResult() {return ;}然后也需要修改一下大模型选择工具插件的提示词“如果用户提问内容与除了getEmptyResult之外的其他所有的工具都不相关就返回getEmptyResult” public String getToolResult(String sessionId,String prompt, ListFunction baseTools){String class2Json buildClass2Json(new BaseFunction());String finalPrompt String.format(你是一个AI助手我会给你一个工具对象集合工具对象包括name工具名、description工具描述、clazz工具类名、parameters工具参数。 你可以结合工具对象从用户的问句中提取到关键词确定要实现用户的任务应该选择哪个工具对象和工具的参数。 【工具集合】%s。 【用户提问】%s 如果用户提问内容与除了getEmptyResult之外的其他所有的工具都不相关则你需要响应getEmptyResult工具即可。您的响应结果必须为JSON格式并且不要返回任何不必要的解释只提供遵循此格式的符合RFC8259的JSON响应。以下是输出必须遵守的JSON Schema实例%s,JSON.toJSONString(baseTools),prompt,class2Json);String funcParams chat(sessionId,finalPrompt);funcParams JSON.parseObject(funcParams, OpenAIChatResponse.class).getChoices().get(0).getMessage().getContent();funcParams funcParams.substring(funcParams.indexOf({), funcParams.lastIndexOf(})1);return LoadFunctions.load(JSON.parseObject(funcParams, BaseFunction.class));}这样如果我如果输入一个问题如地球的直径是多少。大模型识别这个问题与所有的工具插件都不相关它就返回一个空字符串也就是不用基于查询的知识进行回答。 public FluxString streamChatWithTools(String sessionId, String prompt, ListFunction baseTools) {//获取工具结果String toolResult getToolResult(null,prompt, baseTools);LOG.info(工具调用结果为{},toolResult);String promptFormat StringUtils.isEmpty(toolResult) ? String.format(请回答%s, prompt):String.format(基于工具查询的结果{%s}。请回答%s, toolResult, prompt);return streamChat(sessionId, promptFormat);}这样我们就实现了使用一个接口同时处理用户的通识问答和需要进行工具调用的问答。