paint-brush
Cải thiện Chatbot bằng cách tạo mã: Xây dựng Chatbot nhận biết ngữ cảnh cho các ấn phẩmtừ tác giả@shanglun
1,178 lượt đọc
1,178 lượt đọc

Cải thiện Chatbot bằng cách tạo mã: Xây dựng Chatbot nhận biết ngữ cảnh cho các ấn phẩm

từ tác giả Shanglun Wang19m2023/11/05
Read on Terminal Reader

dài quá đọc không nổi

Các hệ thống dựa trên GPT đã được sử dụng trong quản lý kiến thức để đạt được hiệu quả lớn nhưng việc triển khai hiện đại bị hạn chế về khả năng tìm kiếm dựa trên siêu dữ liệu. Ngày nay, chúng tôi xây dựng một hệ thống có thể thực hiện cả tìm kiếm ngữ nghĩa và siêu dữ liệu, cải thiện đáng kể khả năng của hệ thống tạo tăng cường truy xuất.
featured image - Cải thiện Chatbot bằng cách tạo mã: Xây dựng Chatbot nhận biết ngữ cảnh cho các ấn phẩm
Shanglun Wang HackerNoon profile picture

Giới thiệu

Kể từ khi ChatGPT thu hút sự chú ý của công chúng vào đầu năm 2023, mối quan tâm đến việc thương mại hóa các ứng dụng dựa trên mô hình ngôn ngữ lớn đã bùng nổ. Một trong những ứng dụng thú vị nhất là việc tạo ra các hệ thống trò chuyện chuyên nghiệp có thể trả lời các truy vấn bằng ngôn ngữ tự nhiên từ cơ sở dữ liệu cơ sở tri thức độc quyền.


