This commit is contained in:
qinyong@9artedu.com 2026-06-23 17:21:48 +08:00
parent 35d93bd787
commit 7ecafd2fbf
6 changed files with 21 additions and 8 deletions

View File

@ -7,11 +7,13 @@ from watchfiles import awatch
from app.chat_qa_query.api.qa_dependencies import get_qa_query_service
from app.chat_qa_query.api.schema.query_qa_schema import QueryQASchema
from app.chat_qa_query.service.query_qa_service import QueryQAService
from app.core.log import logger
query_qa_router = APIRouter()
@query_qa_router.post("/api/qa/query")
async def query_handler(query: QueryQASchema, query_service: Annotated[QueryQAService, Depends(get_qa_query_service)]):
logger.info(f"请求参数:{query.external_str},历史top15:{query.messages_top15}")
return await query_service.query(query.external_str, query.messages_top15)

View File

@ -45,7 +45,7 @@ if __name__ == '__main__':
archive_messages_mysql_repository = ArchiveMessagesRepository(db_session)
qa_milvus_repository = QARepository()
state: QueryQAState = QueryQAState(original_query="培训的费用?")
state: QueryQAState = QueryQAState(original_query="暂时有点忙", history=['2026-05-26T13:14:59 EXTERNAL 暂时有点忙\n', '2026-05-26T12:48:09 INTERNAL 下午好呀 你这边怎么计划的呀 考虑跟咱们6月1号的班级学习嘛\n'])
context = QueryQAContext(meta_mysql_repository=archive_messages_mysql_repository,
qa_milvus_repository=qa_milvus_repository
)

View File

@ -28,7 +28,6 @@ problem_rewriting_prompt = """
4. **输出格式**
- 仅输出JSON不要任何解释性文字
- rewritten_query 必须是一个完整的疑问句"是什么""有哪些""怎么样""如何"等结尾或以问号结尾
## 改写示例
@ -76,6 +75,9 @@ problem_rewriting_prompt = """
历史会话
{history_text}
历史会话字段说明
EXTERNAL客户
INTERNAL销售
当前问题{query}
请直接输出JSON
@ -90,6 +92,7 @@ async def rewrite_query(state:QueryQAState):
"""
history_text = state.get("history", "")
query = state.get("original_query", "")
logger.info(f"问题改写:{query},历史会话:{history_text}")
prompt = PromptTemplate(template=problem_rewriting_prompt, input_variables=["history_text", "query"])
output = JsonOutputParser()
chain = prompt | llm | output

View File

@ -15,7 +15,7 @@ async def search_embed(state:QueryQAState) :
batch_embeddings = await embedding_client.aembed_query(rewritten_query)
qa_repository = QARepository()
result = await qa_repository.search_qa(query_text=batch_embeddings, top_k=3)
result = await qa_repository.search_qa(query_vector=batch_embeddings, top_k=3)
logger.info(f"原始问题:{original_query},改写后的问题:{rewritten_query},匹配结果:{result}")
if result:
question = result[0]["question"]

View File

@ -100,12 +100,12 @@ class QARepository:
logger.error(f"QA数据入库失败: {str(e)}", exc_info=True)
return []
async def search_qa(self, query_text: List[float], top_k: int = 5) -> List[Dict[str, Any]]:
async def search_qa(self, query_vector: List[float], top_k: int = 5) -> List[Dict[str, Any]]:
"""
根据查询文本搜索QA数据
Args:
query_text: 查询文本
query_vector: 查询向量
top_k: 返回结果数量
Returns:
@ -114,13 +114,16 @@ class QARepository:
res = milvus_client.client.search(
collection_name=self.collection_name,
anns_field="question_dense_vector",
data=[query_text],
data=[query_vector],
limit=top_k,
search_params={"metric_type": "COSINE"},
search_params={
"metric_type": "COSINE",
"efSearch": 300 # 你配置 efSearch=200检索时最多遍历 200 个候选节点,再从中选出相似度最高的结果。
},
output_fields=["question", "answer", "created_at"]
)
score_threshold = 0.6
score_threshold = 0.60
filter_results = []
# res 是二维结构:[ [单条结果列表] ]

5
readme Normal file
View File

@ -0,0 +1,5 @@
启动nohup uvicorn app.uvicorn_main:app --host 0.0.0.0 --port 8000 --workers 4 > uvicorn.log 2>&1 &
打包py package.py
同步库+虚拟环境uv sync