From 1cb457d32ccabf00adf69f9c91d4a3928d50c776 Mon Sep 17 00:00:00 2001 From: "tolson.wang" Date: Mon, 25 Mar 2024 00:53:47 +0800 Subject: [PATCH 1/7] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E4=BD=9C=E4=B8=9A=201?= =?UTF-8?q?=E3=80=81=E4=BB=A3=E7=A0=81=E8=B0=83=E8=AF=95=EF=BC=8C=E4=BC=98?= =?UTF-8?q?=E5=8C=96prompt=202=E3=80=81=E5=9F=BA=E4=BA=8Eflask=EF=BC=8C?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0GUI=E5=92=8CAPI=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ai_translator/book/content.py | 6 +- openai-translator/ai_translator/main.py | 68 ++++++-- .../ai_translator/model/model.py | 10 +- .../ai_translator/model/openai_model.py | 5 +- .../ai_translator/templates/index.html | 164 ++++++++++++++++++ .../ai_translator/translator/pdf_parser.py | 6 +- .../translator/pdf_translator.py | 40 ++++- .../ai_translator/translator/writer.py | 12 +- 8 files changed, 276 insertions(+), 35 deletions(-) create mode 100644 openai-translator/ai_translator/templates/index.html diff --git a/openai-translator/ai_translator/book/content.py b/openai-translator/ai_translator/book/content.py index 623c7b2d..00ce6131 100644 --- a/openai-translator/ai_translator/book/content.py +++ b/openai-translator/ai_translator/book/content.py @@ -1,7 +1,8 @@ import pandas as pd +import re from enum import Enum, auto from PIL import Image as PILImage -from utils import LOG +from ai_translator.utils import LOG class ContentType(Enum): TEXT = auto() @@ -48,7 +49,8 @@ def set_translation(self, translation, status): LOG.debug(translation) # Convert the string to a list of lists - table_data = [row.strip().split() for row in translation.strip().split('\n')] + translation = re.sub(r'\[|\]', '', translation) + table_data = [row.strip().split(',') for row in translation.strip().split('\n')] LOG.debug(table_data) # Create a DataFrame from the table_data translated_df = pd.DataFrame(table_data[1:], columns=table_data[0]) diff --git a/openai-translator/ai_translator/main.py b/openai-translator/ai_translator/main.py index 6b8e0c9b..72d7515c 100644 --- a/openai-translator/ai_translator/main.py +++ b/openai-translator/ai_translator/main.py @@ -3,25 +3,65 @@ sys.path.append(os.path.dirname(os.path.abspath(__file__))) -from utils import ArgumentParser, ConfigLoader, LOG from model import GLMModel, OpenAIModel from translator import PDFTranslator +from flask import Flask, render_template, request, jsonify, flash -if __name__ == "__main__": - argument_parser = ArgumentParser() - args = argument_parser.parse_arguments() - config_loader = ConfigLoader(args.config) +app = Flask(__name__) +app.secret_key = b'_5#y2L"F4Q8z\n\xec]/' +app.config['UPLOAD_FOLDER'] = 'uploads' + +ALLOWED_EXTENSIONS = {'pdf'} + +# Function to check if file extension is allowed +def allowed_file(filename): + return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS + +# 定义首页路由,用于显示翻译页面 +@app.route('/', methods=['GET']) +def home(): + return render_template('index.html') - config = config_loader.load_config() +# 定义首页路由 +@app.route('/translate', methods=['POST']) +def translate(): + # Check if POST request has file part + if 'file' not in request.files: + flash('No file part') + #return render_template('index.html') + return jsonify({"error": "No file part"}) - model_name = args.openai_model if args.openai_model else config['OpenAIModel']['model'] - api_key = args.openai_api_key if args.openai_api_key else config['OpenAIModel']['api_key'] - model = OpenAIModel(model=model_name, api_key=api_key) + file = request.files['file'] + # Check if file is uploaded + if file.filename == '': + flash('No selected file') + #return render_template('index.html') + return jsonify({"error": "No selected file"}) - pdf_file_path = args.book if args.book else config['common']['book'] - file_format = args.file_format if args.file_format else config['common']['file_format'] + # Check if file type is allowed + if file and allowed_file(file.filename): + source_lang = request.form.get('source_lang') + target_lang = request.form.get('target_lang') + target_format = request.form.get('target_format') + file_path = os.path.join(app.config['UPLOAD_FOLDER'], file.filename) + file.save(file_path) - # 实例化 PDFTranslator 类,并调用 translate_pdf() 方法 - translator = PDFTranslator(model) - translator.translate_pdf(pdf_file_path, file_format) + model = OpenAIModel(model='OpenAIModel', api_key=os.getenv("OPENAI_API_KEY")) + pdf_file_path = file_path + file_format = target_format + # 实例化 PDFTranslator 类,并调用 translate_pdf() 方法 + translator = PDFTranslator(model) + output_file_path = translator.translate_pdf(pdf_file_path, file_format) + + # flash('Translation successful. File saved as ' + os.path.dirname(os.path.abspath(__file__)) + '/' + output_file_path) + # return render_template('index.html') + + result = { + "message": "Translation successful", + "output_file_path": os.path.join(app.config['UPLOAD_FOLDER'], output_file_path) + } + return jsonify(result) + +if __name__ == "__main__": + app.run(host='0.0.0.0', debug=True, port=5000) diff --git a/openai-translator/ai_translator/model/model.py b/openai-translator/ai_translator/model/model.py index 80f5db6e..881f8d89 100644 --- a/openai-translator/ai_translator/model/model.py +++ b/openai-translator/ai_translator/model/model.py @@ -1,11 +1,15 @@ -from book import ContentType +from ai_translator.book import ContentType + class Model: def make_text_prompt(self, text: str, target_language: str) -> str: - return f"翻译为{target_language}:{text}" + return f"翻译为{target_language},保留原文间距(空格,分隔符,换行符):{text}" def make_table_prompt(self, table: str, target_language: str) -> str: - return f"翻译为{target_language},保持间距(空格,分隔符),以表格形式返回:\n{table}" + return f"表格形式:" + \ + "[Fruit, Color, Price (USD)]\n" + \ + "[Apple, Red, 1.20]\n" + \ + f"请将下列文字翻译为{target_language},保持间距(空格,分隔符),不同行要换行,并以上述表格形式返回:{table}" def translate_prompt(self, content, target_language: str) -> str: if content.content_type == ContentType.TEXT: diff --git a/openai-translator/ai_translator/model/openai_model.py b/openai-translator/ai_translator/model/openai_model.py index 3d2d4bef..d5538175 100644 --- a/openai-translator/ai_translator/model/openai_model.py +++ b/openai-translator/ai_translator/model/openai_model.py @@ -4,11 +4,12 @@ import os import openai -from model import Model -from utils import LOG +from ai_translator.model import Model +from ai_translator.utils import LOG from openai import OpenAI class OpenAIModel(Model): + def __init__(self, model: str, api_key: str): self.model = model self.client = OpenAI(api_key=os.getenv("OPENAI_API_KEY")) diff --git a/openai-translator/ai_translator/templates/index.html b/openai-translator/ai_translator/templates/index.html new file mode 100644 index 00000000..392824fb --- /dev/null +++ b/openai-translator/ai_translator/templates/index.html @@ -0,0 +1,164 @@ + + + + + + PDF Translator + + + + + + + + +