Một trong những kỹ thuật phổ biến nhất trong lĩnh vực này là [thế hệ tăng cường truy xuất](https://retrieval aws thế hệ tăng cường) hoặc RAG, sử dụng tính năng nhúng tài liệu để tìm các mục liên quan đến truy vấn của người dùng trước khi sử dụng mô hình ngôn ngữ lớn để tạo một câu trả lời.


Kỹ thuật này cực kỳ mạnh mẽ vì nó cho phép tra cứu cực kỳ rẻ và nhanh chóng, mang lại sự linh hoạt cực cao cho nền tảng kiến thức thay đổi và phát triển theo thời gian cũng như các câu trả lời chính xác và đầy đủ thông tin giúp giảm đáng kể ảo giác và sai lầm.


Để phân tích sâu hơn về hệ thống RAG và cách triển khai hệ thống này, bạn có thể đọc bài viết trước của tôi tại đây .


Dù hệ thống RAG có mạnh mẽ đến đâu thì kiến trúc vẫn có một số hạn chế nghiêm trọng. Chúng tôi đã khám phá một số hạn chế trong bài viết trước của tôi và đề xuất các cách để cải thiện kiến trúc.


Hôm nay, chúng ta sẽ khám phá một hạn chế khác với kiến trúc dựa trên nhúng và đề xuất một cách để khắc phục những hạn chế của kiến trúc.

Báo cáo vấn đề

Hạn chế của RAG dựa trên nhúng

Giả sử chúng ta là một nhà xuất bản muốn tạo giao diện trò chuyện cho phép người đọc và khách hàng đặt câu hỏi.


Tất nhiên, chúng tôi sẽ có thể trả lời những câu hỏi như “Ý kiến của bạn về X là gì?” hoặc “Bạn đã nói gì về Y?” với cách triển khai RAG đơn giản, nhưng kiến trúc RAG thực sự bắt đầu gặp khó khăn khi bạn giải quyết các câu hỏi như “Bạn đã nói gì về X vào năm 2021?” hoặc “Phạm vi bảo hiểm Y của bạn đã thay đổi như thế nào trong khoảng thời gian từ năm 2021 đến năm 2023?”


Một trong những thách thức với RAG dựa trên phần nhúng là các mô hình nhúng thường không thể mã hóa siêu dữ liệu theo cách có hệ thống và do đó, bất kỳ tra cứu nào yêu cầu kiến thức về những thứ như ngày xuất bản hoặc tên tác giả sẽ khiến hệ thống RAG của bạn gặp khá nhiều rắc rối. .


Chúng ta có thể giải quyết vấn đề này bằng cách tận dụng một trong những tính năng thú vị nhất của mô hình ngôn ngữ lớn - tạo mã. Chúng ta sẽ xem xét một ấn phẩm trong thế giới thực, thiết kế thuật toán dựa trên LLM để cải thiện kiến trúc RAG và xây dựng một chatbot dựa trên thuật toán.

Vấn đề kinh doanh

Hôm nay, chúng ta sẽ xem Bản tin CB Insights , một bản tin phổ biến hàng ngày về các công ty khởi nghiệp và công nghệ. Là một cựu nhà phát triển full-stack tại CB Insights, tôi thường mong đợi sự thông minh và hiểu biết độc đáo của người sáng lập vào cuối ngày làm việc.


Hôm nay, chúng tôi sẽ sử dụng kho lưu trữ bản tin CB Insights làm dữ liệu cơ sở để xây dựng một chatbot có thể trả lời các truy vấn ngôn ngữ tự nhiên dựa trên siêu dữ liệu theo cách vượt trội hơn so với việc triển khai RAG dựa trên Nhúng thông thường.


Cụ thể, chúng tôi muốn chatbot có thể trả lời các câu hỏi như:


  • Bạn đã nói gì về Uber vào năm 2020?


  • Vận may của Airbnb đã thay đổi như thế nào trong giai đoạn 2016-2019?


  • Một số công ty khởi nghiệp kỳ lân đáng chú ý từ Ấn Độ trong những năm 2020 là gì?


Chúng ta hãy đi đến đó!

Công nghệ được sử dụng

Để thực hiện nhiệm vụ này, chúng tôi sẽ sử dụng các công nghệ sau:

Python

Nếu bạn đã theo dõi các bài viết khác của tôi thì sẽ không có gì ngạc nhiên khi tôi sẽ sử dụng Python cho hầu hết mã trong bài viết này. Python có khả năng quét web, xử lý dữ liệu và tích hợp OpenAI tuyệt vời, tất cả những tính năng đó chúng tôi sẽ tận dụng cho dự án của mình ngày hôm nay.

SQL

SQL là ngôn ngữ truy vấn cho phép người dùng tương tác với một số cơ sở dữ liệu quan hệ chính, bao gồm SQLite, MySQL, PostgreSQL và SQL Server. Ngôn ngữ là một tập hợp các hướng dẫn tới cơ sở dữ liệu về cách truy xuất, kết hợp và thao tác dữ liệu trước khi trả lại cho người dùng.

Tạo mã LLM

Tạo mã LLM là một kỹ thuật đã nhận được sự chú ý rộng rãi trong vài tháng qua, vì một số mô hình nền tảng bao gồm GPT 3.5, GPT 4 và LLaMa 2 đã chứng minh khả năng tạo mã có độ phức tạp đáng ngạc nhiên để đáp ứng các truy vấn ngôn ngữ tự nhiên.


Các hệ thống được đào tạo và điều chỉnh đặc biệt, chẳng hạn như Copilot của GitHub, có thể viết mã cực kỳ thông minh bằng cách sử dụng các mô hình được thiết kế đặc biệt để tạo mã, nhưng mô hình GPT có mục đích chung được nhắc nhở phù hợp đã có các khả năng đặc biệt khi viết mã.

Nhúng ngữ nghĩa

Nhúng ngữ nghĩa là xương sống của hầu hết các triển khai RAG. Bằng cách sử dụng một loạt các kỹ thuật ngôn ngữ tự nhiên, chúng ta có thể biến văn bản ngôn ngữ tự nhiên thành một vectơ số biểu thị nội dung của văn bản trong một không gian vectơ ngữ nghĩa.


Sau đó, chúng ta có thể sử dụng đại số vectơ để thao tác các phần nhúng này, cho phép chúng ta xác định mối quan hệ giữa hai kho văn bản bằng các phương pháp toán học.

GPT-3.5 và GPT-4

Với 1,7 nghìn tỷ thông số, GPT-4 đơn giản là mô hình ngôn ngữ lớn dựa trên máy biến áp mạnh mẽ nhất hiện có trên thị trường. GPT-4 có khả năng hiểu nội dung văn bản lớn, lý luận phức tạp và tạo ra các câu trả lời dài có sức thuyết phục để đáp lại những lời nhắc khó.


GPT-3.5, người anh em họ nhỏ hơn nhiều của GPT-4, là mô hình hỗ trợ ChatGPT khi nó gây bão trên toàn thế giới. Nó có khả năng xử lý những lời nhắc cực kỳ phức tạp và những gì nó thiếu ở khả năng suy luận thuần túy, nó bù lại bằng tốc độ và tiết kiệm chi phí.


Đối với các tác vụ đơn giản hơn, GPT3.5 tạo ra sự cân bằng giữa hiệu suất và độ chính xác.

Thiết lập chương trình phụ trợ Chatbot

Thiết lập cơ sở dữ liệu

Trước khi xây dựng AI, chúng ta cần lấy dữ liệu. Để thực hiện việc này, chúng tôi có thể sử dụng trang lưu trữ bản tin của CB Insights [ https://www.cbinsights.com/newsletter/ ] có tập hợp các bản tin trước đây.


Để có được tất cả các liên kết, chúng ta có thể sử dụng các yêu cầu và thư viện súp đẹp mắt của Python như sau:

 import requests from bs4 import BeautifulSoup res = requests.get('https://www.cbinsights.com/newsletter/') soup = BeautifulSoup(res.text) article_links = [[i.text, i['href']] for i in soup.find_all('a') if 'campaign-archive' in i['href'] ]


Khi đã có các liên kết, chúng ta có thể vào từng liên kết và tải xuống HTML bài viết. Với khả năng hiểu danh sách của Python, chúng ta có thể thực hiện việc này chỉ trong một dòng:


 article_soups = [BeautifulSoup(requests.get(link[1]).text) for link in article_links]


Việc này sẽ mất một lúc, nhưng cuối cùng, tất cả các liên kết sẽ được loại bỏ.


Bây giờ, chúng ta có thể sử dụng BeautifulSoup để trích xuất các phần có liên quan:


 import re # SEO optimizations cause some articles to appear twice so we dedupe them. # We also remove some multiple newlines and unicode characters. def get_deduped_article_tables(article_table): new_article_tables = [] for i in article_table: text_content = re.sub(r'\n{2,}', '\n', i.replace('\xa0', '').strip()) if text_content not in new_article_tables or text_content == '': new_article_tables.append(text_content) return new_article_tables result_json = {} for soup_meta, soup_art in zip(article_links, article_soups): article_tables = [] cur_article = [] for table in soup_art.find_all('table'): if table.attrs.get('mc:variant') == 'Section_Divider': article_tables.append(get_deduped_article_tables(cur_article)) cur_article = [] else: cur_article.append(table.text) article_tables.append(get_deduped_article_tables(cur_article)) result_json[soup_meta[0]] = article_tables


Hãy thực hiện thêm một số xử lý và biến nó thành DataFrame:


 import pandas as pd result_rows = [] for article_name, article_json in result_json.items(): article_date = article_json[0][1] for idx, tbl in enumerate(article_json[1:]): txt = '\n'.join(tbl).strip() if txt != '': result_rows.append({ 'article_name': article_name, 'article_date': article_date, 'idx': idx, 'text': txt, }) df = apd.DataFrame(result_rows)


Nếu bạn kiểm tra khung dữ liệu, bạn sẽ thấy một cái gì đó như dưới đây:



Trong khi chúng ta có dữ liệu, hãy tạo các phần nhúng cho các bài viết. Với mô hình nhúng ada của OpenAI, việc này khá dễ dàng.


 import openai EMBEDDING_MODEL = "text-embedding-ada-002" openai.api_key = [YOUR KEY] df['embedding'] = df['text'].map(lambda txt: openai.Embedding.create(model=EMBEDDING_MODEL, input=[txt])['data'][0]['embedding'])


Bây giờ chúng ta đã có dữ liệu đang sử dụng cho bài tập này, hãy tải dữ liệu vào cơ sở dữ liệu. Đối với bài tập này, chúng ta sẽ sử dụng SQLite, một hệ thống cơ sở dữ liệu khép kín, nhẹ được đóng gói cùng với Python.


Xin lưu ý rằng trong môi trường sản xuất, bạn có thể muốn sử dụng một phiên bản cơ sở dữ liệu thích hợp như MySQL hoặc PostgreSQL với những chỉnh sửa nhỏ đối với SQL mà chúng tôi đang sử dụng ở đây, nhưng kỹ thuật chung sẽ vẫn giữ nguyên.


Để khởi tạo và tải cơ sở dữ liệu, chỉ cần chạy lệnh sau trong Python. Lưu ý rằng ngoài nội dung bài viết và phần nhúng, chúng tôi cũng lưu một số siêu dữ liệu, cụ thể là ngày xuất bản.


Cũng lưu ý rằng SQLite3, không giống như hầu hết các cơ sở dữ liệu SQL khác, sử dụng hệ thống nhập động, vì vậy chúng tôi không phải chỉ định loại dữ liệu trong truy vấn tạo.


 import sqlite3 import json con = sqlite3.connect("./cbi_article.db") cur = con.cursor() cur.execute("CREATE TABLE article(name, date, idx, content, embedding_json)") con.commit() rows = [] for _, row in df.iterrows(): rows.append([row['article_name'], row['article_date'], row['idx'], row['text'], json.dumps(row['embedding'])]) cur.executemany("INSERT INTO article VALUES (?, ?, ?, ?, ?)", rows) con.commit()


Và hãy thử truy vấn dữ liệu.


 res = cur.execute(""" SELECT name, date, idx FROM article WHERE date >= DATE('now', '-2 years'); """) res.fetchall()


Sẽ mang lại một cái gì đó như:




Nhìn khá tốt!


Xây dựng Trình tạo mã để tra cứu siêu dữ liệu

Bây giờ chúng ta đã tải dữ liệu vào cơ sở dữ liệu SQLite, chúng ta có thể chuyển sang giai đoạn tiếp theo. Hãy nhớ rằng một trong những thách thức khi triển khai RAG chỉ nhúng là thiếu khả năng tra cứu siêu dữ liệu linh hoạt.


Tuy nhiên, giờ đây chúng tôi đã tải siêu dữ liệu vào cơ sở dữ liệu SQL, chúng tôi có thể sử dụng khả năng tạo mã của GPT để thực hiện tra cứu siêu dữ liệu linh hoạt.


Để tạo mã SQL, chúng ta có thể sử dụng một số kỹ thuật nhắc nhở đơn giản.


 response = openai.ChatCompletion.create( model="gpt-4", messages=[ {"role": "system", "content": "You are a SQL query writer that can construct queries based on incoming questions. Answer with only the SQL query."}, {"role": "user", "content": """ Suppose we have the SQLite database table called "article" with the following columns, which contains newsletter articles from a publication: name, date, idx, content, embedding_json Write a question that would retrieve the rows necessary to answer the following user question. Only filter on date. Do not filter on any other column. Make sure the query returns every row in the table by name. Reply only with the SQL query. User question: What did you say about the future of the fintech industry in summer of 2022? """}, ] )


Lưu ý kỹ thuật nhắc nhở sau đây 1) chúng tôi đưa ra lược đồ cơ sở dữ liệu nhưng giữ cho nó đơn giản. 2) Chúng tôi chỉ định các cột trả về. 3) Chúng tôi chỉ định các cột có sẵn để lọc. 4) Chúng tôi chỉ định hương vị SQL. Lời nhắc này sẽ tạo mã SQL giống như mã bên dưới:


 SELECT * FROM article WHERE date BETWEEN '2022-06-01' AND '2022-08-31'


