feat: 换一批注入用户画像,生成更贴合用户自身的示例问题
This commit is contained in:
@@ -312,6 +312,7 @@ class SampleRequest(BaseModel):
|
|||||||
scene: str = "legal"
|
scene: str = "legal"
|
||||||
topic: str | None = None
|
topic: str | None = None
|
||||||
existing: list[str] | None = None # 已展示的示例,避免重复
|
existing: list[str] | None = None # 已展示的示例,避免重复
|
||||||
|
phone: str | None = None # 用户手机号,用于读取画像个性化推荐
|
||||||
|
|
||||||
|
|
||||||
class TopicsRequest(BaseModel):
|
class TopicsRequest(BaseModel):
|
||||||
@@ -461,6 +462,15 @@ def generate_samples(req: SampleRequest):
|
|||||||
)
|
)
|
||||||
if req.topic:
|
if req.topic:
|
||||||
prompt += f"具体话题:{req.topic}\n\n"
|
prompt += f"具体话题:{req.topic}\n\n"
|
||||||
|
# 注入用户画像,个性化推荐
|
||||||
|
if req.phone:
|
||||||
|
try:
|
||||||
|
profile = profile_store.get(req.phone)
|
||||||
|
profile_ctx = build_profile_context(profile)
|
||||||
|
if profile_ctx:
|
||||||
|
prompt += f"用户画像(请结合画像生成更贴合用户自身情况的问题):\n{profile_ctx}\n\n"
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
if existing:
|
if existing:
|
||||||
prompt += "已展示过的问题(不要重复):\n"
|
prompt += "已展示过的问题(不要重复):\n"
|
||||||
for s in existing:
|
for s in existing:
|
||||||
|
|||||||
@@ -38,6 +38,7 @@ import {
|
|||||||
DialogTrigger,
|
DialogTrigger,
|
||||||
} from '@/components/ui/dialog'
|
} from '@/components/ui/dialog'
|
||||||
import { api } from '@/lib/api'
|
import { api } from '@/lib/api'
|
||||||
|
import { getPhone } from '@/lib/auth'
|
||||||
import { cn } from '@/lib/utils'
|
import { cn } from '@/lib/utils'
|
||||||
import type { AskResponse, EmotionMode, ExpertService, HistoryMessage, KnowledgeDoc, RiskCard, Scene, SessionMode } from '@/types'
|
import type { AskResponse, EmotionMode, ExpertService, HistoryMessage, KnowledgeDoc, RiskCard, Scene, SessionMode } from '@/types'
|
||||||
|
|
||||||
@@ -544,11 +545,12 @@ export function ChatPanel({
|
|||||||
}, answers.length > 0 ? answers : undefined)
|
}, answers.length > 0 ? answers : undefined)
|
||||||
}
|
}
|
||||||
|
|
||||||
/** AI 换一批示例问题 */
|
/** AI 换一批示例问题(注入用户画像,个性化推荐) */
|
||||||
const handleRefreshSamples = async () => {
|
const handleRefreshSamples = async () => {
|
||||||
setRefreshing(true)
|
setRefreshing(true)
|
||||||
try {
|
try {
|
||||||
const res = await api.generateSamples(scene, topic, dynamicSamples)
|
const phone = getPhone() || undefined
|
||||||
|
const res = await api.generateSamples(scene, topic, dynamicSamples, phone)
|
||||||
setDynamicSamples(res.samples)
|
setDynamicSamples(res.samples)
|
||||||
} catch {
|
} catch {
|
||||||
toast.error('换一批失败,请稍后重试')
|
toast.error('换一批失败,请稍后重试')
|
||||||
|
|||||||
+2
-2
@@ -235,9 +235,9 @@ export const api = {
|
|||||||
request<{ topics: Array<{ title: string; desc: string; samples: string[] }> }>('/topics', {
|
request<{ topics: Array<{ title: string; desc: string; samples: string[] }> }>('/topics', {
|
||||||
method: 'POST', body: JSON.stringify({ scene, existing }),
|
method: 'POST', body: JSON.stringify({ scene, existing }),
|
||||||
}),
|
}),
|
||||||
generateSamples: (scene: Scene = 'legal', topic?: string, existing?: string[]) =>
|
generateSamples: (scene: Scene = 'legal', topic?: string, existing?: string[], phone?: string) =>
|
||||||
request<{ samples: string[] }>('/samples', {
|
request<{ samples: string[] }>('/samples', {
|
||||||
method: 'POST', body: JSON.stringify({ scene, topic, existing }),
|
method: 'POST', body: JSON.stringify({ scene, topic, existing, phone }),
|
||||||
}),
|
}),
|
||||||
|
|
||||||
// ===== 每日热点问题 =====
|
// ===== 每日热点问题 =====
|
||||||
|
|||||||
Reference in New Issue
Block a user