Khai thác thông tin tự động đã được phát triển trong nhiều thập kỷ. Mặc dù có nhiều mô hình nhưng khả năng khái quát hóa khó có thể mô tả là thỏa đáng cho đến khi LLM ra đời. Mặc dù chất lượng trích xuất thông tin cuối cùng vẫn cần có sự xem xét của chuyên gia nhưng hiệu quả trích xuất thông tin đã được cải thiện rất nhiều. Bởi vì các phương pháp truyền thống đòi hỏi nhiều thời gian để hoàn thành việc làm sạch, chú thích và huấn luyện dữ liệu, sau đó là trích xuất thực thể, trích xuất thuộc tính thực thể, trích xuất mối quan hệ thực thể, trích xuất sự kiện, liên kết thực thể và phân giải tham chiếu, v.v. Giờ đây với LLM, việc trích xuất thông tin Zero/One/Ít-Shot có thể được triển khai để xây dựng biểu đồ tri thức.
1. Quá trình triển khai ChatIE Về cơ bản, ChatIE biến nhiệm vụ IE không mẫu thành một câu hỏi và trả lời nhiều vòng trong khuôn khổ hai giai đoạn (ChatGPT được sử dụng, cũng có thể được sửa đổi thành ChatGLM2). và giai đoạn thứ hai? Về bản chất thì đó vẫn là thiết kế của Nhắc. Tiếp theo, chúng ta sẽ lấy RE (Trích xuất quan hệ) làm ví dụ, NER (Nhận dạng thực thể được đặt tên) và EE (Trích xuất sự kiện), v.v. Hãy xem một ví dụ như dưới đây:
df_ret = {
'Trung Quốc'
: {
'Album'
: [
'bài hát'
,
'album nhạc'
],
'Ngày thành lập'
: [
'cơ chế'
,
'Ngày'
],
'độ cao'
: [
'Địa điểm'
,
'Con số'
],
'ngôn ngữ chính thức'
: [
'Quốc gia'
,
'ngôn ngữ'
],
'Diện tích sàn'
: [
'cơ chế'
,
'Con số'
],
'Bố'
: [
'nhân vật'
,
'nhân vật'
],
'ca sĩ'
: [
'bài hát'
,
'nhân vật'
],
'nhà sản xuất'
: [
'Tác phẩm điện ảnh và truyền hình'
,
'nhân vật'
],
'giám đốc'
: [
'Tác phẩm điện ảnh và truyền hình'
,
'nhân vật'
],
'thủ đô'
: [
'Quốc gia'
,
'Thành phố'
],
'đóng vai chính'
: [
'Tác phẩm điện ảnh và truyền hình'
,
'nhân vật'
],
'Chủ tịch'
: [
'doanh nghiệp'
,
'nhân vật'
],
'nhà tổ tiên'
: [
'nhân vật'
,
'Địa điểm'
],
'vợ'
: [
'nhân vật'
,
'nhân vật'
],
'Mẹ'
: [
'nhân vật'
,
'nhân vật'
],
'khí hậu'
: [
'khu hành chính'
,
'khí hậu'
],
'khu vực'
: [
'khu hành chính'
,
'Con số'
],
'nhân vật chính'
: [
'tác phẩm văn học'
,
'nhân vật'
],
'mã bưu chính'
: [
'khu hành chính'
,
'Chữ'
],
'viết tắt'
: [
'cơ chế'
,
'Chữ'
],
'Công ty sản xuất'
: [
'Tác phẩm điện ảnh và truyền hình'
,
'doanh nghiệp'
],
'Vốn đăng ký'
: [
'doanh nghiệp'
,
'Con số'
],
'nhà biên kịch'
: [
'Tác phẩm điện ảnh và truyền hình'
,
'nhân vật'
],
'Người sáng lập'
: [
'doanh nghiệp'
,
'nhân vật'
],
'Trường tốt nghiệp'
: [
'nhân vật'
,
'Trường học'
],
'quốc tịch'
: [
'nhân vật'
,
'Quốc gia'
],
'Mã chuyên nghiệp'
: [
'Chủ đề chính'
,
'Chữ'
],
'triều đại'
: [
'nhân vật lịch sử'
,
'Chữ'
],
'tác giả'
: [
'sách tác phẩm'
,
'nhân vật'
],
'lời bài hát'
: [
'bài hát'
,
'nhân vật'
],
'Thành phố'
: [
'điểm tham quan'
,
'Thành phố'
],
'khách mời'
: [
'Chương trình tạp kỹ truyền hình'
,
'nhân vật'
],
'Vị trí trụ sở chính'
: [
'doanh nghiệp'
,
'Địa điểm'
],
'Dân số'
: [
'khu hành chính'
,
'Con số'
],
'Người phát ngôn'
: [
'Doanh nghiệp/Thương hiệu'
,
'nhân vật'
],
'Chuyển thể từ'
: [
'Tác phẩm điện ảnh và truyền hình'
,
'công việc'
],
'hiệu trưởng'
: [
'Trường học'
,
'nhân vật'
],
'chồng'
: [
'nhân vật'
,
'nhân vật'
],
'chủ nhà'
: [
'Chương trình tạp kỹ truyền hình'
,
'nhân vật'
],
'bài hát chủ đề'
: [
'Tác phẩm điện ảnh và truyền hình'
,
'bài hát'
],
'Nhiều năm học tập'
: [
'Chủ đề chính'
,
'Con số'
],
'Thành phần'
: [
'bài hát'
,
'nhân vật'
],
'Con số'
: [
'nhân vật lịch sử'
,
'Chữ'
],
'thời gian chiếu'
: [
'Tác phẩm điện ảnh và truyền hình'
,
'Ngày'
],
'phòng vé'
: [
'Tác phẩm điện ảnh và truyền hình'
,
'Con số'
],
'chơi'
: [
'nhân vật giải trí'
,
'nhân vật'
],
'lồng tiếng'
: [
'nhân vật giải trí'
,
'nhân vật'
],
'chiến thắng'
: [
'nhân vật giải trí'
,
'giải thưởng'
]
}
}
1. Giai đoạn đầu tiên Mẫu cho giai đoạn đầu tiên như sau:
re_s1_p = {
'Trung Quốc'
:
''
'Câu đã cho là: "{}"\n\nDanh sách mối quan hệ đã cho: {}\n\nNhững mối quan hệ nào có thể được bao gồm trong câu này? \nHãy đưa ra mối quan hệ trong danh sách mối quan hệ. \nNếu nó không tồn tại, hãy trả lời: Không\nTrả lời dưới dạng bộ dữ liệu, chẳng hạn như (Quan hệ 1, Quan hệ 2, ...):'
''
,
}
2. Mẫu đoạn thứ hai của giai đoạn thứ hai như sau:
re_s2_p = {
'Trung Quốc'
:
''
'Theo câu đã cho, loại của hai thực thể là ({}, {}) và mối quan hệ giữa chúng là {}. Hãy tìm hai thực thể này. Nếu có nhiều nhóm, hãy liệt kê tất cả chúng theo nhóm. \nNếu nó không tồn tại, hãy trả lời: Không\nTrả lời ở dạng bảng. Bảng có hai cột và tiêu đề là ({}, {}):'
''
,
}
ChatIE giải quyết việc trích xuất thông tin Zero-Shot và xây dựng biểu đồ tri thức thông qua nhiều vòng câu hỏi và câu trả lời ChatGPT hai giai đoạn. Nhưng có một vấn đề: việc trích xuất sai mối quan hệ có thể hoặc chắc chắn sẽ xảy ra. Chúng ta nên làm gì? Một giải pháp cho dự án là giới thiệu nhiều trọng tài. Ví dụ: ChatGPT là trọng tài, Wen Xinyiyan là trọng tài, trích xuất mối quan hệ thực thể BERT là trọng tài và trích xuất mối quan hệ thực thể quy tắc là trọng tài. Ví dụ: theo yêu cầu về độ chính xác của kiến thức, nếu cả bốn trọng tài đều nhất quán, nó sẽ tự động được cập nhật vào cơ sở kiến thức. Nếu không, cần phải xác minh thủ công để xác minh xem việc trích xuất mối quan hệ thực thể có chính xác hay không. Tự động cập nhật biểu đồ tri thức là một hoạt động kỹ thuật yêu cầu chức năng xem xét thủ công để đảm bảo đánh giá cuối cùng khi nhận dạng mô hình không nhất quán. 3. Kết quả kiểm tra Kết quả kiểm tra ChatIE trên các tác vụ khác nhau (RE, NER và EE) và các bộ dữ liệu khác nhau như sau:
2. Sử dụng ChatGLM2 để trích xuất thông tin [1] Phần này thay thế ChatGPT bằng ChatGLM2 cho nhiều vòng hỏi đáp. Trong thực tế trích xuất kiến thức tài chính bằng ChatGLM2, hai vòng đối thoại đã được cài sẵn trong ChatGLM và đạt kết quả tốt. Phần triển khai mã cụ thể, vui lòng tham khảo [9]. Ý tưởng cơ bản là tải mô hình ChatGLM2, sau đó khởi tạo Nhắc (phân loại và trích xuất thông tin) và cuối cùng hoàn tất quá trình suy luận dựa trên đầu vào và mô hình. Hiểu một cách đơn giản thì ý tưởng tổng thể là xây dựng một biểu đồ tri thức thông qua trích xuất thông tin few-shot. (1) Tải mô hình ChatGLM2.
tokenizer = AutoTokenizer.from_pretrained(r
"L:/20230713_HuggingFaceModel/chatglm2-6b"
, trust_remote_code=Đúng)
mô hình = AutoModel.from_pretrained(r
"L:/20230713_HuggingFaceModel/chatglm2-6b"
, trust_remote_code=Đúng).half().cuda()
mô hình = mô hình.eval()
(2) Khởi tạo lời nhắc.
định nghĩa init_prompts():
""
"
Khởi tạo lời nhắc trước để tạo điều kiện thuận lợi cho việc tìm hiểu mô hình theo ngữ cảnh.
"
""
class_list = danh sách(class_examples.keys())
cls_tiền_sử = [
(
nếu
'Bây giờ bạn đã là người phân loại văn bản, bạn cần phân loại các câu tôi đưa cho bạn thành: các danh mục {class_list} theo yêu cầu. '
,
nếu
'ĐƯỢC RỒI. '
)
]
vì
_type, ví dụ
TRONG
class_examples.items():
cls_pre_history.append((f
'{exmpale}" là danh mục nào trong {class_list}? '
, _type))
ie_pre_history = [
(
"现在你需要帮助我完成信息抽取任务,当我给你一个句子时,你需要帮我抽取出句子中三元组,并按照JSON的格式输出,上述句子中没有的信息用['原文中未提及']来表示,多个值之间用','分隔。"
,
'好的,请输入您的句子。'
)
]
vì
_type, example_list
TRONG
ie_examples.items():
vì
example
TRONG
example_list:
sentence = example[
'nội dung'
]
properties_str =
', '
.join(schema[_type])
schema_str_list = f
'“{_type}”({properties_str})'
sentence_with_prompt = IE_PATTERN.format(sentence, schema_str_list)
ie_pre_history.append((
f
'{sentence_with_prompt}'
,
f
"{json.dumps(example['answers'], ensure_ascii=False)}"
))
trở lại
{
'ie_pre_history'
: ie_pre_history,
'cls_pre_history'
: cls_pre_history}
custom_settings数据结构中的内容如下所示: (3)根据输入和模型完成推理过程 。
def inference(
sentences: list,
custom_settings: dict
):
""
"
推理函数。
Args:
sentences (List[str]): 待抽取的句子。
custom_settings (dict): 初始设定,包含人为给定的few-shot example。
"
""
vì
sentence
TRONG
sentences:
with console.status(
"[bold bright_green] Model Inference..."
):
sentence_with_cls_prompt = CLS_PATTERN.format(sentence)
cls_res, _ = model.chat(tokenizer, sentence_with_cls_prompt,
history
=custom_settings[
'cls_pre_history'
])
nếu như
cls_res not
TRONG
schema:
in
(và)
'The type model inferenced {cls_res} which is not in schema dict, exited.'
)
ra
()
properties_str =
', '
.join(schema[cls_res])
schema_str_list = f
'“{cls_res}”({properties_str})'
sentence_with_ie_prompt = IE_PATTERN.format(sentence, schema_str_list)
ie_res, _ = model.chat(tokenizer, sentence_with_ie_prompt,
history
=custom_settings[
'ie_pre_history'
])
ie_res = clean_response(ie_res)
in
(và)
'>>> [bold bright_red]sentence: {sentence}'
)
in
(và)
'>>> [bold bright_green]inference answer: '
)
in
(ie_res)
如果实体关系抽取搞定了,那么自动更新到NebulaGraph就比较简单了,可参考 NebulaGraph实战:2-NebulaGraph手工和Python操作 .
参考文献: [1]利用ChatGLM构建知识图谱:https://discuss.nebula-graph.com.cn/t/topic/13029 [2]ChatGPT+SmartKG 3分钟生成"哈利波特"知识图谱:https://www.msn.cn/zh-cn/news/technology/chatgpt-smartkg-3分钟生成-哈利波特-知识图谱/ar-AA17ykNr [3]ChatIE:https://github.com/cocacola-lab/ChatIE [4]ChatIE:http://124.221.16.143:5000/ [5]financial_chatglm_KG:https://github.com/zhuojianc/financial_chatglm_KG [6]Creating a Knowledge Graph From Video Transcripts With ChatGPT 4:https://neo4j.com/developer-blog/chatgpt-4-knowledge-graph-from-video-transcripts/ [7]GPT4IE:https://github.com/cocacola-lab/GPT4IE [8]GPT4IE:http://124.221.16.143:8080/ [9]https://github.com/ai408/nlp-engineering/blob/main/20230917_NLP工程化公众号文章\NebulaGraph教程\NebulaGraph实战:3-信息抽取构建知识图谱 。
Tôi là một lập trình viên xuất sắc, rất giỏi!