Bây giờ, vì giá trị trả về không mang tính quyết định nên đôi khi bạn sẽ gặp phải những đặc điểm riêng trong mã được tạo của mình. Để xử lý các điều kiện này, chúng ta chỉ cần có một vòng lặp try-catch để thử và tạo lại dữ liệu. Tất nhiên, chúng tôi không muốn thực hiện điều này vô thời hạn, vì vậy nếu chúng tôi không thể tạo SQL thích hợp sau ba lần thử, chúng tôi sẽ thoát và quay lại RAG vanilla.


Chúng ta có thể triển khai bộ lọc như vậy:


 res = [] for i in range(3): response = openai.ChatCompletion.create( model="gpt-4", messages=[ {"role": "system", "content": "You are a SQL query writer that can construct queries based on incoming questions. Answer with only the SQL query."}, {"role": "user", "content": """ Suppose we have the SQLite database table called "article" with the following columns, which contains newsletter articles from a publication: name, date, idx, content, embedding_json Write a question that would retrieve the rows necessary to answer the following user question. Only filter on date. Do not filter on any other column. Make sure the query returns every row in the table by name. Reply only with the SQL query. User question: What did you say about the future of the fintech industry in summer of 2022? """}, ] ) generated_query = response.choices[0].message['content'] is_query_safe = True for no_use_word in {'DELETE', 'UPDATE', 'DROP'}: if no_use_word in generated_query.upper(): is_query_safe = False if not is_query_safe: break # the user input is likely malicious. Try to answer the question with vanilla RAG res = cur.execute(generated_query).fetchall() if len(res) > 0: break if len(res) == 0: # vanilla RAG in memory. Use a vector DB in production please. res = cur.execute('''SELECT * FROM articles''').fetchall()


