聊天智能体开发基础
如今AI已经能够在生活中的方方面面帮助我们,我也想做一个为自己量身定做的智能体,那么,下面我就介绍一下如何创建一个小智能体。
一、准备工作
1.APIKey
要在我们的项目中接入市面上的大模型,APIKey是必不可少的,下面我以deepseek为例,介绍如何接入API
- 访问DeepSeek API官网,进入API开放平台
- 左侧找到API Keys申请一个API,此处注意一定要保存好你的Key,我们后面会用到
这样呢,APIKey就申请好了,在使用时,我们要充值一下才可以使用。
以上就是我们智能体开发的第一步。
二、开发智能体
- 我们需要准备好一个可以访问DeepSeek打模型的类,封装好聊天方法,其中包括有网络请求,json数据参数解析
- 再创建该类对象,调用chat方法,将我们再程序中输入的问题作为参数传给该方法,就可以通过该方法的返回值获取DeepSeek的回复
下面我直接给出大家这个项目的全部代码,因为很多内容都是固定写法,大家一定要仔细看代码中的注解,可以帮助大家理解这个项目。
importjava.io.*;importjava.net.HttpURLConnection;importjava.net.URL;importjava.nio.charset.StandardCharsets;importjava.util.Scanner;publicclassDeepSeekClient{privatefinalStringapiKey;//DeepSeek平台密钥privatefinalStringbaseUrl;//DeepSeek接口基础地址//构造方法:使用默认官方接口地址publicDeepSeekClient(StringapiKey){//this(...) 专门用来调用本类中另一个重载的构造方法//要求:必须写在构造方法第一行,只能出现一次this(apiKey,"https://api.deepseek.com/v1");}//构造方法:自定义接口地址(适配私有化部署/代理地址)publicDeepSeekClient(StringapiKey,StringbaseUrl){this.apiKey=apiKey;this.baseUrl=baseUrl;}//简单对话publicStringchat(StringuserMessage)throwsIOException{StringrequestBody=buildRequestBody(userMessage);//1.拼装请求JSONStringresponse=sendRequest(requestBody);//2.发送HTTP请求returnextractContent(response);//3.解析AI返回结果}//构建请求JSON(手动拼接)privateStringbuildRequestBody(StringuserMessage){//转义JSON字符串中的特殊字符StringescapedMessage=userMessage.replace("\\","\\\\").replace("\"","\\\"").replace("\n","\\n").replace("\r","\\r").replace("\t","\\t");return"{\n"+" \"model\": \"deepseek-chat\",\n"+" \"messages\": [\n"+" {\"role\": \"user\", \"content\": \""+escapedMessage+"\"}\n"+" ],\n"+" \"temperature\": 0.7,\n"+" \"max_tokens\": 1000\n"+"}";}//发送HTTP请求privateStringsendRequest(StringjsonBody)throwsIOException{//1.拼接完整接口地址:基础地址+对话接口路径URLurl=newURL(baseUrl+"/chat/completions");HttpURLConnectionconn=(HttpURLConnection)url.openConnection();//2.设置请求头、请求方式conn.setRequestMethod("POST");conn.setRequestProperty("Content-Type","application/json");//告知接口:请求体是JSONconn.setRequestProperty("Authorization","Bearer "+apiKey);//接口鉴权(固定格式)conn.setDoOutput(true);//开启输出流,允许发送POST请求体conn.setConnectTimeout(30000);//连接超时:30秒conn.setReadTimeout(60000);//读取响应超时:60秒//3.把JSON请求体写入数据流,发送给接口try(OutputStreamos=conn.getOutputStream()){os.write(jsonBody.getBytes(StandardCharsets.UTF_8));}//4.判断响应状态码:2xx成功,4xx/5xx错误intresponseCode=conn.getResponseCode();InputStreaminputStream=(responseCode>=200&&responseCode<300)?conn.getInputStream():conn.getErrorStream();//5.读取接口返回的完整JSON字符串StringBuilderresponse=newStringBuilder();try(BufferedReaderreader=newBufferedReader(newInputStreamReader(inputStream,StandardCharsets.UTF_8))){Stringline;while((line=reader.readLine())!=null){response.append(line);}}conn.disconnect();//关闭连接//状态码异常,抛出错误信息if(responseCode>=400){thrownewIOException("API Error ("+responseCode+"): "+response);}returnresponse.toString();}//从响应中提取contentprivateStringextractContent(Stringjson){// 查找 "content": " 后面的内容StringsearchKey="\"content\":\"";intstartIndex=json.indexOf(searchKey);if(startIndex==-1){// 尝试带空格的格式searchKey="\"content\": \"";startIndex=json.indexOf(searchKey);}if(startIndex==-1){return"无法解析响应";}//截取content对应的文本内容startIndex+=searchKey.length();intendIndex=startIndex;// 查找结束的引号,注意处理转义while(endIndex<json.length()){charc=json.charAt(endIndex);//找到未被转义的双引号,作为内容跟结束位置if(c=='"'&&(endIndex==0||json.charAt(endIndex-1)!='\\')){//endIndex == 0,规避后面下标-1的报错break;}endIndex++;}if(endIndex>=json.length()){return"无法解析响应";}Stringcontent=json.substring(startIndex,endIndex);// 还原转义字符,恢复正常换行、引号returncontent.replace("\\n","\n").replace("\\r","\r").replace("\\t","\t").replace("\\\"","\"").replace("\\\\","\\");}publicstaticvoidmain(String[]args){StringapiKey="你的apiKey";DeepSeekClientdsc=newDeepSeekClient(apiKey);while(true){System.out.println("请输入你的问题:");Scannersc=newScanner(System.in);Stringquestion=sc.next();//调用chat方法try{Stringanswer=dsc.chat(question);System.out.println("回复:"+answer);}catch(IOExceptione){thrownewRuntimeException(e);}}}}
可以看到,我们现在的智能体还没有记忆功能,每次提问都是新的一次问答,那么接下来,我们就来加上智能体的记忆功能。
- 实现记忆的逻辑:从第一次对话开始,就将用户输入的问题以及模型的回答保存到本地,在后续的提问中将这份数据与新问题重新上传,这样大模型就知道你之前问的问题以及回复了。
下面是实现记忆功能的代码:
publicstaticvoidmain(String[]args){StringapiKey="你的apiKey";DeepSeekClientdsc=newDeepSeekClient(apiKey);Stringmemory="";while(true){Stringanswer;System.out.println("请输入你的问题:");Scannersc=newScanner(System.in);Stringusermessage=sc.next();memory+="用户问题:"+usermessage+"-";Stringnewmessage="历史记忆:"+memory+"新问题:"+usermessage;//调用chat方法try{answer=dsc.chat(newmessage);}catch(IOExceptione){thrownewRuntimeException(e);}System.out.println("回复:"+answer);memory+="模型回复:"+answer;}
可以看到,现在这个聊天工具已经具有记忆功能。
本次分享就到这里,大家快去动手练起来吧!
