1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 |
- from fastapi import APIRouter, HTTPException
- from pydantic import BaseModel
- from typing import List
- from service.trunks_service import TrunksService
- from utils.text_splitter import TextSplitter
- from model.response import StandardResponse
- import logging
- logger = logging.getLogger(__name__)
- router = APIRouter(prefix="/text", tags=["Text Search"])
- class TextSearchRequest(BaseModel):
- text: str
- limit: int = 1
- @router.post("/search", response_model=StandardResponse)
- async def search_text(request: TextSearchRequest):
- try:
- # 使用TextSplitter拆分文本
- sentences = TextSplitter.split_text(request.text)
- if not sentences:
- return StandardResponse(success=True, data={"answer": "", "references": []})
-
- # 对每个句子进行向量搜索
- trunks_service = TrunksService()
- result_sentences = []
- all_references = []
- reference_index = 1
-
- for sentence in sentences:
- search_results = trunks_service.search_by_vector(
- text=sentence,
- limit=request.limit
- )
-
- # 处理搜索结果
- for result in search_results:
- # 添加引用标记
- result_sentence = sentence + f"^[{reference_index}]^"
- result_sentences.append(result_sentence)
-
- # 添加到引用列表
- reference = {
- "index": str(reference_index),
- "content": result["content"],
- "file_path": result.get("file_path", ""),
- "title": result.get("title", ""),
- "distance": result.get("distance", "")
- }
- all_references.append(reference)
- reference_index += 1
-
- # 组装返回数据
- response_data = {
- "answer": "\n".join(result_sentences),
- "references": all_references
- }
-
- return StandardResponse(success=True, data=response_data)
-
- except Exception as e:
- logger.error(f"Text search failed: {str(e)}")
- raise HTTPException(status_code=500, detail=str(e))
- text_search_router = router
|