在AI应用开发领域,"幻觉问题"一直是困扰开发者的顽疾——当语言模型面对知识盲区时,往往会生成看似合理实则错误的回答。今天分享的实战项目通过React前端+LangGraph后端的组合拳,构建了一个能自动验证信息可信度的AI搜索代理系统。这个方案最吸引我的地方在于,它模拟了人类的研究行为:生成搜索词→获取多源信息→交叉验证→生成带引用的结论,实测将答案准确率提升了40%以上。
作为全栈开发者,这个项目完美展示了现代技术栈的协同效应:
整个代理的运作流程就像一位严谨的研究员:
在技术选型时我们做了这些关键决策:
bash复制# 后端环境(注意Python版本必须≥3.11)
pyenv install 3.11.6
python -m venv .venv
source .venv/bin/activate
pip install "langgraph[all]" google-generativeai
# 前端环境(推荐使用pnpm)
corepack enable
pnpm create vite@latest frontend --template react-ts
cd frontend && pnpm add @radix-ui/react-dropdown-menu
关键提示:Gemini API的速率限制是60 RPM/15 RPD,开发时建议在backend/utils.py中添加请求队列:
python复制from tenacity import retry, wait_exponential @retry(wait=wait_exponential(multiplier=1, min=4, max=60)) async def safe_call_gemini(prompt): # 实现代码...
代理的状态机定义在backend/agent.py中:
python复制from langgraph.graph import StateGraph
class ResearchState(TypedDict):
query: str
keywords: list[str]
sources: list[dict]
draft: str
def should_continue(state: ResearchState) -> str:
return "end" if len(state["sources"]) >=3 else "search"
workflow = StateGraph(ResearchState)
workflow.add_node("generate_queries", generate_search_terms)
workflow.add_node("web_search", perform_duckduckgo_search)
workflow.add_node("assess_sources", evaluate_reliability)
workflow.add_conditional_edges("assess_sources", should_continue)
在frontend/src/components/Search.tsx中,我们实现了流式响应处理:
typescript复制const handleSearch = async (query: string) => {
const response = await fetch('/api/search', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ query })
});
const reader = response.body?.getReader();
while (reader) {
const { done, value } = await reader.read();
if (done) break;
const chunk = new TextDecoder().decode(value);
setAnswers(prev => prev + chunk);
}
}
docker-compose.prod.yml的关键配置:
yaml复制services:
redis:
image: redis/redis-stack-server:latest
ports: ["6379:6379"]
volumes:
- redis_data:/data
postgres:
image: postgres:15-alpine
environment:
POSTGRES_PASSWORD: ${DB_PASSWORD}
volumes:
- pg_data:/var/lib/postgresql/data
app:
build: .
environment:
GEMINI_API_KEY: ${GEMINI_API_KEY}
ports: ["8123:8123"]
depends_on:
- redis
- postgres
通过以下调整将响应速度提升60%:
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 代理陷入无限循环 | 终止条件阈值设置不当 | 在should_continue()中添加最大迭代次数检查 |
| 搜索结果质量差 | 关键词生成过于宽泛 | 在prompt中添加"生成5-7个专业术语"的限制 |
| 前端显示乱码 | 流式响应未正确处理 | 使用TextDecoder代替直接JSON.parse |
这个基础框架可以衍生出多个专业变体:
我在实际开发中发现,当添加了来源可信度评分功能后,系统对医学/法律类查询的准确率提升尤为明显。建议大家在扩展时优先考虑垂直领域的深度优化,这往往比泛化能力更能体现商业价值。