Đây là một bộ lọc tương đối thô, vì vậy trong các trường hợp sử dụng sản xuất, bạn có thể muốn chạy nhiều kiểm tra hơn về mức độ liên quan và độ chính xác của SQL, nhưng điều này là đủ cho ví dụ của chúng tôi.


Lưu ý nhanh về bảo mật AI , chúng ta nên cẩn thận khi chạy mã được trả về từ AI, đặc biệt nếu dữ liệu đầu vào của người dùng được sử dụng như một phần của lời nhắc.


Nếu chúng tôi không làm sạch đầu ra, chúng tôi sẽ dễ bị tấn công bằng kỹ thuật nhắc nhở trong đó người dùng cố gắng điều khiển AI để tạo ra các câu lệnh cập nhật hoặc xóa.


Do đó, chúng ta phải luôn kiểm tra để đảm bảo đầu ra như mong đợi trước khi chạy mã trên máy tính của mình.


Chạy đoạn mã sau để xem kết quả được truy xuất:


 df = pd.DataFrame([{c[0]: v for c, v in zip(cur.description, row)} for row in res])


Và bây giờ, bạn sẽ thấy kết quả sau:



Chạy RAG tiêu chuẩn với kết quả

Bây giờ chúng ta đã có kết quả tra cứu siêu dữ liệu, phần còn lại rất đơn giản. Chúng tôi tính toán độ tương tự cosin cho tất cả các kết quả được truy xuất như sau:


 from openai.embeddings_utils import cosine_similarity q_embed = openai.Embedding.create(model=EMBEDDING_MODEL, input=[user_question])['data'][0]['embedding'] df['cosine_similarity'] = df['embedding_json'].map(lambda js: cosine_similarity(json.loads(js), q_embed))


