|
31 | 31 | import modelengine.jade.schema.SchemaValidator; |
32 | 32 |
|
33 | 33 | import java.io.IOException; |
| 34 | +import java.time.LocalDate; |
| 35 | +import java.time.format.DateTimeFormatter; |
| 36 | +import java.util.ArrayList; |
34 | 37 | import java.util.Arrays; |
35 | 38 | import java.util.Collection; |
36 | 39 | import java.util.HashMap; |
|
53 | 56 | @Order(PromptBuilderOrder.REFERENCE) |
54 | 57 | public class ReferencePromptBuilder implements PromptBuilder { |
55 | 58 | private static final String KNOWLEDGE_PLACEHOLDER = "knowledgeData"; |
| 59 | + private static final String CURRENT_DATE_PLACEHOLDER = "currentDate"; |
56 | 60 | private static final String KNOWLEDGE_SEPARATOR = "\n"; |
57 | 61 | private static final String KNOWLEDGE_ID = "id"; |
58 | 62 | private static final String KNOWLEDGE_TEXT = "text"; |
| 63 | + private static final String KNOWLEDGE_METADATA = "metadata"; |
| 64 | + private static final String METADATA_URL = "url"; |
| 65 | + private static final String METADATA_SOURCE = "source"; |
| 66 | + private static final String METADATA_TIMESTAMP = "timestamp"; |
| 67 | + private static final String METADATA_DATE = "date"; |
59 | 68 | private static final String KNOWLEDGE_SCHEMA = "/knowledge_reference_schema.json"; |
60 | 69 | private static final int REFERENCE_ID_LENGTH = 6; |
61 | 70 | private static final List<String> REFERENCE_TEMPLATE_LIST = |
@@ -93,8 +102,10 @@ public Optional<PromptMessage> build(UserAdvice userAdvice, Map<String, Object> |
93 | 102 | String referenceTemplate = this.templateI18nMap.get(templateFilePath); |
94 | 103 | Validation.notBlank(referenceTemplate, "The reference prompt template cannot be blank."); |
95 | 104 |
|
| 105 | + String currentDate = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); |
96 | 106 | String referenceMessage = new DefaultStringTemplate(referenceTemplate).render(MapBuilder.<String, String>get() |
97 | 107 | .put(KNOWLEDGE_PLACEHOLDER, this.formatKnowledge(referenceKnowledge)) |
| 108 | + .put(CURRENT_DATE_PLACEHOLDER, currentDate) |
98 | 109 | .build()); |
99 | 110 | String systemMessage = this.getBackground(userAdvice.getBackground()) + referenceMessage; |
100 | 111 | String humanMessage = new DefaultStringTemplate(userAdvice.getTemplate()).render(userAdvice.getVariables()); |
@@ -153,8 +164,45 @@ private List<Map<String, Object>> dedupeKnowledge(List<List<Map<String, Object>> |
153 | 164 |
|
154 | 165 | private String formatKnowledge(Map<String, Map<String, Object>> referenceKnowledge) { |
155 | 166 | StringBuilder sb = new StringBuilder(); |
156 | | - referenceKnowledge.forEach((key, value) -> sb.append( |
157 | | - StringUtils.format("[{0}] {1}{2}", key, value.get(KNOWLEDGE_TEXT), KNOWLEDGE_SEPARATOR))); |
| 167 | + referenceKnowledge.forEach((key, value) -> { |
| 168 | + StringBuilder knowledgeItem = new StringBuilder(); |
| 169 | + knowledgeItem.append(StringUtils.format("[{0}] {1}", key, value.get(KNOWLEDGE_TEXT))); |
| 170 | + |
| 171 | + // 处理 metadata 信息 |
| 172 | + if (value.containsKey(KNOWLEDGE_METADATA)) { |
| 173 | + Map<String, Object> metadata = ObjectUtils.cast(value.get(KNOWLEDGE_METADATA)); |
| 174 | + if (metadata != null && !metadata.isEmpty()) { |
| 175 | + List<String> metadataInfo = new ArrayList<>(); |
| 176 | + |
| 177 | + // 添加 URL(网络搜索数据的标识) |
| 178 | + if (metadata.containsKey(METADATA_URL) && metadata.get(METADATA_URL) != null) { |
| 179 | + metadataInfo.add(StringUtils.format("URL: {0}", metadata.get(METADATA_URL))); |
| 180 | + } |
| 181 | + |
| 182 | + // 添加来源 |
| 183 | + if (metadata.containsKey(METADATA_SOURCE) && metadata.get(METADATA_SOURCE) != null) { |
| 184 | + metadataInfo.add(StringUtils.format("Source: {0}", metadata.get(METADATA_SOURCE))); |
| 185 | + } |
| 186 | + |
| 187 | + // 添加时间戳 |
| 188 | + if (metadata.containsKey(METADATA_TIMESTAMP) && metadata.get(METADATA_TIMESTAMP) != null) { |
| 189 | + metadataInfo.add(StringUtils.format("Timestamp: {0}", metadata.get(METADATA_TIMESTAMP))); |
| 190 | + } |
| 191 | + |
| 192 | + // 添加日期 |
| 193 | + if (metadata.containsKey(METADATA_DATE) && metadata.get(METADATA_DATE) != null) { |
| 194 | + metadataInfo.add(StringUtils.format("Date: {0}", metadata.get(METADATA_DATE))); |
| 195 | + } |
| 196 | + |
| 197 | + if (!metadataInfo.isEmpty()) { |
| 198 | + knowledgeItem.append(" [").append(String.join(", ", metadataInfo)).append("]"); |
| 199 | + } |
| 200 | + } |
| 201 | + } |
| 202 | + |
| 203 | + knowledgeItem.append(KNOWLEDGE_SEPARATOR); |
| 204 | + sb.append(knowledgeItem); |
| 205 | + }); |
158 | 206 | return sb.toString(); |
159 | 207 | } |
160 | 208 |
|
|
0 commit comments