From fa7ce6fada4002c99876db16f31d19d790de0057 Mon Sep 17 00:00:00 2001 From: HuangHai <10402852@qq.com> Date: Sun, 29 Jun 2025 19:22:37 +0800 Subject: [PATCH] 'commit' --- dsRag/Start.py | 27 +++++++++---- dsRag/Util/ModelUtil.py | 4 ++ dsRag/Util/SearchUtil.py | 38 +++++++----------- .../__pycache__/SearchUtil.cpython-310.pyc | Bin 5466 -> 5155 bytes 4 files changed, 38 insertions(+), 31 deletions(-) create mode 100644 dsRag/Util/ModelUtil.py diff --git a/dsRag/Start.py b/dsRag/Start.py index 1ac2e0ff..e136f59c 100644 --- a/dsRag/Start.py +++ b/dsRag/Start.py @@ -1,6 +1,21 @@ +import logging +import os +import subprocess +import tempfile import urllib.parse +import uuid +import warnings +from io import BytesIO +from logging.handlers import RotatingFileHandler +import fastapi +import uvicorn +from fastapi import FastAPI, HTTPException +from starlette.staticfiles import StaticFiles + +from Util.ALiYunUtil import ALiYunUtil from Util.SearchUtil import * + # 初始化日志 logger = logging.getLogger(__name__) logger.setLevel(logging.INFO) @@ -24,7 +39,6 @@ logger.addHandler(file_handler) logger.addHandler(console_handler) - async def lifespan(app: FastAPI): # 初始化阿里云大模型工具 app.state.aliyun_util = ALiYunUtil() @@ -42,7 +56,7 @@ app.mount("/static", StaticFiles(directory="Static"), name="static") @app.post("/api/save-word") -async def save_to_word(request: Request): +async def save_to_word(request: fastapi.Request): output_file = None try: # Parse request data @@ -91,18 +105,17 @@ async def save_to_word(request: Request): logger.warning(f"Failed to clean up temp files: {str(e)}") - -@app.post("/api/rag") -async def rag(request: Request): +@app.post("/api/rag", response_model=None) +async def rag(request: fastapi.Request): data = await request.json() query = data.get('query', '') query_tags = data.get('tags', []) # 调用es进行混合搜索 - search_results = queryByEs(query, query_tags) + search_results = queryByEs(query, query_tags, logger) # 调用大模型 - markdown_content = callLLM(request, query, search_results) + markdown_content = callLLM(request, query, search_results, logger) # 如果有正确的结果 if markdown_content: diff --git a/dsRag/Util/ModelUtil.py b/dsRag/Util/ModelUtil.py new file mode 100644 index 00000000..2d7907ef --- /dev/null +++ b/dsRag/Util/ModelUtil.py @@ -0,0 +1,4 @@ +from typing import List + +from pydantic import BaseModel, Field + diff --git a/dsRag/Util/SearchUtil.py b/dsRag/Util/SearchUtil.py index 97821452..dc4284e1 100644 --- a/dsRag/Util/SearchUtil.py +++ b/dsRag/Util/SearchUtil.py @@ -1,29 +1,10 @@ -import logging -import os -import subprocess -import tempfile -import urllib.parse -import uuid -from io import BytesIO -from logging.handlers import RotatingFileHandler -from typing import List - -import uvicorn -from fastapi import FastAPI, Request, HTTPException -from fastapi.staticfiles import StaticFiles -from pydantic import BaseModel, Field from starlette.responses import StreamingResponse from Config.Config import ES_CONFIG -import warnings -from Util.ALiYunUtil import ALiYunUtil from Util.EsSearchUtil import EsSearchUtil -# 初始化日志 -logger = logging.getLogger(__name__) -logger.setLevel(logging.INFO) -def queryByEs(query, query_tags): +def queryByEs(query, query_tags,logger): # 获取EsSearchUtil实例 es_search_util = EsSearchUtil(ES_CONFIG) @@ -144,7 +125,7 @@ def queryByEs(query, query_tags): es_search_util.es_pool.release_connection(es_conn) -def callLLM(request, query, search_results): +def callLLM(request, query, search_results, logger,streamBack=False): # 调用阿里云大模型整合结果 aliyun_util = request.app.state.aliyun_util @@ -183,7 +164,16 @@ def callLLM(request, query, search_results): if len(context) > 0: # 调用大模型生成回答 logger.info("正在调用阿里云大模型生成回答...") - markdown_content = aliyun_util.chat(prompt) - logger.info(f"调用阿里云大模型生成回答成功完成!") - return markdown_content + + if streamBack: + # SSE流式返回 + async def generate(): + async for chunk in aliyun_util.chat_stream(prompt): + yield f"data: {chunk}\n\n" + return StreamingResponse(generate(), media_type="text/event-stream") + else: + # 一次性返回 + markdown_content = aliyun_util.chat(prompt) + logger.info(f"调用阿里云大模型生成回答成功完成!") + return markdown_content return None diff --git a/dsRag/Util/__pycache__/SearchUtil.cpython-310.pyc b/dsRag/Util/__pycache__/SearchUtil.cpython-310.pyc index da6c9a626fd7d8d0a78ca006e5a063a6d08c3b5c..bcdce155299da36e251555ccf06659a3be41db41 100644 GIT binary patch delta 2000 zcmZ`)-ER{|5Z~SV^!d*DKp`I`BoMv~#7X&T1r)U*&{n1CL)0Q!CGPe1;y5|`lD#t} z)}0J;5Ksw;>X7;Xk%IaJ5A6f*Rp0st^z9z1zV;tzrAnopT_;Y0#95x5otyd1?9A+3 zdi;lDmTy@Gf=4=FFU);s4PQAA8;U6QP!$(3<~;F8RVqq?mpr+u6cylQs;r@+N)4(} zeGL~inwdrU?4KMhd5jM?%`3sIYcprz^RVJM5|?j2y|8kxToxPw8ln)la4bdABH56h zp;&%|8+RhIAyfPef)E^u&=a&yI(sR?yY_PDjl#L$^bE&}Fjqr0Qd+xBv`B&T z>37NCZs?4Fk{7k)TQY`~%V_%Y3k23=OV5C1mbS%oyL;NiCFmOj8%A-%@=DON} zKL+AFh=;ciyz;96IKJs*M~L9!@D3LzBAs^ibMS39C%4_a(Mxhv&NVwZn})2#2A!aV zHME@%AW><5zkqW2}gWzO{Nfz3=Fr;_K^ zz~c~CFp_=7Kwrl)&0H+IHTTvsyTp=@jfZ-U$y`lJem91Pu=aDjxzA?lDk(U3q{*h2L_TS(4c`m;f-JMCZut!aZ~k z&l8%Z=9(U>p%$qvL@kwh*Fv|}E_YsP7iSz4Q;E63W)r|x6jF$=)lArL6yfu2GQ>okP-5xS0I7~FhHQnD_60Y)q8xpv^vOhcu1 zXrCW#5W~phV%Ax(!%`43*RDbnDb7N@wgiouwY|z}y;iDwFtk&3nfcY_&8`(S(|JQN zJ9J+_5CN|bxxE*6WA(qrpksU9wQHXiE_yz&!KK2MZbLNLgnJWGGT!lNR9#xJOX2FW zoBZ56-DKwgEtMDjN{t->mW^<7h!Z$9yx}3|^;BanG!DS<{$vxJoCH!d+Q?J3vy^J0 z0JlQ+F1PHi+H8sX-_&;1g`MT5;#3;M+vKs|22sGB8^n-$iT;YHgvhUmq5owL8bl^J zl9LR{zy_A#$36g6xP(_BtUW_G6Pd)sx|Cb}AF^N6SpWb4 delta 2244 zcmZ`)%Wu?1828v-+v~Nnn{3{YguEcjV@X?DDwReegcPLk5TT+SL04wSNgVvxjJ-fA zuU06a(gPC6mr4+6qn=O?9QY%UD)k@mp{=;}&|cePznKjiK*E;4`JTUT=9|wmKhLCx z&A>Eu0iNX%Ypwaj9BKXo0ucyu1>7DHMqC!L$VUlFe3Ws9j|x^`6kXNRu!dNSztR}oM&Kz^T;)^3HFTJ<>hhSE8v3Hjk~!`aeKTXE}|v_P~Bdy5BGWfxSty}cfcFO zgPhO0L*6hR-UZx;_kq9e?)OIU2-oG@QEv>7A;A_}2kh}3geUBY)}$@0PwgP^Fo=0y zz|*9QY^1!r!SvR)hqT!-43JFJa_f#<+FFIb}e!OA6#?G44}&5!;+Y0=dIAb5D?o<%NbN6fGh`) z*0tmsn!F%8h!mfRr1zN!oJRV9?|&pVG8}jSfHP!pNMPT435Gg|!yUv|=y+4%k)sf) zd?0eH6M5i$d@{Z*acg!jFUfC-3&M@b>taJ~XdHbaR-X!FGSLgE7%ATu z_Exa~^=o9wajxy8yJEgM%N^T}K$uQD#97ol5TLCsA+mLLWvr`BgtQ%okK*KJAI{==sgF;c(KOdvWx0uv8@= zZypsG_ML$*Wb2QGbzvQ?iw!CHJ2&~2OcZuH5ctD^YTFt3Su^baC)ryvJsBx2mFT=} zq?Q)LUN#i2%W<8u497GaoJMlbxQ>d+@5cVaY=$MNUCPgZPbF&a*6!Wi_$iq(%SwB_ zFTXLrlarmEg=U(wTxYZHSL$%`rSf{<_;eOv=nNyr7%2n6a&^s$N@}Xo_NmLONl!BS z9FSD420kl&s?=!U)uOcES@aeO?)VjM@!zx&i{Q0XtCs6#mzFLhpbAG5zc|#?k&a|| z=>q6Vhu~g-y@fqY#UM=euznN3t9BTsT4Z~*6*%BiqfTAdxmm7RG_+HtEv0h3?vPY; z0?H0^T-e1aueI-!kg`onm1wiZIz(oITEE?NssZ(}x&l{>RdZ+t^i*Ml?I|wq>dRn- z`-P8P+8vAf z12CBo=h-Dx-n*Zunfz89XtI`1v#WNr)b4k!Qt>U%u2lFgrCJCU`!-y1^7)I4mndsZ xUdG+umx-N*NVQX5K{){?`Nzy?G79UQO%;T421WA%m%OiK&gv{{bA=G4KEY