Và bây giờ, chúng tôi có thể lấy 10 bản tin hàng đầu và sử dụng kỹ thuật nhanh chóng để trả lời câu hỏi. Chúng tôi chọn 10 ở đây vì mỗi đoạn trích bản tin tương đối ngắn.


Nếu bạn đang làm việc với các bài viết dài hơn, bạn sẽ muốn sử dụng ít bài viết hơn hoặc sử dụng kỹ thuật được đề cập trong phần thưởng.


 answer_prompt = ''' Consider the following newsletter excerpts from the following dates: ''' for _, row in df.sort_values('cosine_similarity', ascending=False).iloc[:10].iterrows(): answer_prompt += """ ======= Date: %s ==== %s ===================== """ % (row['date'], row['content']) answer_prompt += """ Answer the following question: %s """ % user_question response = openai.ChatCompletion.create( model="gpt-4", messages=[ {"role": "system", "content": "You are a tech analyst that can summarize the content of newsletters"}, {"role": "user", "content": answer_prompt}, ] )


Điều này sẽ cho bạn một kết quả tương tự như sau:


Tương lai của Fintech đã được thảo luận trong nhiều bản tin khác nhau vào mùa hè năm 2022. Fintech có sự suy giảm đáng chú ý khi nguồn vốn quý 2 năm 22 giảm mạnh về mức năm 2020, sau mức cao vào năm 2021. Báo cáo quý 2 năm 22 nhấn mạnh sự suy giảm trong đầu tư vào fintech toàn cầu .


