[ad_1]
Trong trường hợp này, LLM xác định cả Mã ICD 1 và Mã ICD 2 có liên quan đến ghi chú y tế. Thuật toán sau đó sẽ kiểm tra các nút con của mỗi mã. Mỗi mã cha có hai nút con đại diện cho các mã ICD cụ thể hơn. Bắt đầu với Mã ICD 1, LLM sử dụng các mô tả của Mã ICD 1.1 và Mã ICD 1.2 cùng với ghi chú y tế để xác định các mã liên quan. LLM kết luận rằng Mã ICD 1.1 có liên quan, trong khi Mã ICD 1.2 thì không. Vì Mã ICD 1.1 không có nút con nào nữa nên thuật toán sẽ kiểm tra xem đó có phải là mã có thể gán hay không và gán nó cho tài liệu. Tiếp theo, thuật toán đánh giá các nút con của Mã ICD 2. Gọi lại LLM, nó xác định rằng chỉ Mã ICD 2.1 là phù hợp. Đây là một ví dụ đơn giản; trong thực tế, cây ICD mở rộng và sâu hơn, có nghĩa là thuật toán sẽ tiếp tục duyệt các nút con của từng nút liên quan cho đến khi đến cuối cây hoặc hết các lượt duyệt hợp lệ.
Điểm nổi bật
- Phương pháp này không yêu cầu tinh chỉnh LLM; nó tận dụng khả năng của LLM để hiểu ghi chú y tế theo ngữ cảnh và xác định động các mã ICD có liên quan dựa trên các mô tả được cung cấp.
- Hơn nữa, bài viết này cho thấy rằng LLM có thể thích ứng một cách hiệu quả với không gian đầu ra lớn khi được cung cấp thông tin liên quan ngay lập tức, vượt trội hơn PLM-ICD (6) trên các mã hiếm xét về chỉ số trung bình vĩ mô.
- Kỹ thuật này cũng vượt trội so với yêu cầu cơ bản của việc trực tiếp yêu cầu LLM dự đoán mã ICD cho một ghi chú y tế dựa trên kiến thức tham số của nó. Điều này nêu bật tiềm năng trong việc tích hợp LLM với các công cụ hoặc kiến thức bên ngoài để giải quyết các nhiệm vụ mã hóa lâm sàng.
Hạn chế
- Thuật toán gọi LLM ở mọi cấp độ trong cây. Điều đó dẫn đến số lượng lớn các lệnh gọi LLM khi bạn duyệt qua cây, kết hợp với sự rộng lớn của cây ICD. Điều này dẫn đến độ trễ cao và chi phí khi xử lý một tài liệu.
- Như các tác giả cũng lưu ý trong bài báo, để dự đoán chính xác mã có liên quan, LLM phải xác định chính xác các nút cha của nó ở tất cả các cấp. Ngay cả khi xảy ra lỗi ở một cấp độ, LLM sẽ không thể lấy được mã liên quan cuối cùng.
- Các tác giả không thể đánh giá phương pháp của họ bằng cách sử dụng các bộ dữ liệu như MIMIC-III do những hạn chế cấm truyền dữ liệu sang các dịch vụ bên ngoài như điểm cuối GPT của OpenAI. Thay vào đó, họ đánh giá phương pháp này bằng cách sử dụng bộ thử nghiệm của bộ dữ liệu CodiEsp (7,8), bao gồm 250 ghi chú y tế. Kích thước nhỏ của tập dữ liệu này cho thấy hiệu quả của phương pháp trên các tập dữ liệu lâm sàng lớn hơn vẫn chưa được thiết lập.
Tất cả mã và tài nguyên liên quan đến bài viết này đều có sẵn tại liên kết này với một bản sao của repo có sẵn trong bản gốc của tôi kho lưu trữ liên quan đến blog. Tôi muốn nhấn mạnh rằng việc thực hiện lại của tôi không hoàn toàn giống với bài báo và khác biệt theo những cách tinh vi mà tôi đã ghi lại trong kho lưu trữ ban đầu. Tôi đã cố gắng sao chép các lời nhắc được sử dụng để gọi GPT-3.5 và Llama-70B dựa trên các chi tiết trong bài viết gốc. Để dịch các bộ dữ liệu từ tiếng Tây Ban Nha sang tiếng Anh, tôi đã tạo lời nhắc của riêng mình để thực hiện việc đó vì không thể truy cập được các chi tiết trong bài báo.
Hãy thực hiện kỹ thuật này để hiểu rõ hơn về cách thức hoạt động của nó. Như đã đề cập, bài viết sử dụng bộ kiểm tra CodiEsp để đánh giá. Bộ dữ liệu này bao gồm các ghi chú y tế bằng tiếng Tây Ban Nha cùng với mã ICD của họ. Mặc dù tập dữ liệu bao gồm phiên bản dịch bằng tiếng Anh nhưng các tác giả lưu ý rằng họ đã dịch các ghi chú y tế bằng tiếng Tây Ban Nha sang tiếng Anh bằng GPT-3.5. Họ cho rằng GPT-3.5 đã mang lại sự cải thiện hiệu suất khiêm tốn so với việc sử dụng phiên bản được dịch trước. Chúng tôi sao chép chức năng này và dịch các ghi chú sang tiếng Anh.
def construct_translation_prompt(medical_note):
"""
Assemble a immediate template for translating spanish medical notes to english.Args:
medical_note (str): The medical case word.
Returns:
str: A structured template prepared for use as enter for a language mannequin.
"""
translation_prompt = """You're an knowledgeable Spanish-to-English translator. You're supplied with a medical word written in Spanish.
You should translate the word into English. You should be certain that you correctly translate the medical and technical phrases from Spanish to English with none errors.
Spanish Medical Word:
{medical_note}"""
return translation_prompt.format(medical_note = medical_note)
Bây giờ chúng ta đã có sẵn kho dữ liệu đánh giá, hãy triển khai logic cốt lõi cho thuật toán tìm kiếm cây. Chúng tôi xác định chức năng trong get_icd_codes, chấp nhận ghi chú y tế để xử lý, tên kiểu máy và cài đặt nhiệt độ. Tên mẫu phải là “gpt-3.5-turbo-0613” cho GPT-3.5 hoặc “meta-llama/Llama-2–70b-chat-hf” cho Trò chuyện Llama-2 70B. Đặc tả này xác định LLM mà thuật toán tìm kiếm cây sẽ gọi trong quá trình xử lý.
Có thể đánh giá GPT-4 bằng cách sử dụng cùng một cơ sở mã bằng cách cung cấp tên mẫu phù hợp, nhưng chúng tôi chọn bỏ qua vì nó khá tốn thời gian.
def get_icd_codes(medical_note, model_name="gpt-3.5-turbo-0613", temperature=0.0):
"""
Identifies related ICD-10 codes for a given medical word by querying a language mannequin.This perform implements the tree-search algorithm for ICD coding described in https://openreview.internet/discussion board?id=mqnR8rGWkn.
Args:
medical_note (str): The medical word for which ICD-10 codes are to be recognized.
model_name (str): The identifier for the language mannequin used within the API (default is 'gpt-3.5-turbo-0613').
Returns:
listing of str: A listing of confirmed ICD-10 codes which might be related to the medical word.
"""
assigned_codes = ()
candidate_codes = (x.title for x in CHAPTER_LIST)
parent_codes = ()
prompt_count = 0
whereas prompt_count < 50:
code_descriptions = {}
for x in candidate_codes:
description, code = get_name_and_description(x, model_name)
code_descriptions(description) = code
immediate = build_zero_shot_prompt(medical_note, listing(code_descriptions.keys()), model_name=model_name)
lm_response = get_response(immediate, model_name, temperature=temperature, max_tokens=500)
predicted_codes = parse_outputs(lm_response, code_descriptions, model_name=model_name)
for code in predicted_codes:
if cm.is_leaf(code("code")):
assigned_codes.append(code("code"))
else:
parent_codes.append(code)
if len(parent_codes) > 0:
parent_code = parent_codes.pop(0)
candidate_codes = cm.get_children(parent_code("code"))
else:
break
prompt_count += 1
return assigned_codes
Tương tự như bài báo, chúng tôi sử dụng đơn giản_icd_10_cm thư viện cung cấp quyền truy cập vào cây ICD-10. Điều này cho phép chúng ta duyệt cây, truy cập mô tả cho từng mã và xác định các mã hợp lệ. Đầu tiên, chúng ta lấy các nút ở cấp độ đầu tiên của cây.
import simple_icd_10_cm as cmdef get_name_and_description(code, model_name):
"""
Retrieve the title and outline of an ICD-10 code.
Args:
code (str): The ICD-10 code.
Returns:
tuple: A tuple containing the formatted description and the title of the code.
"""
full_data = cm.get_full_data(code).cut up("n")
return format_code_descriptions(full_data(3), model_name), full_data(1)
Bên trong vòng lặp, chúng ta thu được các mô tả tương ứng với từng nút. Bây giờ, chúng ta cần xây dựng lời nhắc cho LLM dựa trên ghi chú y tế và mô tả mã. Chúng tôi tạo lời nhắc cho GPT-3.5 và Llama-2 dựa trên thông tin chi tiết được cung cấp trong bài báo.
prompt_template_dict = {"gpt-3.5-turbo-0613" : """(Case word):
{word}
(Instance):
<instance immediate>
Gastro-esophageal reflux illness
Enteropotosis<response>
Gastro-esophageal reflux illness: Sure, Affected person was prescribed omeprazole.
Enteropotosis: No.
(Process):
Take into account every of the next ICD-10 code descriptions and consider if there are any associated mentions within the case word.
Observe the format within the instance exactly.
{code_descriptions}""",
"meta-llama/Llama-2-70b-chat-hf": """(Case word):
{word}
(Instance):
<code descriptions>
* Gastro-esophageal reflux illness
* Enteroptosis
* Acute Nasopharyngitis (Widespread Chilly)
</code descriptions>
<response>
* Gastro-esophageal reflux illness: Sure, Affected person was prescribed omeprazole.
* Enteroptosis: No.
* Acute Nasopharyngitis (Widespread Chilly): No.
</response>
(Process):
Observe the format within the instance response precisely, together with all the description earlier than your (Sure|No) judgement, adopted by a newline.
Take into account every of the next ICD-10 code descriptions and consider if there are any associated mentions within the Case word.
{code_descriptions}"""
}
Bây giờ chúng tôi xây dựng lời nhắc dựa trên ghi chú y tế và mô tả mã. Một lợi thế cho chúng tôi, về mặt nhắc nhở và mã hóa, là chúng tôi có thể sử dụng cùng một openai thư viện để tương tác với cả GPT-3.5 và Llama 2, miễn là Llama-2 được triển khai bằng cách sử dụng hồng ngoại sâucũng hỗ trợ openai định dạng để gửi yêu cầu đến LLM.
def construct_prompt_template(case_note, code_descriptions, model_name):
"""
Assemble a immediate template for evaluating ICD-10 code descriptions in opposition to a given case word.Args:
case_note (str): The medical case word.
code_descriptions (str): The ICD-10 code descriptions formatted as a single string.
Returns:
str: A structured template prepared for use as enter for a language mannequin.
"""
template = prompt_template_dict(model_name)
return template.format(word=case_note, code_descriptions=code_descriptions)
def build_zero_shot_prompt(input_note, descriptions, model_name, system_prompt=""):
"""
Construct a zero-shot classification immediate with system and consumer roles for a language mannequin.
Args:
input_note (str): The enter word or question.
descriptions (listing of str): Listing of ICD-10 code descriptions.
system_prompt (str): Optionally available preliminary system immediate or instruction.
Returns:
listing of dict: A structured listing of dictionaries defining the function and content material of every message.
"""
if model_name == "meta-llama/Llama-2-70b-chat-hf":
code_descriptions = "n".be a part of(("* " + x for x in descriptions))
else:
code_descriptions = "n".be a part of(descriptions)
input_prompt = construct_prompt_template(input_note, code_descriptions, model_name)
return ({"function": "system", "content material": system_prompt}, {"function": "consumer", "content material": input_prompt})
Sau khi đã xây dựng các lời nhắc, bây giờ chúng tôi gọi LLM để nhận được phản hồi:
def get_response(messages, model_name, temperature=0.0, max_tokens=500):
"""
Receive responses from a specified mannequin through the chat-completions API.Args:
messages (listing of dict): Listing of messages structured for API enter.
model_name (str): Identifier for the mannequin to question.
temperature (float): Controls randomness of response, the place 0 is deterministic.
max_tokens (int): Restrict on the variety of tokens within the response.
Returns:
str: The content material of the response message from the mannequin.
"""
response = consumer.chat.completions.create(
mannequin=model_name,
messages=messages,
temperature=temperature,
max_tokens=max_tokens
)
return response.selections(0).message.content material
Tuyệt vời, chúng ta đã thu được kết quả! Từ phản hồi, giờ đây chúng tôi phân tích từng mô tả mã để xác định các nút mà LLM cho là có liên quan để truyền tải tiếp theo, cũng như các nút mà LLM đã từ chối. Chúng tôi chia phản hồi đầu ra thành các dòng mới và chia từng phản hồi để xác định dự đoán LLM cho từng mô tả mã.
def remove_noisy_prefix(textual content):
# Eradicating numbers or letters adopted by a dot and elective area in the beginning of the string
cleaned_text = textual content.exchange("* ", "").strip()
cleaned_text = re.sub(r"^s*w+.s*", "", cleaned_text)
return cleaned_text.strip()def parse_outputs(output, code_description_map, model_name):
"""
Parse mannequin outputs to substantiate ICD-10 codes primarily based on a given description map.
Args:
output (str): The mannequin output containing confirmations.
code_description_map (dict): Mapping of descriptions to ICD-10 codes.
Returns:
listing of dict: A listing of confirmed codes and their descriptions.
"""
confirmed_codes = ()
split_outputs = (x for x in output.cut up("n") if x)
for merchandise in split_outputs:
strive:
code_description, affirmation = merchandise.cut up(":", 1)
if model_name == "meta-llama/Llama-2-70b-chat-hf":
code_description = remove_noisy_prefix(code_description)
if affirmation.decrease().strip().startswith("sure"):
strive:
code = code_description_map(code_description)
confirmed_codes.append({"code": code, "description": code_description})
besides Exception as e:
print(str(e) + " Right here")
proceed
besides:
proceed
return confirmed_codes
Bây giờ chúng ta hãy xem phần còn lại của vòng lặp. Cho đến nay, chúng tôi đã xây dựng lời nhắc, nhận được phản hồi từ LLM và phân tích cú pháp đầu ra để xác định các mã mà LLM cho là có liên quan.
whereas prompt_count < 50:
code_descriptions = {}
for x in candidate_codes:
description, code = get_name_and_description(x, model_name)
code_descriptions(description) = codeimmediate = build_zero_shot_prompt(medical_note, listing(code_descriptions.keys()), model_name=model_name)
lm_response = get_response(immediate, model_name, temperature=temperature, max_tokens=500)
predicted_codes = parse_outputs(lm_response, code_descriptions, model_name=model_name)
for code in predicted_codes:
if cm.is_leaf(code("code")):
assigned_codes.append(code("code"))
else:
parent_codes.append(code)
if len(parent_codes) > 0:
parent_code = parent_codes.pop(0)
candidate_codes = cm.get_children(parent_code("code"))
else:
break
prompt_count += 1
Bây giờ chúng ta lặp qua các mã được dự đoán và kiểm tra xem mỗi mã có phải là một “lá cây” mã, về cơ bản đảm bảo rằng mã này là mã ICD hợp lệ và có thể gán được. Nếu mã dự đoán hợp lệ, chúng tôi coi đó là dự đoán của LLM cho ghi chú y tế đó. Nếu không, chúng tôi thêm nó vào mã gốc và lấy các nút con để tiếp tục duyệt cây ICD. Chúng ta sẽ thoát khỏi vòng lặp nếu không còn mã gốc nào để duyệt tiếp.
Về lý thuyết, số lượng lệnh gọi LLM trên mỗi ghi chú y tế có thể cao tùy ý, dẫn đến độ trễ tăng lên nếu thuật toán đi qua nhiều nút. Các tác giả thực thi tối đa 50 lời nhắc/lời gọi LLM cho mỗi ghi chú y tế để chấm dứt quá trình xử lý, một giới hạn mà chúng tôi cũng áp dụng trong quá trình triển khai của mình.
Kết quả
Bây giờ chúng ta có thể đánh giá kết quả của thuật toán tìm kiếm cây bằng cách sử dụng GPT-3.5 và Llama-2 làm LLM. Chúng tôi đánh giá hiệu suất của thuật toán về độ chính xác, mức thu hồi và điểm F1 ở mức trung bình vi mô và trung bình vĩ mô.
Mặc dù kết quả của việc triển khai gần giống với số điểm được báo cáo trong bài báo, nhưng vẫn có một số khác biệt đáng chú ý.
- Trong quá trình triển khai này, các chỉ số trung bình vi mô của GPT-3.5 vượt quá một chút so với các số liệu được báo cáo, trong khi các chỉ số trung bình vĩ mô thấp hơn một chút so với các giá trị được báo cáo.
- Tương tự, các số liệu trung bình vi mô của Llama-70B khớp hoặc vượt quá một chút so với số liệu được báo cáo, nhưng số liệu trung bình vĩ mô thấp hơn giá trị được báo cáo.
Như đã đề cập trước đó, việc triển khai này khác với bài viết ở một số điểm nhỏ, tất cả đều ảnh hưởng đến hiệu suất cuối cùng. Vui lòng tham khảo kho lưu trữ được liên kết để thảo luận chi tiết hơn về việc triển khai này khác với bài viết gốc như thế nào.
Việc hiểu và thực hiện phương pháp này đối với tôi khá sâu sắc về nhiều mặt. Nó cho phép tôi phát triển sự hiểu biết sâu sắc hơn về điểm mạnh và điểm yếu của Mô hình ngôn ngữ lớn (LLM) trong trường hợp mã hóa lâm sàng. Cụ thể, rõ ràng là khi LLM có quyền truy cập động vào thông tin thích hợp về các mã, họ có thể hiểu bối cảnh lâm sàng một cách hiệu quả và xác định chính xác các mã liên quan.
Sẽ rất thú vị khi khám phá xem liệu việc sử dụng LLM làm tác nhân mã hóa lâm sàng có thể cải thiện hiệu suất hơn nữa hay không. Với sự phong phú của các nguồn kiến thức bên ngoài cho các văn bản y sinh và lâm sàng dưới dạng giấy tờ hoặc biểu đồ tri thức, các tác nhân LLM có thể được sử dụng trong quy trình công việc phân tích tài liệu y tế ở mức độ chi tiết hơn. Họ cũng có thể gọi các công cụ cho phép họ tham khảo kiến thức bên ngoài một cách nhanh chóng nếu cần, để đi đến mã cuối cùng.
Nhìn nhận
Xin chân thành cảm ơn Joseph, tác giả chính của bài viết này, vì đã làm rõ những nghi ngờ của tôi về việc đánh giá phương pháp này!
(1) https://www.who.int/standards/classifications/classification-of-diseases
(2) Johnson, AE, Pollard, TJ, Shen, L., Lehman, LWH, Feng, M., Ghassemi, M., … & Mark, RG (2016). MIMIC-III, cơ sở dữ liệu chăm sóc tích cực có thể truy cập miễn phí Sci. Dữ liệu, 3(1), 1.
(3) Agrawal, M., Hegselmann, S., Lang, H., Kim, Y., & Sontag, D. (2022). Các mô hình ngôn ngữ lớn là công cụ trích xuất thông tin lâm sàng trong vài lần. bản in trước arXiv arXiv:2205.12689.
(4) Chu, H., Li, M., Xiao, Y., Yang, H., & Zhang, R. (2023). Khung nhắc nhở thích ứng ví dụ về hướng dẫn LLM (LEAP) để trích xuất quan hệ lâm sàng. medRxiv : máy chủ in sẵn cho khoa học sức khỏe2023.12.15.23300059. https://doi.org/10.1101/2023.12.15.23300059
(5) Boyle, JS, Kascenas, A., Lok, P., Liakata, M., & O’Neil, AQ (2023, tháng 10). Mã hóa lâm sàng tự động bằng cách sử dụng các mô hình ngôn ngữ lớn có sẵn. TRONG Hội thảo về mô hình sáng tạo sâu cho sức khỏe NeurIPS 2023.
(6) Huang, CW, Tsai, SC, & Chen, YN (2022). PLM-ICD: mã hóa ICD tự động với các mô hình ngôn ngữ được huấn luyện trước. bản in trước arXiv arXiv:2207.05289.
(7) Miranda-Escalada, A., Gonzalez-Agirre, A., Armengol-Estapé, J., & Krallinger, M. (2020). Tổng quan về Mã hóa lâm sàng tự động: Chú thích, hướng dẫn và giải pháp cho các trường hợp lâm sàng không phải tiếng Anh tại CodiEsp Observe của CLEF eHealth 2020. CLEF (Ghi chú làm việc), 2020.
(8) Miranda-Escalada, A., Gonzalez-Agirre, A., & Krallinger, M. (2020). CodiEsp corpus: các trường hợp lâm sàng Tây Ban Nha tiêu chuẩn vàng được mã hóa trong ICD10 (CIE10) — eHealth CLEF2020 (1.4) (Bộ dữ liệu). Zenodo. https://doi.org/10.5281/zenodo.3837305 (CC BY 4.0)
[ad_2]
Source link