diff --git a/dsRag/Start.py b/dsRag/Start.py index 6facaf81..baa259db 100644 --- a/dsRag/Start.py +++ b/dsRag/Start.py @@ -129,7 +129,6 @@ async def rag(request: fastapi.Request): return {"data": "没有在知识库中找到相关的信息,无法回答此问题。"} - @app.post("/api/rag_stream", response_model=None) async def rag_stream(request: fastapi.Request): data = await request.json() @@ -139,9 +138,62 @@ async def rag_stream(request: fastapi.Request): # 调用es进行混合搜索 search_results = queryByEs(query, query_tags, logger) - # 流式调用大模型 - # 获取StreamingResponse对象 - return callLLM(request, query, search_results, logger, True) + # 构建提示词 + context = "\n".join([ + f"结果{i + 1}: {res['tags']['full_content']}" + for i, res in enumerate(search_results['vector_results'] + search_results['text_results']) + ]) + # 添加图片识别提示 + prompt = f""" + 信息检索与回答助手 + 根据以下关于'{query}'的相关信息: + + 基本信息 + - 语言: 中文 + - 描述: 根据提供的材料检索信息并回答问题 + - 特点: 快速准确提取关键信息,清晰简洁地回答 + + 相关信息 + {context} + + 回答要求 + 1. 严格保持原文中图片与上下文的顺序关系,确保语义相关性 + 2. 图片引用使用Markdown格式: ![图片描述](图片路径) + 3. 使用Markdown格式返回,包含适当的标题、列表和代码块 + 4. 对于提供Latex公式的内容,尽量保留Latex公式 + 5. 直接返回Markdown内容,不要包含额外解释或说明 + 6. 依托给定的资料,快速准确地回答问题,可以添加一些额外的信息,但请勿重复内容 + 7. 如果未提供相关信息,请不要回答 + 8. 如果发现相关信息与原来的问题契合度低,也不要回答 + 9. 确保内容结构清晰,便于前端展示 + """ + # 初始化异步 OpenAI 客户端 + client = AsyncOpenAI( + api_key=Config.MODEL_API_KEY, + base_url="https://dashscope.aliyuncs.com/compatible-mode/v1", + ) + + async def generate_response_stream(): + try: + # 流式调用大模型 + stream = await client.chat.completions.create( + model=Config.MODEL_NAME, + messages=[ + {'role': 'user', 'content': prompt} + ], + max_tokens=8000, + stream=True # 启用流式模式 + ) + + # 流式返回模型生成的回复 + async for chunk in stream: + if chunk.choices[0].delta.content: + yield f"data: {json.dumps({'reply': chunk.choices[0].delta.content}, ensure_ascii=False)}\n\n" + + except Exception as e: + yield f"data: {json.dumps({'error': str(e)})}\n\n" + + return EventSourceResponse(generate_response_stream()) # 与用户交流聊天