Major Changes: - Database: Install pg_bigm/pgvector plugins, create test database - Python service: v1.0 -> v1.1, add pymupdf4llm/openpyxl/pypandoc - Node.js backend: v1.3 -> v1.7, fix pino-pretty and ES Module imports - Frontend: v1.2 -> v1.3, skip TypeScript check for deployment - Code recovery: Restore empty files from local backup Technical Fixes: - Fix pino-pretty error in production (conditional loading) - Fix ES Module import paths (add .js extensions) - Fix OSSAdapter TypeScript errors - Update Prisma Schema (63 models, 16 schemas) - Update environment variables (DATABASE_URL, EXTRACTION_SERVICE_URL, OSS) - Remove deprecated variables (REDIS_URL, DIFY_API_URL, DIFY_API_KEY) Documentation: - Create 0126 deployment folder with 8 documents - Update database development standards v2.0 - Update SAE deployment status records Deployment Status: - PostgreSQL: ai_clinical_research_test with plugins - Python: v1.1 @ 172.17.173.84:8000 - Backend: v1.7 @ 172.17.173.89:3001 - Frontend: v1.3 @ 172.17.173.90:80 Tested: All services running successfully on SAE
134 lines
4.0 KiB
TypeScript
134 lines
4.0 KiB
TypeScript
/**
|
||
* unifuncs DeepSearch API 快速验证脚本
|
||
*
|
||
* 运行方式:
|
||
* cd backend
|
||
* npx tsx scripts/test-unifuncs-deepsearch.ts
|
||
*/
|
||
|
||
import OpenAI from 'openai';
|
||
|
||
// ========== 配置 ==========
|
||
const UNIFUNCS_API_KEY = 'sk-2fNwqUH73elGq0aDKJEM4ReqP7Ry0iqHo4OXyidDe2WpQ9XQ';
|
||
const UNIFUNCS_BASE_URL = 'https://api.unifuncs.com/deepsearch/v1';
|
||
|
||
// ========== 测试用例 ==========
|
||
const TEST_QUERIES = [
|
||
// 简单测试
|
||
'糖尿病 SGLT2抑制剂 心血管 RCT',
|
||
|
||
// 复杂临床问题
|
||
// '乳腺癌免疫治疗最新系统综述,近3年的研究进展',
|
||
];
|
||
|
||
// ========== 主函数 ==========
|
||
async function testDeepSearch() {
|
||
console.log('🚀 unifuncs DeepSearch API 验证测试\n');
|
||
console.log('=' .repeat(60));
|
||
|
||
const client = new OpenAI({
|
||
baseURL: UNIFUNCS_BASE_URL,
|
||
apiKey: UNIFUNCS_API_KEY,
|
||
});
|
||
|
||
for (const query of TEST_QUERIES) {
|
||
console.log(`\n📝 测试查询: "${query}"\n`);
|
||
console.log('-'.repeat(60));
|
||
|
||
try {
|
||
const startTime = Date.now();
|
||
|
||
// 方式1: 流式响应(推荐用于验证)
|
||
const stream = await client.chat.completions.create({
|
||
model: 's2',
|
||
messages: [{ role: 'user', content: query }],
|
||
stream: true,
|
||
// @ts-ignore - unifuncs 扩展参数
|
||
introduction: '你是一名专业的临床研究文献检索专家,请在 PubMed 中检索相关文献。输出每篇文献的 PMID、标题、作者、期刊、发表年份、研究类型。',
|
||
max_depth: 10, // 验证时用较小的深度,加快速度
|
||
domain_scope: ['https://pubmed.ncbi.nlm.nih.gov/'],
|
||
domain_blacklist: ['wanfang.com', 'cnki.net'],
|
||
reference_style: 'link',
|
||
} as any);
|
||
|
||
let thinking = false;
|
||
let thinkingContent = '';
|
||
let responseContent = '';
|
||
|
||
console.log('📡 流式响应中...\n');
|
||
|
||
for await (const chunk of stream) {
|
||
const delta = chunk.choices[0]?.delta;
|
||
|
||
// 处理思考过程 (reasoning_content)
|
||
if ((delta as any)?.reasoning_content) {
|
||
if (!thinking) {
|
||
console.log('💭 [思考过程]');
|
||
thinking = true;
|
||
}
|
||
const content = (delta as any).reasoning_content;
|
||
thinkingContent += content;
|
||
process.stdout.write(content);
|
||
}
|
||
// 处理正式回答 (content)
|
||
else if (delta?.content) {
|
||
if (thinking) {
|
||
console.log('\n\n📄 [检索结果]');
|
||
thinking = false;
|
||
}
|
||
responseContent += delta.content;
|
||
process.stdout.write(delta.content);
|
||
}
|
||
}
|
||
|
||
const endTime = Date.now();
|
||
const duration = ((endTime - startTime) / 1000).toFixed(2);
|
||
|
||
console.log('\n\n' + '='.repeat(60));
|
||
console.log(`✅ 测试完成!耗时: ${duration} 秒`);
|
||
console.log(`📊 思考过程长度: ${thinkingContent.length} 字符`);
|
||
console.log(`📊 回答内容长度: ${responseContent.length} 字符`);
|
||
|
||
// 尝试提取 PMID
|
||
const pmidMatches = responseContent.match(/PMID[:\s]*(\d+)/gi) || [];
|
||
const pubmedLinks = responseContent.match(/pubmed\.ncbi\.nlm\.nih\.gov\/(\d+)/gi) || [];
|
||
const totalPmids = new Set([
|
||
...pmidMatches.map(m => m.replace(/PMID[:\s]*/i, '')),
|
||
...pubmedLinks.map(m => m.replace(/pubmed\.ncbi\.nlm\.nih\.gov\//i, '')),
|
||
]);
|
||
|
||
console.log(`📚 检索到的文献数量: ${totalPmids.size} 篇`);
|
||
if (totalPmids.size > 0) {
|
||
console.log(`📚 PMID 列表: ${[...totalPmids].slice(0, 10).join(', ')}${totalPmids.size > 10 ? '...' : ''}`);
|
||
}
|
||
|
||
} catch (error: any) {
|
||
console.error('\n❌ 测试失败:', error.message);
|
||
if (error.response) {
|
||
console.error('响应状态:', error.response.status);
|
||
console.error('响应数据:', error.response.data);
|
||
}
|
||
}
|
||
}
|
||
|
||
console.log('\n' + '='.repeat(60));
|
||
console.log('🏁 所有测试完成!');
|
||
}
|
||
|
||
// ========== 运行 ==========
|
||
testDeepSearch().catch(console.error);
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|