Tuy nhiên, tương lai của fintech có vẻ đầy hứa hẹn khi có sự thay đổi đáng kể đối với các công ty khởi nghiệp ở giai đoạn đầu, đặc biệt là trong lĩnh vực thanh toán. Đầu tư toàn cầu vào lĩnh vực thanh toán đã giảm 43% từ quý 1 năm 22 xuống còn 5,1 tỷ USD trong quý 2 năm 22, do nguồn vốn trở lại bình thường sau mức đỉnh năm 2021.


Những người mới tham gia vào lĩnh vực này đã thu hút tỷ lệ giao dịch cao hơn (63%) tính đến năm 2022, đánh dấu sự quan tâm của nhà đầu tư đối với các công ty khởi nghiệp. Cũng có báo cáo cho biết Fintech đang gây ra sự cạnh tranh ngày càng tăng đối với các ngân hàng bán lẻ, buộc họ phải ưu tiên số hóa các dịch vụ cốt lõi.


Ngành ngân hàng đã phản ứng bằng cách tập trung vào nâng cao trải nghiệm của khách hàng, đặc biệt là Mobile Banking, sử dụng các công nghệ như chatbot và nền tảng phân tích khách hàng. Tất cả những điều này cho thấy một ngành FinTech sôi động và cạnh tranh đang chờ đợi phía trước.


Đó là khá tốt! Nếu bạn kiểm tra tính xác thực của câu trả lời bằng cách nhìn vào phần gợi ý trả lời, bạn sẽ nhận thấy rằng tất cả số liệu thống kê đều đến từ tài liệu nguồn. Bạn cũng sẽ nhận thấy rằng có một số định dạng đặc trưng trong tài liệu nguồn mà GPT4 có thể bỏ qua. Điều này cho thấy tính linh hoạt của LLM trong hệ thống tóm tắt dữ liệu.

Phần thưởng: Tóm tắt Middleware

