AI 问答
AI 问答
实现 AI 问答非常容易。可以通过笔者的 java-openai 库调用 OpenAI 的 Chat 接口,将用户的问题发送给 GPT 模型,GPT 模型会返回推理结果。
临时记忆
临时记忆的实现有多种方式,这里简单介绍两种方法:
- 数据库存储对话记录:将用户和大模型的对话记录存入数据库中。当需要对新的问题进行推理时,将新消息和历史消息一起发送给大模型。这种方法的缺点是每次推理都会增加 token 数量。
- 提示词汇总:编写一个提示词,将用户的最新消息和历史记录放入提示词中。通过这个提示词,大模型会将新消息和历史消息汇总成一个最新的问题,再将这个问题交给大模型推理。此方法可以减少推理的 token 数量,但会增加一层模型调用。
长期记忆
长期记忆的实现相对复杂,这里介绍一种简单的方法:
- 将用户的输入和大模型的输出添加到历史记录表中,并进行向量化处理。
- 当用户有新的输入时,先对输入进行向量化,得到输入向量。然后将输入向量与历史记录中的向量进行余弦相似度计算,找到相似度较高的历史输入和输出。
- 将相似度较高的历史输入和输出与最新的数据一起交给大模型推理,或者先让大模型汇总成一个输入,再让大模型进行推理。
这种方法有以下几个优点:
- 减少 token 数量:并不是所有历史输入和输出中的信息都与最新输入有关联。通过余弦相似度找到相似度较高的片段,可以减少 token 数量。
- 理论上支持无限长的对话:可以通过工程技术找出相似度最高的前 10 条或者前 100 条,理论上永远不会超出 token 限制。
后置处理
什么是后置处理
后置处理是指对大语言模型(LLM)的输出进行额外的处理和优化。这个过程发生在模型生成初始响应之后,旨在进一步改进和丰富最终呈现给用户的内容。
为什么要进行后置处理
后置处理有几个重要目的:
提升信息质量:通过额外的数据补充和验证,确保输出的准确性和完整性。
优化信息呈现:将原始输出转化为更易读、更有结构的格式。
个性化用户体验:根据用户偏好或具体需求定制输出内容。
增强功能性:集成额外的功能,如链接相关资源或交互式元素。
确保一致性:使输出符合预定义的标准或品牌指南。
后置处理示例
让我们详细展开您提供的示例,并添加一些额外的步骤和解释:
用户输入:"Math 241 的课程教授简介"
信息获取:
- 通过文档检索系统查找相关课程信息
- 利用结构化数据库检索教师信息
- 使用搜索引擎获取补充资料
- 调用大学 API 获取最新的课程安排
LLM 处理:
- 大模型整合所有获取的信息
- 生成一份详细的教授简介,可能长达 1000 字
内容提取:
- 使用自然语言处理(NLP)技术从长文本中提取关键信息
- 识别并提取教授的姓名、专业领域、研究方向等核心信息
补充信息检索:
- 利用提取出的教授姓名,在专门的教职员工数据库中进行精确检索
- 获取教授的最新出版物、获奖情况、联系方式等补充信息
结构化数据处理:
- 将检索到的结构化信息整合为一个简洁的"教授名片"格式
- 可能包括:照片、职称、研究领域、办公室地点、office hours 等
用户界面优化:
- 设计一个视觉吸引力强的教授名片界面
- 添加交互元素,如可点击的邮箱地址或个人主页链接
相关信息链接:
- 提供该教授其他课程的链接
- 添加相关研究论文或项目的参考
最终呈现:
- 将优化后的教授名片展示给用户
- 提供选项让用户查看更详细的信息或返回到简洁视图
推荐问题生成
系统流程
- 用户输入初始查询
- 系统将用户输入与预设提示词模板结合
- 将组合后的输入传递给大型语言模型(LLM)
- LLM 生成一系列相关的推荐问题
推荐问题示例
假设用户输入: "SJSU 2024 秋季开学时间"
系统可能生成以下推荐问题:
- "2024 秋季开学后第一周有哪些重要活动?"
- "2024 秋季开学后第一周的课程安排是什么?"
- "2024 秋季开学后第一周的注册截止时间是什么?"
- "2024 秋季开学后第一周的重要日期有哪些?"
- "2024 秋季开学后第一周的学生服务安排是什么?"
搜索+AI
什么是搜索数据
在现代信息时代,获取最新和准确的信息变得尤为重要。然而,大型语言模型的知识库是固定的,无法及时更新所有的新知识和动态信息。为了解决这一问题,搜索数据的使用应运而生。 搜索数据是指从搜索引擎中获取的相关信息和数据,这些数据可以帮助补充大模型的知识缺口。通过结合用户的输入和相关提示词,搜索数据能够为大模型提供最新的背景信息,从而增强其推理和回答问题的能力。
搜索数据示例
- 用户输入: "SJSU 2024 年 秋季学期的开学时间是什么?"
- 问题重写之后的输入: "SJSU 秋季 2024 开学时间"
- 输入搜索引擎: 将重写后的输入放入搜索引擎,返回对应的数据和搜索结果片段。
- 相似度计算: 对搜索结果片段与重写后的输入进行相似度计算,找出相似度较高的片段。
- 大模型推理: 将较高相似度的片段、用户的输入和意图识别提示词作为一个输入交由大模型推理,最终生成回答。
搜索引擎 Bing API
首先,我们使用 Bing 搜索 API 来获取搜索结果。Bing API 通过一个简单的 HTTP GET 请求来实现搜索功能。我们需要提供一个查询关键词,并附带必要的 API 密钥以进行身份验证。API 返回的结果通常是一个 JSON 对象,其中包含了搜索到的网页、相关的标题以及内容摘要。
具体的实现如下:
- 使用 HttpUtils 工具类来发送 HTTP 请求,并获取 API 的响应。
- 使用 FastJson 库来解析 JSON 响应,从中提取出我们感兴趣的字段(如 URL、标题、内容摘要)。
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.litongjava.tio.utils.environment.EnvUtils;
import com.litongjava.tio.utils.http.HttpUtils;
import com.litongjava.tio.utils.json.FastJson2Utils;
import okhttp3.Response;
public class AiSearchService {
private static final String BING_SEARCH_URL = "https://api.bing.microsoft.com/v7.0/search";
public static List<String> extractKeyWords(String text) {
// 简单的关键词提取实现
return Arrays.asList(text.split(" "));
}
public List<Map<String, String>> search(String keyword) {
List<Map<String, String>> results = new ArrayList<>();
// 使用Bing搜索API进行搜索
String url = BING_SEARCH_URL + "?q=" + keyword;
String BING_API_KEY = EnvUtils.get("BING_API_KEY");
Map<String, String> headers = new HashMap<>();
headers.put("Ocp-Apim-Subscription-Key", BING_API_KEY);
try (Response response = HttpUtils.get(url, headers);) {
if (response.isSuccessful()) {
String bodyString = response.body().string();
JSONObject jsonObject = FastJson2Utils.parseObject(bodyString);
JSONArray items = jsonObject.getJSONObject("webPages").getJSONArray("value");
for (int i = 0; i < items.size(); i++) {
JSONObject item = items.getJSONObject(i);
Map<String, String> result = new HashMap<>();
result.put("url", item.getString("url"));
result.put("title", item.getString("name"));
result.put("snippet", item.getString("snippet"));
results.add(result);
}
} else {
throw new RuntimeException("Failed to sarech:" + keyword);
}
} catch (Exception e) {
throw new RuntimeException(e);
}
return results;
}
}
package com.litongjava.open.chat.services;
import java.util.List;
import java.util.Map;
import org.junit.Test;
import com.litongjava.jfinal.aop.Aop;
import com.litongjava.tio.utils.environment.EnvUtils;
import com.litongjava.tio.utils.json.JsonUtils;
public class AiSearchServiceTest {
@Test
public void testSearch() {
EnvUtils.load();
List<Map<String, String>> result = Aop.get(AiSearchService.class).search("when is the first day at San Jose State University (SJSU) in Fall 2024");
System.out.println(JsonUtils.toJson(result));
}
}
output
[
{
"snippet": "Fall 2024 Spring 2025; First Day of Instruction: August 21, 2024: January 23, 2025: Enrollment Census Date: September 18, 2024: February 19, 2025: ... San José State University. SJSU on Facebook; SJSU on Twitter; SJSU on LinkedIn; SJSU on Instagram; SJSU on YouTube; One Washington Square San José, CA 95192; 408-924-1000;",
"title": "2024-2025 | Class Schedules - San José State University",
"url": "https://www.sjsu.edu/classes/calendar/2024-2025.php"
},
{
"snippet": "Fall 2024; Winter Session; Spring 2025; ... (First floor of North Garage, enter on 9th Street) Hours: Mon.- Fri: 8:00 a.m. - 5:00 p.m. (\"Visit in Person\" by appointment via Qless) Mailing Address. Office of the Registrar San José State University One Washington Square San Jose, CA 95192-0009. Footer. San José State University.",
"title": "Calendar | Office of the Registrar - San José State University",
"url": "https://www.sjsu.edu/registrar/calendar/"
},
{
"snippet": "All future academic calendars are subject to change due to factors beyond campus control. Academic Year Calendar 2025/26 [pdf] Academic Year Calendar 2026/27 [pdf] Academic Year Calendar 2027/28 [pdf]",
"title": "Academic Calendars | Office of the Provost - San José State University",
"url": "https://www.sjsu.edu/provost/resources/academic-calendars/index.php"
},
{
"snippet": "Bursar's Office. Academic Scheduling and Space Management Department. San José State University. One Washington Square. San José, CA 95192. 408-924-1000. SJSU Online. Last Updated May 24, 2024. Accessibility.",
"title": "Calendar | Class Schedules - San José State University",
"url": "https://www.sjsu.edu/classes/calendar/index.php"
},
{
"snippet": "Deadline. Wed, Jan. 1. Final Deadline for Grade Submission (11:59 pm) Fri, Jan. 10. Academic Standing & Current Semester Grades posted on MySJSU & Transcripts. Fall 2024 Registration calendar, the important deadlines to register, add/ drop deadlines. Enrollment appointment, Advance and Late registration, Grading timeline.",
"title": "Fall 2024 | Office of the Registrar - San José State University",
"url": "https://www.sjsu.edu/registrar/calendar/fall-2024.php"
},
{
"snippet": "San José State University online acadmic catalog, a comprehensive source for current information on academic programs, policies, degree requirements, procedures and course offerings. ... University Menu . Go to SJSU homepage. Visit. Campus Tours; Maps; Parking; Silicon Valley; Hammer Theatre; ... Fall 2024 Spring 2025; First Day of Instruction ...",
"title": "Calendar - San José State University - Modern Campus Catalog™",
"url": "https://catalog.sjsu.edu/content.php?catoid=15&navoid=5384"
},
{
"snippet": "October 1, 2024 - December 2, 2024. Cal State Apply Application Period. Application Fee $70 (must be paid at the time of submission) December 2024. Financial Aid (FAFSA and CA Dream Act) Application Available. December 2, 2024. Application Deadline. Application Fee $70 (must be paid at the time of submission) March 2, 2025.",
"title": "Freshman Deadlines | Admissions - San José State University",
"url": "https://www.sjsu.edu/admissions/freshman/deadlines/index.php"
},
{
"snippet": "Welcome to the start of Fall 2024! As many of you know, Academic Scheduling & Space Management ... and we look forward to your feedback on the new look by sending it to academicscheduling@sjsu.edu. ... San Jose State University One Washington Square, San Jose, CA 95192 408-924-1000. Powered by WordPress & Highwind.",
"title": "Academic Scheduling & Space Management Update: Planning for Winter ...",
"url": "https://blogs.sjsu.edu/abso/2024/08/30/academic-scheduling-space-management-update-planning-for-winter-spring-2025-terms/"
},
{
"snippet": "Students interested in the individualized program of study for PORT 1X/Y and PORT 20X/Y must contact the instructor on the first week of classes in CL 412J at 408-924-4022 or duarte.pinheiro@sjsu.edu. Entry into intermediate studies 20A/X requires the equivalent of 1B/Y or permission of the instructor.",
"title": "Fall 2024 | Class Schedules - San Jose State University",
"url": "https://www2.sjsu.edu/classes/schedules/subject-notes/fall-2024.php"
},
{
"snippet": "At least 5 years must have elapsed since the semester you want to disregard. You must have at least a 3.0 GPA in your most recent 15 units at SJSU, or 2.5 in the past 30 units, or 2.0 in the past 45 units. No courses or units earned during the semester you want to disregard may be counted toward graduation.",
"title": "Registration and Attendance - San Jose State University",
"url": "https://catalog.sjsu.edu/content.php?catoid=15&navoid=5307"
}
]
Bing 搜索 API 的返回结果包含多个网页信息。通过遍历这些搜索结果,我们可以逐一提取出网页的 URL、标题和摘要。接下来,我们会使用 Playwright 访问这些 URL,并获取网页的详细内容。
