123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- # -*- coding: utf-8 -*-
- from .__load__ import *
- from langchain_core.prompts import ChatPromptTemplate
- from langchain_core.output_parsers import StrOutputParser
- from langchain_core.runnables import RunnablePassthrough
- class Role(object):
- def init(self, site_id, role_id, uid):
- self.info = Demeter.service('common').one('role', id=role_id)
- if self.info:
- self.model = Demeter.service('common').one('lang_model', id=self.info['lang_model_id'])
- self.db = None
- self.piece = None
- #self.memory()
- # 知识库挂载
- data = Demeter.service('data').init(site_id)
- context = data.load('similarity', {'k':5, 'fetch_k':50, 'filter': {'role_id': role_id, 'uid' : uid}})
- #sample = data.load('similarity', {'k':5, 'fetch_k':50, 'filter': {'role_id': role_id, 'uid': 'sample'}})
- print(context)
- self.piece = {"context": context | self.format_docs, "question": RunnablePassthrough()}
- return self
- # 写入记忆
- def write(self, memory):
- pass
- # 挂载工具
- def tool(self, tool):
- pass
- def set(self, prompts):
- chain = ChatPromptTemplate.from_template(prompts)
- if not self.piece:
- self.piece = chain
- else:
- self.piece = self.piece | chain
- return self
- def out(self, query, type = []):
- if self.info:
- #self.info['persona'] = '你是一个精美时尚杂志社的编辑,根据以下上下文来回答这个问题{context}'
- template = """你是一个精美时尚杂志社的编辑,根据以下上下文来回答这个问题:
- {context}
- Question: {question},请用中文输出答案。
- """
- template = """你是一位专业医生。以下是病人的病例内容,请根据医学规范生成详细分析报告。
- 病例内容:
- {context}
- 请根据上面提供的病例内容生成报告。根据病人的核心关注需求提供解决方案。
- 报告要求:
- 1. 核心健康问题汇总
- 2. 潜在风险与关联性分析
- 3. 综合健康建议
- 4. 紧急情况预警
- 5. 解决方案
- 请以word格式输出,我好直接生成word。
- """
-
- self.set(template)
- self.model = Demeter.service(self.model['channel'], 'llm').load(model='deepseek-r1', streaming=True)
- full_report = ""
- chain = (self.piece | self.model | StrOutputParser())
- for chunk in chain.stream(query):
- print(chunk, end="")
- full_report += chunk
- #self.save_docx(full_report)
- def format_docs(self, docs):
- return "\n\n".join([d.page_content for d in docs])
- def save_docx(self, content):
- patient_id = self.info.get('uid', 'unknown') # 或者 role_id
- timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
- filename = f"report_{patient_id}_{timestamp}.docx"
- output_dir = "reports"
- os.makedirs(output_dir, exist_ok=True)
- filepath = os.path.join(output_dir, filename)
- doc = Document()
- doc.add_heading('诊断报告', 0)
- doc.add_paragraph(report_text)
- doc.save(filepath)
- print(f"\n\n📝 报告已保存为:{filepath}")
- # 生成角色
- def create(self, site_id, uid, name, persona, lang_model_id, data, tool):
- db = Demeter.db('role')
- db.site_id = site_id
- db.create_uid = create_uid
- db.owner_uid = owner_uid
- db.persona = persona
- db.lang_model_id = lang_model_id
- id = db.insert()
- if len(data) > 0:
- for key, value in enumerate(data):
- pass
|