Một trong những vấn đề bạn có thể gặp phải trong quá trình này là khi kho văn bản cực lớn thì dấu nhắc cuối cùng có thể rất lớn. Việc này có thể tốn kém nếu bạn đang sử dụng GPT-4 nhưng lời nhắc quá dài cũng có khả năng gây nhầm lẫn cho mô hình.


Để giải quyết vấn đề này, chúng tôi có thể xử lý trước từng bài viết bằng GPT-3.5, nén lời nhắc cuối cùng mà chúng tôi gửi tới GPT-4 ở bước cuối cùng.


 summarization_prompt = ''' Summarize the following passage and extract only portions that are relevant to answering the user question. Passage: ======= %s ======= User Questions: %s ''' (row['content'], user_question) response = openai.ChatCompletion.create( model="gpt-3.5-turbo", messages=[ {"role": "system", "content": "You are a summarizer of tech industry reports"}, {"role": "user", "content": summarization_prompt}, ] )


Sau đó, chúng tôi có thể đưa các bản tóm tắt vào dấu nhắc, tiết kiệm đáng kể so với việc đưa bài viết thuần túy vào dấu nhắc cuối cùng.

Xây dựng giao diện người dùng đơn giản

Bây giờ chúng ta đã viết xong mã Python, hãy đóng gói mã này dưới dạng một ứng dụng web đơn giản.

API phụ trợ

Việc đóng gói mã dưới dạng API phụ trợ bằng Flask tương đối đơn giản. Chỉ cần tạo một hàm và liên kết nó với Flask như sau:


 import requests from bs4 import BeautifulSoup import re import pandas as pd import sqlite3 import json import openai from openai.embeddings_utils import cosine_similarity from flask import Flask, request, jsonify from flask_cors import CORS app = Flask(__name__) CORS(app) EMBEDDING_MODEL = "text-embedding-ada-002" openai.api_key = [Your OpenAI Key] db_location = [Location of your SQLite DB] def process_user_query(user_question): con = sqlite3.connect(db_location) cur = con.cursor() user_question = 'What did you say about the future of the fintech industry in summer of 2022?' res = [] for i in range(3): response = openai.ChatCompletion.create( model="gpt-4", messages=[ {"role": "system", "content": "You are a SQL query writer that can construct queries based on incoming questions. Answer with only the SQL query."}, {"role": "user", "content": """ Suppose we have the SQLite database table called "article" with the following columns, which contains newsletter articles from a publication: name, date, idx, content, embedding_json Write a question that would retrieve the rows necessary to answer the following user question. Only filter on date. Do not filter on any other column. Make sure the query returns every row in the table by name. Reply only with the SQL query. User question: What did you say about the future of the fintech industry in summer of 2022? """}, ] ) generated_query = response.choices[0].message['content'] is_query_safe = True for no_use_word in {'DELETE', 'UPDATE', 'DROP'}: if no_use_word in generated_query.upper(): is_query_safe = False if not is_query_safe: break # the user input is likely malicious. Try to answer the question with vanilla RAG res = cur.execute(generated_query).fetchall() if len(res) > 0: break if len(res) == 0: # vanilla RAG in memory. Use a vector DB in production please. res = cur.execute('''SELECT * FROM articles''').fetchall() df = pd.DataFrame([{c[0]: v for c, v in zip(cur.description, row)} for row in res]) q_embed = openai.Embedding.create(model=EMBEDDING_MODEL, input=[user_question])['data'][0]['embedding'] df['cosine_similarity'] = df['embedding_json'].map(lambda js: cosine_similarity(json.loads(js), q_embed)) answer_prompt = ''' Consider the following newsletter excerpts from the following dates: ''' for _, row in df.sort_values('cosine_similarity', ascending=False).iloc[:10].iterrows(): answer_prompt += """ ======= Date: %s ==== %s ===================== """ % (row['date'], row['content']) answer_prompt += """ Answer the following question: %s """ % user_question response = openai.ChatCompletion.create( model="gpt-4", messages=[ {"role": "system", "content": "You are a tech analyst that can summarize the content of newsletters"}, {"role": "user", "content": answer_prompt}, ] ) return response.choices[0].message['content'] @app.route('/process_user_question', methods=["POST"]) def process_user_question(): return jsonify({ 'status': 'success', 'result': process_user_query(request.json['user_question']) }) app.run()