PDF Translator

+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+ +
+ + + + + + diff --git a/openai-translator/ai_translator/translator/pdf_parser.py b/openai-translator/ai_translator/translator/pdf_parser.py index 6f2f9bc3..01c4d51e 100644 --- a/openai-translator/ai_translator/translator/pdf_parser.py +++ b/openai-translator/ai_translator/translator/pdf_parser.py @@ -1,8 +1,8 @@ import pdfplumber from typing import Optional -from book import Book, Page, Content, ContentType, TableContent -from translator.exceptions import PageOutOfRangeException -from utils import LOG +from ai_translator.book import Book, Page, Content, ContentType, TableContent +from ai_translator.translator.exceptions import PageOutOfRangeException +from ai_translator.utils import LOG class PDFParser: diff --git a/openai-translator/ai_translator/translator/pdf_translator.py b/openai-translator/ai_translator/translator/pdf_translator.py index ab0b40b4..78c75954 100644 --- a/openai-translator/ai_translator/translator/pdf_translator.py +++ b/openai-translator/ai_translator/translator/pdf_translator.py @@ -1,8 +1,11 @@ from typing import Optional -from model import Model -from translator.pdf_parser import PDFParser -from translator.writer import Writer -from utils import LOG +from ai_translator.model import Model +from ai_translator.translator.pdf_parser import PDFParser +from ai_translator.translator.writer import Writer +from ai_translator.utils import LOG + +from ai_translator.book import ContentType + class PDFTranslator: def __init__(self, model: Model): @@ -17,10 +20,35 @@ def translate_pdf(self, pdf_file_path: str, file_format: str = 'PDF', target_lan for content_idx, content in enumerate(page.contents): prompt = self.model.translate_prompt(content, target_language) LOG.debug(prompt) - translation, status = self.model.make_request(prompt) + + # 调试用,不调用API + translation = content.original + status = True + if content.content_type == ContentType.TEXT: + translation = PDFTranslator.TEXT_TRASACTION_RESULT + elif content.content_type == ContentType.TABLE: + translation = PDFTranslator.TABLE_TRASACTION_RESULT + + # translation, status = self.model.make_request(prompt) LOG.info(translation) # Update the content in self.book.pages directly self.book.pages[page_idx].contents[content_idx].set_translation(translation, status) - self.writer.save_translated_book(self.book, output_file_path, file_format) + return self.writer.save_translated_book(self.book, output_file_path, file_format) + + TABLE_TRASACTION_RESULT = "[水果, 颜色, 价格(美元)]\n" + \ + "[苹果, 红色, 1.20]\n" + \ + "[香蕉, 黄色, 0.50]\n" + \ + "[橙子, 橙色, 0.80]\n" + \ + "[草莓, 红色, 2.50]\n" + \ + "[蓝莓, 蓝色, 3.00]\n" + \ + "[奇异果, 绿色, 1.00]\n" + \ + "[芒果, 橙色, 1.50]\n" + \ + "[葡萄, 紫色, 2.00]" + TEXT_TRASACTION_RESULT = "测试数据\n" + \ + "这个数据集包含了由OpenAI的AI语言模型ChatGPT提供的两个测试样本。\n" + \ + "这些样本包括一个Markdown表格和一段英文文本,可以用来测试支持文本和表格格式的英译中翻译软件。\n" + \ + "文本测试\n" + \ + "敏捷的棕色狐狸跳过懒惰的狗。这个句子包含了英文字母表中的每个字母至少一次。句子是常用来测试字体、键盘和其他与文本相关的工具的。除了英语,还有许多其他语言中的句子。由于语言的独特特性,有些句子更难构建。\n" + \ + "表测试\n" \ No newline at end of file diff --git a/openai-translator/ai_translator/translator/writer.py b/openai-translator/ai_translator/translator/writer.py index 12b37e75..87a63c42 100644 --- a/openai-translator/ai_translator/translator/writer.py +++ b/openai-translator/ai_translator/translator/writer.py @@ -7,8 +7,8 @@ SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle, PageBreak ) -from book import Book, ContentType -from utils import LOG +from ai_translator.book import Book, ContentType +from ai_translator.utils import LOG class Writer: def __init__(self): @@ -16,9 +16,9 @@ def __init__(self): def save_translated_book(self, book: Book, output_file_path: str = None, file_format: str = "PDF"): if file_format.lower() == "pdf": - self._save_translated_book_pdf(book, output_file_path) + return self._save_translated_book_pdf(book, output_file_path) elif file_format.lower() == "markdown": - self._save_translated_book_markdown(book, output_file_path) + return self._save_translated_book_markdown(book, output_file_path) else: raise ValueError(f"Unsupported file format: {file_format}") @@ -75,6 +75,7 @@ def _save_translated_book_pdf(self, book: Book, output_file_path: str = None): # Save the translated book as a new PDF file doc.build(story) LOG.info(f"翻译完成: {output_file_path}") + return output_file_path def _save_translated_book_markdown(self, book: Book, output_file_path: str = None): if output_file_path is None: @@ -105,4 +106,5 @@ def _save_translated_book_markdown(self, book: Book, output_file_path: str = Non if page != book.pages[-1]: output_file.write('---\n\n') - LOG.info(f"翻译完成: {output_file_path}") \ No newline at end of file + LOG.info(f"翻译完成: {output_file_path}") + return output_file_path \ No newline at end of file From 9463fbcf0324216775a834d23fa3f760bb8348ec Mon Sep 17 00:00:00 2001 From: "tolson.wang" Date: Mon, 25 Mar 2024 01:16:18 +0800 Subject: [PATCH 2/7] =?UTF-8?q?1=E3=80=81=E6=B7=BB=E5=8A=A0ignore=E6=96=87?= =?UTF-8?q?=E4=BB=B6=202=E3=80=81=E4=BC=98=E5=8C=96=E8=BF=94=E5=9B=9E?= =?UTF-8?q?=E7=BB=93=E6=9E=9C=E6=8F=90=E7=A4=BA=E6=B6=88=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 7 ++++++- openai-translator/ai_translator/main.py | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 9334f368..39e5a1ef 100644 --- a/.gitignore +++ b/.gitignore @@ -166,4 +166,9 @@ openai_api/data/fine_food_reviews_with_embeddings_1k_2146.csv *.bin langchain/openai-translator/flagged/* -langchain/openai-translator/flask_temps/* \ No newline at end of file +langchain/openai-translator/flask_temps/* + +# idea +.idea/ + +uploads/ \ No newline at end of file diff --git a/openai-translator/ai_translator/main.py b/openai-translator/ai_translator/main.py index 72d7515c..b38dd0fc 100644 --- a/openai-translator/ai_translator/main.py +++ b/openai-translator/ai_translator/main.py @@ -59,7 +59,7 @@ def translate(): result = { "message": "Translation successful", - "output_file_path": os.path.join(app.config['UPLOAD_FOLDER'], output_file_path) + "output_file_path": 'File saved as ' + os.path.dirname(os.path.abspath(__file__)) + '/' + output_file_path } return jsonify(result) From fbd10b12972f95de473cc528617063eb4d1105fd Mon Sep 17 00:00:00 2001 From: "tolson.wang" Date: Mon, 25 Mar 2024 01:43:52 +0800 Subject: [PATCH 3/7] =?UTF-8?q?=E5=AE=8C=E6=88=90=E7=89=B9=E6=80=A7?= =?UTF-8?q?=EF=BC=9A=20=E6=B7=BB=E5=8A=A0=E5=AF=B9=E6=97=A5=E8=AF=AD?= =?UTF-8?q?=E3=80=81=E8=8B=B1=E8=AF=AD=E7=9A=84=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- openai-translator/ai_translator/main.py | 8 ++----- .../ai_translator/templates/index.html | 14 +++-------- .../translator/pdf_translator.py | 23 ++++++++++++------- 3 files changed, 20 insertions(+), 25 deletions(-) diff --git a/openai-translator/ai_translator/main.py b/openai-translator/ai_translator/main.py index b38dd0fc..c42f9abb 100644 --- a/openai-translator/ai_translator/main.py +++ b/openai-translator/ai_translator/main.py @@ -41,21 +41,17 @@ def translate(): # Check if file type is allowed if file and allowed_file(file.filename): - source_lang = request.form.get('source_lang') target_lang = request.form.get('target_lang') target_format = request.form.get('target_format') file_path = os.path.join(app.config['UPLOAD_FOLDER'], file.filename) file.save(file_path) - model = OpenAIModel(model='OpenAIModel', api_key=os.getenv("OPENAI_API_KEY")) + model = OpenAIModel(model='gpt-3.5-turbo', api_key=os.getenv("OPENAI_API_KEY")) pdf_file_path = file_path file_format = target_format # 实例化 PDFTranslator 类,并调用 translate_pdf() 方法 translator = PDFTranslator(model) - output_file_path = translator.translate_pdf(pdf_file_path, file_format) - - # flash('Translation successful. File saved as ' + os.path.dirname(os.path.abspath(__file__)) + '/' + output_file_path) - # return render_template('index.html') + output_file_path = translator.translate_pdf(pdf_file_path, file_format, target_lang) result = { "message": "Translation successful", diff --git a/openai-translator/ai_translator/templates/index.html b/openai-translator/ai_translator/templates/index.html index 392824fb..0ce1e632 100644 --- a/openai-translator/ai_translator/templates/index.html +++ b/openai-translator/ai_translator/templates/index.html @@ -85,27 +85,19 @@

PDF Translator

-
- - -
diff --git a/openai-translator/ai_translator/translator/pdf_translator.py b/openai-translator/ai_translator/translator/pdf_translator.py index 78c75954..8f116fc3 100644 --- a/openai-translator/ai_translator/translator/pdf_translator.py +++ b/openai-translator/ai_translator/translator/pdf_translator.py @@ -8,6 +8,12 @@ class PDFTranslator: + language = { + "English": "英文", + "中文": "中文", + "にほんご": "日语" + } + def __init__(self, model: Model): self.model = model self.pdf_parser = PDFParser() @@ -15,6 +21,7 @@ def __init__(self, model: Model): def translate_pdf(self, pdf_file_path: str, file_format: str = 'PDF', target_language: str = '中文', output_file_path: str = None, pages: Optional[int] = None): self.book = self.pdf_parser.parse_pdf(pdf_file_path, pages) + target_language = self.language.get(target_language) for page_idx, page in enumerate(self.book.pages): for content_idx, content in enumerate(page.contents): @@ -22,14 +29,14 @@ def translate_pdf(self, pdf_file_path: str, file_format: str = 'PDF', target_lan LOG.debug(prompt) # 调试用,不调用API - translation = content.original - status = True - if content.content_type == ContentType.TEXT: - translation = PDFTranslator.TEXT_TRASACTION_RESULT - elif content.content_type == ContentType.TABLE: - translation = PDFTranslator.TABLE_TRASACTION_RESULT - - # translation, status = self.model.make_request(prompt) + # translation = content.original + # status = True + # if content.content_type == ContentType.TEXT: + # translation = PDFTranslator.TEXT_TRASACTION_RESULT + # elif content.content_type == ContentType.TABLE: + # translation = PDFTranslator.TABLE_TRASACTION_RESULT + + translation, status = self.model.make_request(prompt) LOG.info(translation) # Update the content in self.book.pages directly From b4d353eabcaa01d4612dd8031b3b476c8c4c5cc6 Mon Sep 17 00:00:00 2001 From: "tolson.wang" Date: Mon, 22 Apr 2024 20:00:25 +0800 Subject: [PATCH 4/7] =?UTF-8?q?=E4=BD=BF=E7=94=A8langchain=E6=A1=86?= =?UTF-8?q?=E6=9E=B6=E6=94=B9=E5=86=99ai=5Ftranslator?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ai_translator/chain/translator_chain.py | 49 +++++++++++++++++ openai-translator/ai_translator/main.py | 4 +- .../translator/pdf_translator.py | 55 +++++++++++++------ 3 files changed, 90 insertions(+), 18 deletions(-) create mode 100644 openai-translator/ai_translator/chain/translator_chain.py diff --git a/openai-translator/ai_translator/chain/translator_chain.py b/openai-translator/ai_translator/chain/translator_chain.py new file mode 100644 index 00000000..32e6f594 --- /dev/null +++ b/openai-translator/ai_translator/chain/translator_chain.py @@ -0,0 +1,49 @@ +import os +from ai_translator.utils import LOG + +# 导入 Chat Model 即将使用的 Prompt Templates +from langchain.prompts.chat import ( + ChatPromptTemplate, + SystemMessagePromptTemplate, + AIMessagePromptTemplate, + HumanMessagePromptTemplate, +) +from langchain.chat_models import ChatOpenAI +from langchain.chains import LLMChain + + +class TranslatorChain: + def __init__(self, model_name: str = "gpt-3.5-turbo", verbose: bool = True): + system_template = ( + """你是一个翻译专家,擅长各国语言。 \n + 请将我发送给你的文字内容,翻译成{target_language}。 \n + 注意:\n + 1、保留原文间距(空格,分隔符,换行符)\n + 2、如果原文是表格,请按照下面的表格形式返回(文字内容仍然需要翻译):\n + [Title1, Title2, Title3 ] \n + [context1, context2, context3] \n + """ + ) + system_message_prompt = SystemMessagePromptTemplate.from_template(system_template) + + human_template = "{text}" + human_message_prompt = HumanMessagePromptTemplate.from_template(human_template) + + chat_prompt_template = ChatPromptTemplate.from_messages( + [system_message_prompt, human_message_prompt] + ) + + chat = ChatOpenAI(model_name=model_name, temperature=0, verbose=verbose, + openai_api_key=os.getenv("OPENAI_API_KEY")) + self.chain = LLMChain(llm=chat, prompt=chat_prompt_template) + + def run(self, text: str, target_language: str) -> (str, bool): + result = "" + try: + result = self.chain.run(text=text, target_language=target_language) + except Exception as e: + LOG.error(f"An error occurred: {e}") + return result, False + + return result, True + diff --git a/openai-translator/ai_translator/main.py b/openai-translator/ai_translator/main.py index c42f9abb..16cb00d7 100644 --- a/openai-translator/ai_translator/main.py +++ b/openai-translator/ai_translator/main.py @@ -46,11 +46,11 @@ def translate(): file_path = os.path.join(app.config['UPLOAD_FOLDER'], file.filename) file.save(file_path) - model = OpenAIModel(model='gpt-3.5-turbo', api_key=os.getenv("OPENAI_API_KEY")) + # model = OpenAIModel(model='gpt-3.5-turbo', api_key=os.getenv("OPENAI_API_KEY")) pdf_file_path = file_path file_format = target_format # 实例化 PDFTranslator 类,并调用 translate_pdf() 方法 - translator = PDFTranslator(model) + translator = PDFTranslator('gpt-3.5-turbo') output_file_path = translator.translate_pdf(pdf_file_path, file_format, target_lang) result = { diff --git a/openai-translator/ai_translator/translator/pdf_translator.py b/openai-translator/ai_translator/translator/pdf_translator.py index 8f116fc3..05c4abe9 100644 --- a/openai-translator/ai_translator/translator/pdf_translator.py +++ b/openai-translator/ai_translator/translator/pdf_translator.py @@ -1,4 +1,6 @@ from typing import Optional + +from ai_translator.chain.translator_chain import TranslatorChain from ai_translator.model import Model from ai_translator.translator.pdf_parser import PDFParser from ai_translator.translator.writer import Writer @@ -14,36 +16,57 @@ class PDFTranslator: "にほんご": "日语" } - def __init__(self, model: Model): - self.model = model + def __init__(self, model_name: str): + self.chain = TranslatorChain(model_name) self.pdf_parser = PDFParser() self.writer = Writer() - def translate_pdf(self, pdf_file_path: str, file_format: str = 'PDF', target_language: str = '中文', output_file_path: str = None, pages: Optional[int] = None): + def translate_pdf(self, pdf_file_path: str, file_format: str = 'PDF', target_language: str = '中文', + output_file_path: str = None, pages: Optional[int] = None): self.book = self.pdf_parser.parse_pdf(pdf_file_path, pages) + target_language = self.language.get(target_language) for page_idx, page in enumerate(self.book.pages): for content_idx, content in enumerate(page.contents): - prompt = self.model.translate_prompt(content, target_language) - LOG.debug(prompt) - - # 调试用,不调用API - # translation = content.original - # status = True - # if content.content_type == ContentType.TEXT: - # translation = PDFTranslator.TEXT_TRASACTION_RESULT - # elif content.content_type == ContentType.TABLE: - # translation = PDFTranslator.TABLE_TRASACTION_RESULT - - translation, status = self.model.make_request(prompt) + translation, status = self.chain.run(content.original, target_language) LOG.info(translation) - + # Update the content in self.book.pages directly self.book.pages[page_idx].contents[content_idx].set_translation(translation, status) return self.writer.save_translated_book(self.book, output_file_path, file_format) + # def __init__(self, model: Model): + # self.model = model + # self.pdf_parser = PDFParser() + # self.writer = Writer() + # def translate_pdf(self, pdf_file_path: str, file_format: str = 'PDF', target_language: str = '中文', output_file_path: str = None, pages: Optional[int] = None): + # self.book = self.pdf_parser.parse_pdf(pdf_file_path, pages) + # + # target_language = self.language.get(target_language) + # + # for page_idx, page in enumerate(self.book.pages): + # for content_idx, content in enumerate(page.contents): + # prompt = self.model.translate_prompt(content, target_language) + # LOG.debug(prompt) + # + # # 调试用,不调用API + # # translation = content.original + # # status = True + # # if content.content_type == ContentType.TEXT: + # # translation = PDFTranslator.TEXT_TRASACTION_RESULT + # # elif content.content_type == ContentType.TABLE: + # # translation = PDFTranslator.TABLE_TRASACTION_RESULT + # + # translation, status = self.model.make_request(prompt) + # LOG.info(translation) + # + # # Update the content in self.book.pages directly + # self.book.pages[page_idx].contents[content_idx].set_translation(translation, status) + # + # return self.writer.save_translated_book(self.book, output_file_path, file_format) + TABLE_TRASACTION_RESULT = "[水果, 颜色, 价格(美元)]\n" + \ "[苹果, 红色, 1.20]\n" + \ "[香蕉, 黄色, 0.50]\n" + \ From 3e727fcf8f7de2de2bdb390e9cccd4cc6c1dc98f Mon Sep 17 00:00:00 2001 From: "tolson.wang" Date: Mon, 22 Apr 2024 20:03:48 +0800 Subject: [PATCH 5/7] =?UTF-8?q?=E6=8F=90=E4=BA=A4gitignore?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 39e5a1ef..2d0efe5d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,6 @@ +# Ignore files in the tests directory +openai-translator/tests/ + # Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] @@ -171,4 +174,7 @@ langchain/openai-translator/flask_temps/* # idea .idea/ -uploads/ \ No newline at end of file +uploads/ + +#ipynb +langchain/jupyter/* From df039fe53a9399c6fee4ee5b2f91cd6bf3ba35d9 Mon Sep 17 00:00:00 2001 From: "tolson.wang" Date: Mon, 22 Apr 2024 20:39:21 +0800 Subject: [PATCH 6/7] =?UTF-8?q?=E5=AE=8C=E6=88=90=E7=AC=AC=E4=B8=83?= =?UTF-8?q?=E5=91=A8=E4=BD=9C=E4=B8=9A=20=E6=89=A9=E5=B1=95=E9=94=80?= =?UTF-8?q?=E5=94=AE=E6=9C=BA=E5=99=A8=E4=BA=BA=EF=BC=88sales=5Fchatbot?= =?UTF-8?q?=EF=BC=89=E9=A1=B9=E7=9B=AE=EF=BC=8C=E5=BA=94=E7=94=A8=E4=BA=8E?= =?UTF-8?q?=E5=B0=91=E5=84=BF=E7=BC=96=E7=A8=8B=E5=9F=B9=E8=AE=AD=E6=9C=BA?= =?UTF-8?q?=E6=9E=84=E9=94=80=E5=94=AE=E5=9C=BA=E6=99=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sales_chatbot/real_estate_sales_data.txt | 302 +++++++++++++++++- langchain/sales_chatbot/sales_chatbot.py | 16 +- langchain/sales_chatbot/save_QA.py | 22 ++ 3 files changed, 332 insertions(+), 8 deletions(-) create mode 100644 langchain/sales_chatbot/save_QA.py diff --git a/langchain/sales_chatbot/real_estate_sales_data.txt b/langchain/sales_chatbot/real_estate_sales_data.txt index 453fb6a8..5da88509 100644 --- a/langchain/sales_chatbot/real_estate_sales_data.txt +++ b/langchain/sales_chatbot/real_estate_sales_data.txt @@ -276,4 +276,304 @@ 70. [客户问题] 我担心新房会有甲醛。 -[销售回答] 我们使用环保材料建造,并且所有的新房在交付前都会进行甲醛检测。 \ No newline at end of file +[销售回答] 我们使用环保材料建造,并且所有的新房在交付前都会进行甲醛检测。 + +1. [客户问题]:你们的编程课程是如何分级的? + [销售回答]:我们的课程按照难度和学习目标进行分级,确保每位学员都能够在适合自己的水平上学习。 + +2. [客户问题]:你们的老师都有什么背景? + [销售回答]:我们的老师都是经过专业培训和有丰富教学经验的编程专家。 + +3. [客户问题]:我孩子没有编程基础,能学吗? + [销售回答]:当然可以,我们的课程适合各种水平的学员,从零开始学习编程也没有问题。 + +4. [客户问题]:课程费用是多少? + [销售回答]:我们有不同的课程和价格选项,你可以根据孩子的需求和预算选择合适的课程。 + +5. [客户问题]:你们提供试听课程吗? + [销售回答]:是的,我们提供免费的试听课程,让你和孩子可以先了解我们的教学内容和风格。 + +6. [客户问题]:孩子多大可以开始学习编程? + [销售回答]:我们的编程课程适合7岁以上的孩子,不同年龄段有不同的课程设置。 + +7. [客户问题]:课程是线上的还是线下的? + [销售回答]:我们提供线上和线下两种教学模式,供家长和孩子选择。 + +8. [客户问题]:课程时长是多久? + [销售回答]:我们的课程时长通常是1小时或1.5小时,具体根据课程内容和学员需求而定。 + +9. [客户问题]:如果孩子错过了一节课怎么办? + [销售回答]:我们提供课后补课和教学资料,确保孩子不会因为错过课程而落后。 + +10. [客户问题]:课程内容包括哪些? + [销售回答]:我们的课程内容涵盖编程基础、算法、项目实践等,帮助孩子全面提升编程能力。 + +11. [客户问题]:你们的课程有认证吗? + [销售回答]:是的,完成我们的课程后,孩子将获得相应的编程认证,增加他们的简历竞争力。 + +12. [客户问题]:我想了解课程的教学方法。 + [销售回答]:我们采用互动式教学方法,结合实际项目让孩子动手实践,更容易掌握编程技能。 + +13. [客户问题]:你们的课程可以定制吗? + [销售回答]:当然可以,我们可以根据孩子的特长和兴趣定制个性化的学习计划。 + +14. [客户问题]:孩子学完课程之后能达到什么水平? + [销售回答]:孩子学完我们的课程后,将具备扎实的编程基础和实际项目经验,能够独立完成编程任务。 + +15. [客户问题]:我担心孩子学不会编程怎么办? + [销售回答]:我们的课程设计初学者友好,有专业的老师指导和小班教学,确保每位学员都能够轻松学习。 + +16. [客户问题]:孩子学习编程会影响其他学科吗? + [销售回答]:编程能力可以帮助孩子提高逻辑思维、问题解决和创新能力,对其他学科也有积极的促进作用。 + +17. [客户问题]:你们有什么成功的案例可以分享吗? + [销售回答]:我们有很多学员在编程比赛中获奖,也有学员成功进入顶尖学校,证明我们的教学效果非常好。 + +18. [客户问题]:我想提前了解孩子的学习情况。 + [销售回答]:我们有定期的家长会和进度报告,让家长可以随时了解孩子的学习进度和表现。 + +19. [客户问题]:你们提供哪些编程语言的教学? + [销售回答]:我们提供多种流行的编程语言教学,包括Python、Java、Scratch等,满足不同学员的需求。 + +20. [客户问题]:课程有没有优惠或者奖学金? + [销售回答]:我们会定期推出优惠活动和奖学金计划,让更多有才华的学员有机会接受高质量的编程教育。 + +21. [客户问题]:你们的课程有没有年级限制? + [销售回答]:我们的课程适合各个年龄段的学员,从小学生到中学生,都可以找到适合自己的课程。 + +22. [客户问题]:你们的课程是一对一教学还是小班教学? + [销售回答]:我们提供一对一和小班教学两种模式,家长可以根据孩子的需求和学习风格选择合适的教学模式。 + +23. [客户问题]:孩子可以学到哪些项目经验? + [销售回答]:孩子可以学到多种项目经验,如游戏开发、网站设计、机器人编程等,让他们在实际中应用所学知识。 + +24. [客户问题]:课程材料是提供的吗? + [销售回答]:我们提供全套的教学材料和资源,包括课程笔记、视频教程和练习题,帮助孩子更好地学习。 + +25. [客户问题]:你们的老师有没有培训? + [销售回答]:我们的老师都经过严格的培训和评估,确保他们具备专业的教学能力和教育理念。 + +26. [客户问题]:我想了解课程的难度。 + [销售回答]:我们的课程根据学员的水平和进度,设有不同的难度选项,从初级到高级都有。 + +27. [客户问题]:你们有没有和学校合作的项目? + [销售回答]:是的,我们与多所学校和教育机构合作,提供编程教育和培训服务。 + +28. [客户问题]:孩子学完课程之后有什么证书? + [销售回答]:完成我们的课程后,孩子将获得我们机构颁发的编程证书,证明他们具备一定的编程能力。 + +29. [客户问题]:课程的学习方式是怎样的? + [销售回答]:我们采用结合理论和实践的教学方式,让孩子既能理解编程概念,又能动手实践,提高学习效果。 + +30. [客户问题]:你们的课程有没有续费折扣? + [销售回答]:我们提供续费折扣和套餐优惠,让家长可以享受更多的课程优惠和服务。 + +31. [客户问题]:孩子需要准备什么? + [销售回答]:孩子只需要有一台电脑和网络连接就可以开始学习,其他的软件和材料我们都会提供。 + +32. [客户问题]:你们的课程有没有作业? + [销售回答]:我们的课程会布置适量的作业和项目,让孩子巩固所学知识和提高实践能力。 + +33. [客户问题]:我想提前了解课程大纲。 + [销售回答]:我们可以提供课程大纲和详细的教学计划,让家长了解课程的内容和教学进度。 + +34. [客户问题]:你们的课程有没有学习进度跟踪? + [销售回答]:我们有学习进度跟踪系统,家长可以随时查看孩子的学习情况和进度。 + +35. [客户问题]:孩子可以学到哪些编程技能? + [销售回答]:孩子可以学到如Python编程、网页设计、游戏开发、机器人编程等多种编程技能。 + +36. [客户问题]:你们有没有提供学习保障? + [销售回答]:我们承诺提供学习保障,如果孩子在学习过程中遇到问题,我们会及时提供帮助和支持。 + +37. [客户问题]:课程结束后孩子能做什么? + [销售回答]:完成我们的课程后,孩子将具备基础的编程能力和项目经验,可以开始进行更复杂的编程任务或参加编程比赛。 + +38. [客户问题]:我想了解孩子的教学环境。 + [销售回答]:我们的教学环境舒适、安全,配备先进的教学设备,为孩子提供良好的学习环境。 + +39. [客户问题]:你们有没有提供学习反馈? + [销售回答]:我们提供定期的学习反馈和评估,让家长了解孩子的学习情况和进步。 + +40. [客户问题]:我担心孩子学不会,可以退费吗? + [销售回答]:我们有退费政策,如果孩子在一定时间内没有适应我们的教学,可以申请退费。 + +41. [客户问题]:课程有没有附加费用? + [销售回答]:除了课程费用,我们没有额外的隐藏费用,所有教材和资源都包含在课程费用内。 + +42. [客户问题]:你们的老师有没有保障? + [销售回答]:我们的老师都经过严格的背景检查和培训,保证他们具备专业的教学能力和良好的职业道德。 + +43. [客户问题]:我想了解课程的评估标准。 + [销售回答]:我们有详细的课程评估标准和考核体系,确保孩子能够全面掌握所学知识和技能。 + +44. [客户问题]:你们有没有推荐书籍或资源? + [销售回答]:我们会推荐一些优质的编程书籍和在线资源,帮助孩子进一步提高编程能力。 + +45. [客户问题]:孩子可以学到哪些编程框架? + [销售回答]:孩子可以学到如Django、React、Unity等流行的编程框架,提高他们在实际项目中的应用能力。 + +46. [客户问题]:课程的教学质量如何保证? + [销售回答]:我们有严格的教学质量控制体系,包括教师培训、课程设计、学习反馈等,确保教学质量始终保持在高水平。 + +47. [客户问题]:孩子学完课程后有没有继续学习的建议? + [销售回答]:完成我们的课程后,我们会为孩子提供继续学习的建议和方向,帮助他们更好地规划未来的学习路径。 + +48. [客户问题]:你们有没有学生社群或活动? + [销售回答]:我们有学生社群和定期的活动,让孩子有机会与其他学生交流和合作,扩大他们的社交圈子。 + +49. [客户问题]:我想了解孩子的学习动机。 + [销售回答]:我们的课程注重培养孩子的学习动机和兴趣,通过有趣的项目和挑战,激发孩子的学习热情。 + +50. [客户问题]:你们有没有提供家长培训? + [销售回答]:我们提供家长培训和教育指导,帮助家长更好地支持孩子的学习,共同促进孩子的成长。 + +51. [客户问题]:我想提前了解课程的教学方法。 + [销售回答]:我们采用多元化的教学方法,包括讲解、实践、项目等,确保孩子能够全面和深入地学习编程。 + +52. [客户问题]:你们的课程有没有国际认证? + [销售回答]:我们的课程内容和教学方法遵循国际编程教育标准,虽然没有专门的国际认证,但学员完成课程后具备国际通用的编程技能。 + +53. [客户问题]:我想了解课程的期望成果。 + [销售回答]:完成我们的课程后,孩子将具备扎实的编程基础、实际项目经验和解决问题的能力,为未来的学习和工作打下坚实的基础。 + +54. [客户问题]:你们有没有提供学习反馈? + [销售回答]:我们提供定期的学习反馈和评估,让家长和孩子了解学习情况,及时调整学习策略。 + +55. [客户问题]:孩子可以学到哪些编程工具? + [销售回答]:孩子可以学到如Visual Studio Code、PyCharm、Unity等流行的编程工具,提高他们在实际项目中的开发效率。 + +56. [客户问题]:你们的课程有没有难度测试? + [销售回答]:我们的课程有难度测试和能力评估,确保孩子能够适应课程难度和取得良好的学习效果。 + +57. [客户问题]:课程有没有实际应用案例? + [销售回答]:我们的课程有大量的实际应用案例,如游戏开发、网站设计、数据分析等,让孩子在实践中掌握编程技能。 + +58. [客户问题]:我担心孩子学不会编程。 + [销售回答]:我们的课程设计初学者友好,有专业的老师指导和小班教学,确保每位学员都能够轻松学习。 + +59. [客户问题]:课程有没有助教或助教支持? + [销售回答]:我们的课程有专业的助教团队支持,为孩子提供额外的学习帮助和指导。 + +60. [客户问题]:你们的课程有没有假期班? + [销售回答]:我们会根据假期安排特别的假期班,让孩子在假期期间继续学习和进步。 + +61. [客户问题]:我想了解课程的教学团队。 + [销售回答]:我们的教学团队由经验丰富、有激情的编程专家组成,他们致力于为孩子提供高质量的编程教育。 + +62. [客户问题]:课程有没有助教或助教支持? + [销售回答]:我们的课程有专业的助教团队支持,为孩子提供额外的学习帮助和指导。 + +63. [客户问题]:我想了解课程的教学环境。 + [销售回答]:我们的教学环境舒适、安全,配备先进的教学设备,为孩子提供良好的学习环境。 + +64. [客户问题]:课程有没有实际应用案例? + [销售回答]:我们的课程有大量的实际应用案例,如游戏开发、网站设计、数据分析等,让孩子在实践中掌握编程技能。 + +65. [客户问题]:我想提前了解课程的教学方法。 + [销售回答]:我们采用多元化的教学方法,包括讲解、实践、项目等,确保孩子能够全面和深入地学习编程。 + +66. [客户问题]:你们的课程有没有国际认证? + [销售回答]:我们的课程内容和教学方法遵循国际编程教育标准,虽然没有专门的国际认证,但学员完成课程后具备国际通用的编程技能。 + +67. [客户问题]:你们有没有提供学习反馈? + [销售回答]:我们提供定期的学习反馈和评估,让家长和孩子了解学习情况,及时调整学习策略。 + +68. [客户问题]:孩子可以学到哪些编程工具? + [销售回答]:孩子可以学到如Visual Studio Code、PyCharm、Unity等流行的编程工具,提高他们在实际项目中的开发效率。 + +69. [客户问题]:你们的课程有没有难度测试? + [销售回答]:我们的课程有难度测试和能力评估,确保孩子能够适应课程难度和取得良好的学习效果。 + +70. [客户问题]:课程有没有作业? + [销售回答]:我们的课程会布置适量的作业和项目,让孩子巩固所学知识和提高实践能力。 + +71. [客户问题]:我想了解孩子的学习动机。 + [销售回答]:我们的课程注重培养孩子的学习动机和兴趣,通过有趣的项目和挑战,激发孩子的学习热情。 + +72. [客户问题]:你们有没有推荐书籍或资源? + [销售回答]:我们会推荐一些优质的编程书籍和在线资源,帮助孩子进一步提高编程能力。 + +73. [客户问题]:你们有没有学生社群或活动? + [销售回答]:我们有学生社群和定期的活动,让孩子有机会与其他学生交流和合作,扩大他们的社交圈子。 + +74. [客户问题]:我想了解课程的期望成果。 + [销售回答]:完成我们的课程后,孩子将具备扎实的编程基础、实际项目经验和解决问题的能力,为未来的学习和工作打下坚实的基础。 + +75. [客户问题]:课程有没有助教或助教支持? + [销售回答]:我们的课程有专业的助教团队支持,为孩子提供额外的学习帮助和指导。 + +76. [客户问题]:我担心孩子学不会编程。 + [销售回答]:我们的课程设计初学者友好,有专业的老师指导和小班教学,确保每位学员都能够轻松学习。 + +77. [客户问题]:课程有没有实际应用案例? + [销售回答]:我们的课程有大量的实际应用案例,如游戏开发、网站设计、数据分析等,让孩子在实践中掌握编程技能。 + +78. [客户问题]:我想提前了解课程的教学方法。 + [销售回答]:我们采用多元化的教学方法,包括讲解、实践、项目等,确保孩子能够全面和深入地学习编程。 + +79. [客户问题]:你们的课程有没有国际认证? + [销售回答]:我们的课程内容和教学方法遵循国际编程教育标准,虽然没有专门的国际认证,但学员完成课程后具备国际通用的编程技能。 + +80. [客户问题]:你们有没有提供学习反馈? + [销售回答]:我们提供定期的学习反馈和评估,让家长和孩子了解学习情况,及时调整学习策略。 + +81. [客户问题]:孩子可以学到哪些编程工具? + [销售回答]:孩子可以学到如Visual Studio Code、PyCharm、Unity等流行的编程工具,提高他们在实际项目中的开发效率。 + +82. [客户问题]:你们的课程有没有难度测试? + [销售回答]:我们的课程有难度测试和能力评估,确保孩子能够适应课程难度和取得良好的学习效果。 + +83. [客户问题]:课程有没有作业? + [销售回答]:我们的课程会布置适量的作业和项目,让孩子巩固所学知识和提高实践能力。 + +84. [客户问题]:我想了解孩子的学习动机。 + [销售回答]:我们的课程注重培养孩子的学习动机和兴趣,通过有趣的项目和挑战,激发孩子的学习热情。 + +85. [客户问题]:你们有没有推荐书籍或资源? + [销售回答]:我们会推荐一些优质的编程书籍和在线资源,帮助孩子进一步提高编程能力。 + +86. [客户问题]:你们有没有学生社群或活动? + [销售回答]:我们有学生社群和定期的活动,让孩子有机会与其他学生交流和合作,扩大他们的社交圈子。 + +87. [客户问题]:我想了解课程的期望成果。 + [销售回答]:完成我们的课程后,孩子将具备扎实的编程基础、实际项目经验和解决问题的能力,为未来的学习和工作打下坚实的基础。 + +88. [客户问题]:课程有没有助教或助教支持? + [销售回答]:我们的课程有专业的助教团队支持,为孩子提供额外的学习帮助和指导。 + +89. [客户问题]:我担心孩子学不会编程。 + [销售回答]:我们的课程设计初学者友好,有专业的老师指导和小班教学,确保每位学员都能够轻松学习。 + +90. [客户问题]:课程有没有实际应用案例? + [销售回答]:我们的课程有大量的实际应用案例,如游戏开发、网站设计、数据分析等,让孩子在实践中掌握编程技能。 + +91. [客户问题]:我想提前了解课程的教学方法。 + [销售回答]:我们采用多元化的教学方法,包括讲解、实践、项目等,确保孩子能够全面和深入地学习编程。 + +92. [客户问题]:你们的课程有没有国际认证? + [销售回答]:我们的课程内容和教学方法遵循国际编程教育标准,虽然没有专门的国际认证,但学员完成课程后具备国际通用的编程技能。 + +93. [客户问题]:你们有没有提供学习反馈? + [销售回答]:我们提供定期的学习反馈和评估,让家长和孩子了解学习情况,及时调整学习策略。 + +94. [客户问题]:孩子可以学到哪些编程工具? + [销售回答]:孩子可以学到如Visual Studio Code、PyCharm、Unity等流行的编程工具,提高他们在实际项目中的开发效率。 + +95. [客户问题]:你们的课程有没有难度测试? + [销售回答]:我们的课程有难度测试和能力评估,确保孩子能够适应课程难度和取得良好的学习效果。 + +96. [客户问题]:课程有没有作业? + [销售回答]:我们的课程会布置适量的作业和项目,让孩子巩固所学知识和提高实践能力。 + +97. [客户问题]:我想了解孩子的学习动机。 + [销售回答]:我们的课程注重培养孩子的学习动机和兴趣,通过有趣的项目和挑战,激发孩子的学习热情。 + +98. [客户问题]:你们有没有推荐书籍或资源? + [销售回答]:我们会推荐一些优质的编程书籍和在线资源,帮助孩子进一步提高编程能力。 + +99. [客户问题]:你们有没有学生社群或活动? + [销售回答]:我们有学生社群和定期的活动,让孩子有机会与其他学生交流和合作,扩大他们的社交圈子。 + +100. [客户问题]:我想了解课程的期望成果。 + [销售回答]:完成我们的课程后,孩子将具备扎实的编程基础、实际项目经验和解决问题的能力,为未来的学 \ No newline at end of file diff --git a/langchain/sales_chatbot/sales_chatbot.py b/langchain/sales_chatbot/sales_chatbot.py index a369f4de..570ff60e 100644 --- a/langchain/sales_chatbot/sales_chatbot.py +++ b/langchain/sales_chatbot/sales_chatbot.py @@ -1,19 +1,21 @@ +import os + import gradio as gr -from langchain.embeddings.openai import OpenAIEmbeddings -from langchain.vectorstores import FAISS +from langchain_openai import OpenAIEmbeddings +from langchain_community.vectorstores import FAISS from langchain.chains import RetrievalQA -from langchain.chat_models import ChatOpenAI +from langchain_community.chat_models import ChatOpenAI def initialize_sales_bot(vector_store_dir: str="real_estates_sale"): - db = FAISS.load_local(vector_store_dir, OpenAIEmbeddings()) - llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0) + db = FAISS.load_local(vector_store_dir, OpenAIEmbeddings(openai_api_key=os.getenv("OPENAI_API_KEY")), allow_dangerous_deserialization=True) + llm = ChatOpenAI(model_name="gpt-4", temperature=0.5, openai_api_key=os.getenv("OPENAI_API_KEY")) global SALES_BOT SALES_BOT = RetrievalQA.from_chain_type(llm, retriever=db.as_retriever(search_type="similarity_score_threshold", - search_kwargs={"score_threshold": 0.8})) + search_kwargs={"score_threshold": 0.6})) # 返回向量数据库的检索结果 SALES_BOT.return_source_documents = True @@ -40,7 +42,7 @@ def sales_chat(message, history): def launch_gradio(): demo = gr.ChatInterface( fn=sales_chat, - title="房产销售", + title="销售顾问(您可以提交关于房产、少儿编程培训相关的问题)", # retry_btn=None, # undo_btn=None, chatbot=gr.Chatbot(height=600), diff --git a/langchain/sales_chatbot/save_QA.py b/langchain/sales_chatbot/save_QA.py new file mode 100644 index 00000000..98e7d342 --- /dev/null +++ b/langchain/sales_chatbot/save_QA.py @@ -0,0 +1,22 @@ +import os + +from langchain.text_splitter import CharacterTextSplitter +from langchain.embeddings.openai import OpenAIEmbeddings +from langchain.text_splitter import CharacterTextSplitter +from langchain.vectorstores import FAISS + +with open("real_estate_sales_data.txt") as f: + real_estate_sales = f.read() + +text_splitter = CharacterTextSplitter( + separator = r'\d+\.', + chunk_size = 100, + chunk_overlap = 0, + length_function = len, + is_separator_regex = True, +) + +docs = text_splitter.create_documents([real_estate_sales]) +db = FAISS.from_documents(docs, OpenAIEmbeddings(openai_api_key=os.getenv("OPENAI_API_KEY"))) + +db.save_local("real_estates_sale") \ No newline at end of file From b3d0498659eb5f6630b877a666460af2a5e1c66a Mon Sep 17 00:00:00 2001 From: "tolson.wang" Date: Tue, 23 Apr 2024 18:52:30 +0800 Subject: [PATCH 7/7] =?UTF-8?q?=E5=AE=8C=E6=88=90=E4=BD=9C=E4=B8=9A?= =?UTF-8?q?=EF=BC=8Cai=5Ftranslator=E5=A2=9E=E5=8A=A0=E9=A3=8E=E6=A0=BC?= =?UTF-8?q?=E8=AF=9D=E7=BF=BB=E8=AF=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ai_translator/chain/translator_chain.py | 16 +++++++++------- openai-translator/ai_translator/main.py | 3 ++- .../ai_translator/templates/index.html | 8 ++++++++ .../ai_translator/translator/pdf_translator.py | 10 +++++++--- 4 files changed, 26 insertions(+), 11 deletions(-) diff --git a/openai-translator/ai_translator/chain/translator_chain.py b/openai-translator/ai_translator/chain/translator_chain.py index 32e6f594..9c01ab18 100644 --- a/openai-translator/ai_translator/chain/translator_chain.py +++ b/openai-translator/ai_translator/chain/translator_chain.py @@ -17,12 +17,14 @@ def __init__(self, model_name: str = "gpt-3.5-turbo", verbose: bool = True): system_template = ( """你是一个翻译专家,擅长各国语言。 \n 请将我发送给你的文字内容,翻译成{target_language}。 \n - 注意:\n - 1、保留原文间距(空格,分隔符,换行符)\n - 2、如果原文是表格,请按照下面的表格形式返回(文字内容仍然需要翻译):\n - [Title1, Title2, Title3 ] \n - [context1, context2, context3] \n + 翻译结果以{lang_style}风格展示 \n """ + # 注意:\n + # 1、保留原文间距和格式(空格,分隔符,换行符)\n + # 2、如果原文是表格,请按照下面的表格形式返回(文字内容仍然需要翻译):\n + # [Title1, Title2, Title3 ] \n + # [context1, context2, context3] \n + ) system_message_prompt = SystemMessagePromptTemplate.from_template(system_template) @@ -37,10 +39,10 @@ def __init__(self, model_name: str = "gpt-3.5-turbo", verbose: bool = True): openai_api_key=os.getenv("OPENAI_API_KEY")) self.chain = LLMChain(llm=chat, prompt=chat_prompt_template) - def run(self, text: str, target_language: str) -> (str, bool): + def run(self, text: str, target_language: str, lang_style: str) -> (str, bool): result = "" try: - result = self.chain.run(text=text, target_language=target_language) + result = self.chain.run(text=text, target_language=target_language, lang_style=lang_style) except Exception as e: LOG.error(f"An error occurred: {e}") return result, False diff --git a/openai-translator/ai_translator/main.py b/openai-translator/ai_translator/main.py index 16cb00d7..9911b169 100644 --- a/openai-translator/ai_translator/main.py +++ b/openai-translator/ai_translator/main.py @@ -43,6 +43,7 @@ def translate(): if file and allowed_file(file.filename): target_lang = request.form.get('target_lang') target_format = request.form.get('target_format') + lang_style = request.form.get('lang_style') file_path = os.path.join(app.config['UPLOAD_FOLDER'], file.filename) file.save(file_path) @@ -51,7 +52,7 @@ def translate(): file_format = target_format # 实例化 PDFTranslator 类,并调用 translate_pdf() 方法 translator = PDFTranslator('gpt-3.5-turbo') - output_file_path = translator.translate_pdf(pdf_file_path, file_format, target_lang) + output_file_path = translator.translate_pdf(pdf_file_path=pdf_file_path, file_format=file_format, target_language=target_lang, lang_style=lang_style) result = { "message": "Translation successful", diff --git a/openai-translator/ai_translator/templates/index.html b/openai-translator/ai_translator/templates/index.html index 0ce1e632..8fba10e1 100644 --- a/openai-translator/ai_translator/templates/index.html +++ b/openai-translator/ai_translator/templates/index.html @@ -100,6 +100,14 @@

PDF Translator

+
+ + +