Và đó thực sự là tất cả những gì chúng ta cần làm cho phần phụ trợ!

Mã giao diện người dùng

Bởi vì chúng tôi chỉ có một điểm cuối và không cần nhiều trạng thái trong ứng dụng của mình nên mã giao diện người dùng sẽ khá đơn giản. Hãy nhớ trong bài viết trước, chúng ta đã thiết lập một ứng dụng React với tính năng định tuyến cho phép chúng ta kết xuất các thành phần theo các tuyến cụ thể.


Chỉ cần làm theo hướng dẫn trong bài viết đó để thiết lập dự án React.JS và thêm thành phần sau vào lộ trình bạn chọn:


 import React, {useState, useEffect} from 'react'; import axios from 'axios'; const HNArticle = () => { const [result, setResult] = useState(''); const [message, setMessage] = useState(''); const [question, setQuestion] = useState(''); const askQuestion = () => { axios.post("http://127.0.0.1:5000/process_user_question", {user_question: question}) .then(r => r.data) .then(d => { console.log(d); setResult(d.result); }); } return <div className="row" style={{marginTop: '15px'}}> <div className="col-md-12" style={{marginBottom: '15px'}}> <center> <h5>Hackernoon CB Insights Demo</h5> </center> </div> <div className="col-md-10 offset-md-1 col-sm-12 col-lg-8 offset-lg-2" style={{marginBottom: '15px'}}> <ul className="list-group"> <li className="list-group-item"> <h6>Your Question</h6> <p><input className="form-control" placeholder="Question" value={question} onChange={e => setQuestion(e.target.value)} /></p> <p>{message}</p> <p> <button className="btn btn-primary" onClick={askQuestion}>Ask</button> </p> </li> {result? <li className="list-group-item"> <h6>Response</h6> {result.split("\n").map((p, i) => <p key={i}>{p}</p>)} </li>: ''} </ul> </div> </div>; } export default HNArticle;


Chạy mã và bạn sẽ thấy giao diện như thế này:




Đặt một câu hỏi và sau một lúc, bạn sẽ thấy kết quả:


Và Voila! Chúng tôi đã xây dựng thành công một chatbot với khả năng truy vấn nâng cao ngoài hệ thống RAG thông thường!

Phần kết luận

Trong bài viết hôm nay, chúng tôi đã xây dựng một chatbot với khả năng tạo mã mạnh mẽ. Đây là một ví dụ về lớp ứng dụng LLM mới hiện đang được nhiều nhà tiên phong về AI xây dựng, có thể tận dụng dữ liệu, ngôn ngữ lập trình và khả năng hiểu ngôn ngữ tự nhiên để xây dựng các hệ thống AI tổng quát với bí quyết chuyên môn.


Các hệ thống chuyên biệt này là chìa khóa để mở ra khả năng tồn tại về mặt thương mại cho các ứng dụng LLM đang tìm cách cung cấp giá trị vượt xa những gì có sẵn trực tiếp từ các nhà cung cấp nền tảng như OpenAI và Anthropic.


Tạo mã chỉ là một trong những kỹ thuật được thực hiện nhờ thế hệ mô hình ngôn ngữ lớn có sẵn trên thị trường gần đây.


Nếu bạn có ý tưởng về cách thương mại hóa LLM hoặc muốn trò chuyện về AI, vui lòng liên hệ trên LinkedIn hoặc GitHub . Tôi đã có nhiều cuộc trò chuyện sâu sắc với độc giả trong suốt năm qua và mong muốn có thêm nhiều cuộc trò chuyện nữa!