├── .gitignore ├── README.md ├── config_example.ini ├── datas ├── The_Old_Man_of_the_Sea.pdf ├── fine_food_reviews_1k.csv ├── fine_food_reviews_3.csv ├── fine_food_reviews_with_embeddings_1k.csv ├── fine_food_reviews_with_embeddings_3.csv └── the_old_man_and_the_sea.txt ├── note ├── 笔记1-大模型基础:理论与技术的演进.md ├── 笔记10-大模型实战:基于Langchain实现AutoGpt功能.md ├── 笔记11-大模型实战:基于知识库的房产销售Sales-Consultant.md ├── 笔记2-大模型基础:理论与技术的演进.md ├── 笔记3-大模型实战:Embedding.md ├── 笔记4-大模型实战:OpenaiModels.md ├── 笔记6-大模型实战:OpenaiTranslator实战总结.md ├── 笔记8-大模型应用开发框架-LangChain.md └── 笔记9-大模型实战:OpenaiTranslator+Langchain实战总结.md ├── pip_file.py ├── project ├── langchain │ ├── 8.use_langchain.ipynb │ ├── agents │ │ ├── __init__.py │ │ ├── openai_function.ipynb │ │ ├── react.ipynb │ │ └── self_ask_with_search.ipynb │ ├── chains │ │ ├── 8.homework_router_chain.ipynb │ │ ├── __init__.py │ │ ├── router_chain.ipynb │ │ ├── sequential_chain.ipynb │ │ └── transform_chain.ipynb │ ├── data_connection │ │ ├── __init__.py │ │ ├── document_loader.ipynb │ │ ├── document_transformers.ipynb │ │ ├── text_embedding.ipynb │ │ └── vector_stores.ipynb │ ├── imgs │ │ └── mac_chatglm推理.png │ ├── memory │ │ ├── __init__.py │ │ └── mermory.ipynb │ └── model_io │ │ ├── __init__.py │ │ ├── model.ipynb │ │ ├── model_chatglm.ipynb │ │ ├── model_other.ipynb │ │ ├── output_parser.ipynb │ │ └── prompt.ipynb ├── langchain_autogpt │ ├── .gitkeep │ ├── README.md │ ├── autogpt.py │ └── files │ │ ├── img.png │ │ ├── img_1.png │ │ └── img_2.png ├── langchain_openai_translator │ ├── .idea │ │ ├── .gitignore │ │ ├── inspectionProfiles │ │ │ ├── Project_Default.xml │ │ │ └── profiles_settings.xml │ │ ├── misc.xml │ │ ├── modules.xml │ │ ├── openai-translator.iml │ │ └── vcs.xml │ ├── LICENSE │ ├── README-CN.md │ ├── README.md │ ├── ai_translator │ │ ├── __init__.py │ │ ├── book │ │ │ ├── __init__.py │ │ │ ├── book.py │ │ │ ├── content.py │ │ │ └── page.py │ │ ├── flask_server.py │ │ ├── gradio_server.py │ │ ├── logs │ │ │ └── translation.log │ │ ├── main.py │ │ ├── translator │ │ │ ├── __init__.py │ │ │ ├── exceptions.py │ │ │ ├── pdf_parser.py │ │ │ ├── pdf_translator.py │ │ │ ├── translation_chain.py │ │ │ ├── translation_config.py │ │ │ └── writer.py │ │ └── utils │ │ │ ├── __init__.py │ │ │ ├── argument_parser.py │ │ │ └── logger.py │ ├── config.yaml │ ├── flask_temps │ │ ├── cesi.pdf │ │ ├── cesi_1.pdf │ │ ├── cesi_translated.md │ │ └── cesi_translated_1.md │ ├── fonts │ │ └── simsun.ttc │ ├── images │ │ ├── sample_image_0.png │ │ └── sample_image_1.png │ ├── jupyter │ │ ├── flask_client.ipynb │ │ └── translation_chain.ipynb │ ├── logs │ │ ├── translation.2023-08-27_17-12-09_650050.log │ │ ├── translation.2023-08-29_11-00-52_348942.log │ │ ├── translation.2023-09-06_18-27-55_738519.log │ │ └── translation.log │ ├── requirements.txt │ └── tests │ │ ├── .DS_Store │ │ ├── ThamesNewsCH.pdf │ │ ├── ThamesNewsEN.pdf │ │ ├── The_Old_Man_of_the_Sea.pdf │ │ ├── press_release_translated_novel.md │ │ ├── test.pdf │ │ └── test_translated.md ├── openai_api │ ├── 3.class_embeddings.ipynb │ ├── 4.class_models.ipynb │ ├── 4.class_tiktoken.ipynb │ ├── 5.homework_function_call.ipynb │ ├── files │ │ ├── img-CWs11MH3BnkwqSRzoUWrtITD.png │ │ ├── img-EWwpOBlQ3ngE9SkxwHBpPCqw.png │ │ ├── img-GyOanQxzFuiTrPrdIV72mM76.png │ │ ├── img-UxONH8mxhhRd9ABKmYnJnQ2d.png │ │ ├── img-ZJkajHQVUwIEmrU4Ei2iBUCw.png │ │ ├── img-iSjbeihvmNnvuSvSfiiRxkKF.png │ │ ├── img_1.png │ │ ├── speech.mp3 │ │ ├── work_10818_20231031_jxj3wSJ_preview.jpg │ │ ├── 羊皮卷1.txt │ │ ├── 羊皮卷speech.mp3 │ │ ├── 英文单人.MP4 │ │ └── 英文对话.MP4 │ └── gpt4_new_function.ipynb └── python │ ├── example_chat_completion.md │ ├── example_chat_completion.py │ ├── 天气助手.png │ └── 聊天助手.png ├── requirments.txt └── resource ├── AI-LangChain.png ├── AI-LangChain.xmind ├── LangChain案例.png ├── LangChain设计.png ├── Langchain版Auto-GPT技术方案与架构设计.png ├── Sales-Consultant业务流程与价值分析.png ├── Sales-Consultant技术方案与架构设计.png ├── homework_openai_translator_v2.0.png ├── open_ai_models.json ├── prompt.png ├── 使用FAISS向量数据库存储销售问答话术.png ├── 使用Gradio实现聊天机器人的图形化界面.png ├── 使用RetrievalQA检索销售话术数据_similarity.png ├── 使用RetrievalQA检索销售话术数据_topk.png ├── 基于知识库问答的典型用例.png ├── 笔记1-2.png ├── 笔记2-3-4.1.png ├── 笔记2-3-4.2.png └── 销售话术.png /.gitignore: -------------------------------------------------------------------------------- 1 | *.pyc 2 | .idea/* 3 | .ipynb_checkpoints/ 4 | .python-version 5 | resource/.ipynb_checkpoints/ 6 | config.ini 7 | */*test.* 8 | test/ 9 | *.log 10 | *.DS_Store 11 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 《AI 大模型应用开发实战营》 2 | 3 | - 欢迎来到AI大语言模型训练营!这里是课后练习的文档,供学员们进行课后巩固和练习。 4 | - 最近参加了极客时间《AI 大模型应用开发实战营》,我学习了 AI 大模型的应用开发,以下是参加该训练营的课后练习已经相关总结。 5 | - 该项目包涵: 6 | - 大型语言模型的理论和开发基础:深入探究像 GPT-4 这样的大型语言模型的内部运作,包括其架构,训练方法,应用等。 7 | - 用 LangChain 开发 AIGC 应用:使用 LangChain 开发 AIGC 应用的实践示例和教程,展示了大型语言模型的实际应用。 8 | 9 | - 课程项目地址:https://github.com/ShengqinYang/openai-quickstart 10 | - Fork From:https://github.com/DjangoPeng/openai-quickstart 11 | 12 | ### 练习1:[openai_api相关原生的API调用](./project/openai_api) 13 | 14 | ### 练习2:使用openai_api相关原生的API实现OpenaiTranslator项目 15 | 16 | - 项目地址:https://github.com/ShengqinYang/openai-quickstart/tree/main/openai-translator 17 | - Fork From:https://github.com/DjangoPeng/openai-quickstart/tree/main/openai-translator 18 | 19 | ### 练习3:大模型应用开发框架Langchain相关学习 20 | 21 | - [LangChain](./note/笔记8-大模型应用开发框架-LangChain.md) 22 | - LangChain 是什么 23 | - 为什么需要 LangChain 24 | - LangChain 典型使⽤场景 25 | - LangChain 基础概念与模块化设计 26 | - [LangChain 5大核⼼模块⼊⻔与实战](./project/langchain) 27 | - Model I/O: -- 包涵:Models、Prompt、Output Parsers 28 | - chains --整合模型与其他组件,包涵各种不同的chain的使用 29 | - memory --记住之前的对话。两个功能:读取(READ)和写入(WRITE) 30 | - data_connection --包涵:文本加载器、文档转换器、文本向量模型、向量数据库、检索器 31 | - agents --访问其他的工具,比如:给chatgpt增加联网的功能,对接google搜索引擎 32 | - [LangChain 5大核⼼模块源码结构梳理](./resource/AI-LangChain.xmind) 33 | 34 | ### 练习4:[结合Langchain应用开发框架实现OpenaiTranslator项目](./note/笔记9-大模型实战:OpenaiTranslator+Langchain实战总结.md) 35 | 36 | - [实战 LangChain 版 OpenaiTranslator项目](./project/langchain_openai_translator) 37 | 38 | ### 练习5:[网红项目 AutoGPT 深度学习](./note/笔记10-大模型实战:基于Langchain实现AutoGpt功能.md) 39 | 40 | - AutoGPT 原始版本定位与功能解读 41 | - LangChain 版 AutoGPT 技术方案与架构设计 42 | - 网络搜索(SerpAPIWrapper)模块 43 | - 文件读写(FileTool)模块 44 | - 持久化存储(VectorStores)模块 45 | - 向量模型(Embeddings)模块 46 | - 聊天模型(Chat Models)模块 47 | - [实战 LangChain 版 AutoGPT](./project/langchain_autogpt) 48 | 49 | ### 练习6:[基于知识库的销售顾问 Sales-Consultant](./note/笔记11-大模型实战:基于知识库的房产销售Sales-Consultant.md) 50 | 51 | - Sales-Consultant 市场需求分析 52 | - Sales-Consultant 产品定义与功能规划 53 | - Sales-Consultant 技术方案与架构设计 54 | - 解析与索引管理(Indexes)模块 55 | - 知识库问答(QA Chain)模块 56 | - 用户引导(Example Selectors)模块 57 | - [实战 LangChain 版 Sales-Consultant](./project/langchain_sales_chatbot) 58 | 59 | ### 练习7:[基于ChatGLM2-6B-int4私有化模型部署](./project/langchain/model_io/model_chatglm.ipynb) 60 | 61 | ## 开源许可证 62 | 63 | 本项目采用 [Apache 许可证](https://www.apache.org/licenses/LICENSE-2.0) 进行授权。 64 | 65 | ## 联系我们 66 | 67 | 如果您在练习过程中遇到任何问题或需要帮助,请随时联系我们: 68 | 69 | - 邮箱:jean_open_main@163.com 70 | 71 | 祝您学习愉快! 72 | -------------------------------------------------------------------------------- /config_example.ini: -------------------------------------------------------------------------------- 1 | [Openai] 2 | api_key = "openai的apikey" 3 | 4 | [APISpace] 5 | apikey= "天气查询引擎的apikey:https://www.apispace.com/" 6 | 7 | [Proxy] 8 | HTTP_PROXY = "代理" http://127.0.0.1:1087 9 | HTTPS_PROXY = "代理" http://127.0.0.1:1087 10 | 11 | [SerpApi] 12 | serp_apikey = "Google 搜索apikey:https://serpapi.com" 13 | -------------------------------------------------------------------------------- /datas/The_Old_Man_of_the_Sea.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShengqinYang/AINote/b2882d3cf5f0ee00dad7d4bde955368c37327ae6/datas/The_Old_Man_of_the_Sea.pdf -------------------------------------------------------------------------------- /datas/fine_food_reviews_3.csv: -------------------------------------------------------------------------------- 1 | ,Time,ProductId,UserId,Score,Summary,Text 2 | 0,1351123200,B003XPF9BO,A3R7JR3FMEBXQB,5,where does one start...and stop... with a treat like this,"下雨天先到中星城避个雨,正好一层有这家COSTA COFFEE,也就顺便打个卡。就在商场的入口处,开放式的餐区与商场合体,冬天的话暖气不足就感觉还是有点冷,不能脱掉外套。这样就需要来杯热美式咖啡来暖暖身体了。大杯的量很足,喝了半天也没喝完[偷笑]。" 3 | 1,1351123200,B003JK537S,A3JBPC3WFUT5ZP,4,Arrived in pieces,"不得不说这家店的环境其实还不错,但是因为层高的关系,又是一楼对着门,所以感觉好冷,在连续下雨的天气里,那个体感可是很不好。一杯美式咖啡,可以选择上等咖啡豆,➕5元,试试吧,口感上更烘培更深度,个人觉得一般。" 4 | 2,1351123200,B000JMBE7M,AQX1N6A51QOKG,5,The Music Bar音乐吧,“ 打卡位于望京凯悦酒店一楼的 Music bar,环境真的很舒服,相信大多数人都会喜欢这种feel经典格兰杰跟大都会非常好喝,炸小河虾跟盐炯银杏十分美味,下酒够了 推荐:炸小河虾“ 5 | 3,1351123200,B000JMBE7Z,AQX1N6A51QOKG,1,The Music Bar音乐吧,"酒单上的威士忌酸88~结账到最后,告诉升级版一定要睁眼看看结账单!108! 整个这个强盗啊!" 6 | 4,1351123200,B000JMBE7Z,AQX1N6A51QOKG,2,The Magic Bar, '服务满分,环境中规中矩,音乐真心受不了,清吧你请乐队来唱一晚上,几个人想聊聊天一个字也听不到。乐队休息的时候音乐放得比夜店音乐还大,震得想吐,不会再来......' 7 | -------------------------------------------------------------------------------- /note/笔记1-大模型基础:理论与技术的演进.md: -------------------------------------------------------------------------------- 1 | ## 基础篇:大模型基础--理论与技术的演进(第一节课) 2 | 3 | ### 第一部分:课后习题 4 |
5 | 6 | ```text 7 | 单项选择题: 8 | 9 | 注意力机制(Attention)的主要用途是什么? 10 | A. 优化模型训练速度 11 | B. 提高模型准确率 12 | C. 选择重要的信息并忽略不相关的信息 13 | D. 改进模型的可解释性 14 | 答:C 15 | 16 | Transformer 模型是基于什么理论构建的? 17 | A. 递归神经网络(RNN) 18 | B. 卷积神经网络(CNN) 19 | C. 注意力机制(Attention) 20 | D. 自组织映射(SOM) 21 | 答:C 22 | 23 | GPT 和 BERT 的主要区别是什么? 24 | A. GPT 是基于 Transformer 的,而 BERT 不是 25 | B. BERT 是基于 Transformer 的,而 GPT 不是 26 | C. GPT 使用了单向自注意力,而 BERT 使用了双向自注意力 27 | D. GPT 和 BERT 在基本结构上没有区别 28 | 答:C 29 | 30 | 在注意力机制中,“Q”、“K”和“V”分别代表什么? 31 | A. 查询、密钥和值 32 | B. 查询、键入和验证 33 | C. 快速、关键和验证 34 | D. 问题、知识和视觉 35 | 答:A 36 | 37 | Transformer 模型是如何解决长距离依赖问题的? 38 | A. 通过递归神经网络(RNN) 39 | B. 通过卷积神经网络(CNN) 40 | C. 通过注意力机制(Attention) 41 | D. 通过自组织映射(SOM) 42 | 答:C 43 | 44 | GPT 主要用于哪种类型的任务? 45 | A. 分类任务 46 | B. 回归任务 47 | C. 生成任务 48 | D. 聚类任务 49 | 答:C 50 | 51 | 以下哪项是 BERT 的主要创新之处? 52 | A. 引入了自注意力机制 53 | B. 使用了双向自注意力机制 54 | C. 提出了新的优化算法 55 | D. 突破了模型大小的限制 56 | 答:B 57 | 58 | 在 Transformer 模型中,自注意力机制的主要作用是什么? 59 | A. 加速模型训练 60 | B. 识别输入中的关键信息 61 | C. 生成高质量的词嵌入 62 | D. 提高模型的鲁棒性 63 | 答:B 64 | 65 | 基于 Transformer 的模型,如 GPT 和 BERT,主要适用于哪些任务? 66 | A. 图像识别 67 | B. 自然语言处理 68 | C. 语音识别 69 | D. 强化学习 70 | 答:B 71 | 72 | 注意力机制最早是在哪个领域得到应用的? 73 | A. 计算机视觉 74 | B. 语音识别 75 | C. 自然语言处理 76 | D. 推荐系统 77 | 答:C 78 | ``` 79 | ```text 80 | 多项选择题: 81 | 82 | 以下哪些方法被用于处理序列数据? 83 | A. 递归神经网络(RNN) 84 | B. 卷积神经网络(CNN) 85 | C. 注意力机制(Attention) 86 | D. 支持向量机(SVM) 87 | 答:A、B、C 88 | 解释: 89 | 递归神经网络(RNN)、卷积神经网络(CNN)和注意力机制(Attention)都被广泛应用于处理序列数据。具体来说: 90 | 递归神经网络(RNN):用于处理序列数据中的时序关系,能够通过循环单元对序列中的上下文信息进行建模,从而对序列中的每个元素进行处理。 91 | 卷积神经网络(CNN):主要应用于序列数据中的局部模式识别,可以有效地对时间序列或文本数据中的局部特征进行提取。 92 | 注意力机制(Attention):能够根据输入序列中不同位置的重要性进行加权处理,从而提取相关的特征信息,并在不同任务中取得了显著的效果。 93 | 支持向量机(SVM)虽然也是一种常用的分类算法,但是主要用于处理结构化数据,而非序列数据。 94 | 95 | 以下哪些模型使用了注意力机制? 96 | A. BERT 97 | B. GPT 98 | C. LeNet 99 | D. ResNet 100 | 答:A、B 101 | 解释: 102 | BERT和GPT都使用了注意力机制来对输入序列进行编码和解码,从而实现自然语言处理任务,如文本分类、问答系统、文本生成等。 103 | LeNet和ResNet则是图像识别领域的经典模型,主要用于图像分类、目标检测等任务,并没有使用注意力机制。 104 | 其中,LeNet是最早的卷积神经网络模型之一,ResNet是一种深度残差网络,它通过引入残差连接来训练更深的神经网络。 105 | 106 | 以下哪些模型主要用于自然语言处理任务? 107 | A. GPT 108 | B. BERT 109 | C. VGG 110 | D. LeNet 111 | 答:A、B 112 | 解释: 113 | GPT和BERT主要用于自然语言处理任务,如文本分类、问答系统、文本生成等。 114 | 其中,GPT主要用于生成式自然语言处理任务,如文本生成、机器翻译、故事生成等; 115 | BERT则主要用于判别式自然语言处理任务,如文本分类、问答系统、命名实体识别等。 116 | VGG和LeNet则主要用于图像识别任务,其中,VGG是一种经典的卷积神经网络模型,主要用于图像分类任务; 117 | LeNet是最早的卷积神经网络模型之一,主要用于手写数字识别任务。 118 | 119 | 下列哪些说法正确描述了注意力机制的作用? 120 | A. 它可以用来改进模型的训练速度 121 | B. 它可以用来挑选出重要的信息并忽略不相关的信息 122 | C. 它可以用来生成高质量的词嵌入 123 | D. 它可以用来提高模型的鲁棒性 124 | 答:B 125 | 解释: 126 | 注意力机制的主要作用是对输入序列中的不同位置信息进行加权,从而挑选出重要的信息并忽略不相关的信息。 127 | 这种加权处理过程可以使模型更加关注重要的信息,从而提高模型的性能和表现。 128 | 注意力机制并不是用来改进模型的训练速度的,它在某些情况下甚至可能会增加模型的计算复杂度。 129 | 注意力机制也不是用来生成词嵌入的,它通常用于对序列进行编码和解码。 130 | 注意力机制虽然可以提高模型的鲁棒性,但这并不是它的主要作用。 131 | 132 | 下列哪些说法正确描述了 BERT 模型? 133 | A. BERT 模型是基于 Transformer 的 134 | B. BERT 模型使用了双向自注意力机制 135 | C. BERT 模型主要用于图像分类任务 136 | D. BERT 模型突破了模型大小的限制 137 | 答:A、B 138 | ``` 139 | 140 |
141 | 142 | ### 第二部分:相关名词解释 143 |
144 | 145 | ![avatar](../resource/笔记1-2.png) 146 | #### 1、LLM(Large Language Model)大语言模型是什么? 147 | ```text 148 | LLM是Large Language Model的缩写,指的是大型语言模型。大型语言模型是一类基于深度学习技术的人工智能模型,利用海量的文本数据进行训练,可以学习到自然 149 | 语言的规律和模式,并且可以用于自然语言生成、理解、翻译、分类等多项自然语言处理任务。 150 | 151 | 当前的主流大型语言模型包括GPT-3、BERT、RoBERTa、T5、XLNet等,它们都是基于Transformer架构的预训练模型,在自然语言处理领域具有广泛的应用。这些模 152 | 型一般需要使用超级计算机和大规模的训练数据进行训练,因此需要大量的计算资源和时间成本。 153 | ``` 154 |
155 | 156 | #### 2、常见的大语言模型有什么? 157 | ```text 158 | 目前主流的大语言模型包括但不限于以下几种: 159 | OpenAI公司下面的语言模型:GPT-4、GPT-3.5-turbo、text-davinci-003 160 | 161 | GPT-4(Generative Pre-trained Transformer 4):由OpenAI开发的一种基于Transformer架构的预训练语言模型,具有非常强大的自然语言生成和理解能 162 | 力,能够执行多项自然语言处理任务。GPT 就是一种典型的预训练解码器。 163 | 164 | GPT-3.5-turbo 和 text-davinci-003 都是语言模型,它们都可以用于聊天和文本生成等任务。 165 | 但是,GPT-3.5-turbo 更适合于聊天任务,因为它具有更高的语言理解能力和对话生成能力。 166 | 而 text-davinci-003 更适合于文本生成任务,因为它具有更高的文本生成能力和语言理解能力。 167 | 168 | 169 | BERT(Bidirectional Encoder Representations from Transformers):由Google开发的一种基于Transformer架构的预训练语言模型,具有强大的双 170 | 向上下文理解能力,被广泛应用于文本分类、问答系统等任务。BERT就是一种典型的预训练编码器。 171 | 172 | RoBERTa(Robustly Optimized BERT Pretraining Approach):由Facebook AI Research开发的一种基于BERT架构的预训练语言模型,采用更大规模 173 | 的数据和更长的训练时间进行训练,在多项自然语言处理任务上表现优异。 174 | 175 | T5(Text-to-Text Transfer Transformer):由Google Brain开发的一种基于Transformer架构的通用文本生成模型,可以执行多种自然语言处理任务,如 176 | 文本摘要、机器翻译、文本分类等。T5和BART都是典型的预训练编码器-解码器模型。 177 | 178 | XLNet(eXtreme MultiLingual Language Model):由Carnegie Mellon University、Google Brain和其他机构联合开发的一种基于Transformer架 179 | 构的预训练语言模型,采用了一种新的预训练方法,可以在多项自然语言处理任务上取得优异的表现。 180 | 181 | ChatGLM: 182 | 1.是由清华大学 KEG 实验室和智谱 AI 公司于 2023 年共同推出的。 183 | 2.是一种基于 GLM-130B 模型的对话生成模型,在模型的设计和训练过程中,充分利用了 GLM-130B 模型的优势,如多层的 Transformer 编码器、大量的训练数据和自适应的学习能力等。 184 | 3.它可以通过对大量文本数据进行预训练,自动学习自然语言的规律和模式,从而实现对话生成和自然语言处理任务。 185 | 4.可以生成自然流畅的对话,并且能够在多个领域和主题上进行对话生成,包括通用对话、技术支持、医疗咨询等。 186 | 187 | BARD(Building Automated Responses for Dialog)是由Facebook AI Research于2021年提出的一种自动化对话生成模型。与传统的对话生成模型不同, 188 | BARD模型不需要依赖大量的对话数据进行训练,而是通过对话生成引擎和语言模型的结合,可以自动生成自然流畅的对话响应。BARD模型将对话生成看作一个基于模板的 189 | 文本生成问题,它通过对输入的对话文本进行解析和理解,从而自动构建出一个适用于该对话的模板,然后使用语言模型来自动生成对话响应。BARD模型的优点是在不需要 190 | 大量对话数据的情况下,可以快速生成高质量的对话响应。这使得BARD模型在对话系统、客服机器人等领域具有广泛的应用前景。 191 | ``` 192 | 193 |
194 | 195 | #### 3、Transformer是什么? 196 | ```text 197 | Transformer是一种由Google开发的基于自注意力机制(self-attention)的神经网络架构,主要用于自然语言处理任务。相较于循环神经网络(RNN)和卷积神经 198 | 网络(CNN)等传统的序列模型,Transformer在处理长序列数据时具有更好的效果和更高的并行性。 199 | 200 | Transformer的核心思想是自注意力机制,它允许模型在处理输入序列时对不同位置的信息进行加权处理。自注意力机制能够有效地捕捉输入序列中的上下文信息,从而提高模型的性能。 201 | Transformer模型由编码器和解码器两部分组成,其中编码器用于将输入序列编码成隐含表示,而解码器则用于根据编码器的输出生成目标序列。 202 | 在Transformer中,Attention机制被广泛应用于编码器和解码器的各个层次,从而构建出一个强大的自注意力模型,可以在多项自然语言处理任务上取得优异的表现。 203 | ``` 204 |
205 | 206 | #### Transformer架构包括以下几个核心组件: 207 | ```text 208 | 209 | 1、编码器(Encoder):编码器负责将输入序列转换为上下文表示。它由多个相同的层组成,每个层都包含自注意力机制和前馈神经网络。自注意力机制用于捕捉输入序列内部的关系,前馈神经网络用于对位置表示进行非线性变换。 210 | 通俗解释:编码器主要用于处理和理解输入信息。这些模型可以获得双向的上下文,即可以同时考虑一个词的前面和后面的信息。由于编码器可以考虑到未来的信息,它们非常适合用于需要理解整个句子的任务,如 211 | 文本分类、命名实体识别等。预训练编码器需要使其能够构建强大的表示,这通常通过预测某个被遮蔽的单词、预测下一个句子或者其它的预训练任务来实现。BERT就是一种典型的预训练编码器。 212 | 213 | 2、解码器(Decoder):解码器根据编码器的输出和之前的生成序列,逐步生成目标序列。与编码器类似,解码器也由多个相同的层组成,每个层包含自注意力机制、编码器-解码器注意力机制和前馈神经网络。 214 | 通俗解释:解码器主要用于生成输出信息。它们是语言模型的基础,用于预测下一个单词。解码器只能考虑到过去的词,而不能考虑到未来的 词,这使得它们非常适合于生成任务,如文本生成、对话系统等。 215 | GPT就是一种典型的预训练解码器。 216 | 217 | 3、编码器-解码器注意力机制(Encoder-Decoder Attention):编码器-解码器注意力机制用于在解码器中对编码器的输出进行注意力计算。它帮助解码器关注输入序列中与当前生成位置相关的信息,有助于生成准确的目标序列。 218 | 通俗解释:结合了编码器和解码器的优点。编码器首先处理输入信息,然后解码器生成输出信息。这种结构可以考虑到全局的上下文信息,因此非常适合于需要理解输入信息并生成相应的输出的任务,如机器翻译、文本摘要等。 219 | 如何预训练编码器-解码器模型是一个开放的问题,因为需要考虑到如何有效地使用编码器和解码器的特点。T5和BART都是典型的预训练编码器-解码器模型。 220 | 221 | 4、自注意力机制(Self-Attention):自注意力机制是Transformer的核心机制之一,用于计算序列中每个位置与其他位置的相关性。通过计算相关性得分,并对其他位置的表示进行加权求和,自注意力机制能够捕捉到全局的上下文信息。 222 | 223 | 5、多头注意力机制(Multi-Head Attention):多头注意力机制通过将自注意力机制应用于多个子空间,允许模型学习不同层次、不同类型的语义表示。多个子空间的注意力结果进行拼接和线性变换,得到最终的注意力表示。 224 | 225 | 6、位置编码(Positional Encoding):位置编码用于引入序列中的顺序信息。它为每个位置分配一个唯一的向量表示,使得模型能够区分不同位置的词语或时间步。 226 | 227 | 7、前馈神经网络(Feed-Forward Network):前馈神经网络是一种全连接的前馈网络,用于对位置表示进行非线性变换。它能够学习到位置表示的更高级别的抽象特征,增强模型的表达能力。 228 | 229 | 这些组件相互协作,使得Transformer能够处理序列建模任务,并在自然语言处理等领域取得了显著的性能提升。 230 | 231 | ``` 232 |
233 | 234 | #### 4、RNN是什么? 235 | ```text 236 | RNN指的是递归神经网络(Recurrent Neural Network),是一种用于处理序列数据的神经网络模型。 237 | 与传统的前馈神经网络不同,递归神经网络在处理序列数据时能够对序列中的上下文信息进行建模。它通过引入循环结构,将序列中的每个元素都看作一个时间步,将上一 238 | 时间步的输出作为当前时间步的输入,从而在序列中引入记忆机制。这使得递归神经网络可以对序列数据中的时序关系进行建模,从而在多个时间步中共享参数,减少了模 239 | 型的参数数量,也提高了模型的效率。 240 | 递归神经网络在自然语言处理、语音识别、机器翻译、图像描述等领域中得到了广泛的应用。然而,由于梯度消失和梯度爆炸等问题的存在,递归神经网络在处理长序列数 241 | 据时可能会出现性能不佳的情况。因此,后来的一些模型如LSTM和GRU等被提出来解决这些问题。 242 | ``` 243 |
244 | 245 | #### 5、注意力机制:Attention是什么?与RNNs相比的优势在哪? 246 | ```text 247 | 注意力机制(Attention)是一种用于加权处理序列数据中不同位置的信息的方法。在自然语言处理和计算机视觉等领域,注意力机制已成为许多成功模型的核心组件。 248 | 具体来说,注意力机制可以对输入序列中的每个位置进行加权处理,得到每个位置的权重,然后将加权后的结果进行求和,得到一个加权后的向量表示。 249 | 不同的注意力机制可以通过不同的方式计算权重,例如基于点积、加性、多头等方式。 250 | 251 | 1.解决传统编码器-解码器模型的挑战,避免信息损失和无法建模输入输出对齐的问题。 252 | 2.自动学习注意力权重,捕捉编码器和解码器之间的相关性。 253 | 3.提高模型性能,改善输出质量,并提供更好的解释性。 254 | 4.允许解码器访问整个编码的输入序列,通过注意力权重选择性地关注相关信息。 255 | 5.构建上下文向量,使解码器能够全面访问输入序列并重点关注相关部分。 256 | ``` 257 | 258 | #### 6.大语言模型之间的本质区别 259 | ```text 260 | 1.模型基于的训练架构的区别,如:Transformer 架构 VS RNN架构 261 | 2.模型应用的场景的区别,如:文本生成、对话系统、机器翻译、图像生成等 262 | 3.训练数据和规模的区别,如:GPT-3 和 GPT-4 拥有数十亿甚至千亿级别的参数量,并且使用大量互联网文本数据进行训练;而其他模型则使用较小的参数量和数据集进行训练。 263 | ``` 264 | 265 |
266 | 267 | ### 第三部分:一些问答 268 |
269 | 270 | ##### 1、每次向 GPT 提问,回答注意力的权重都是不一样的吗? 271 | ```text 272 | 答:不一样,GPT自注意力模型,GPT在接受问题不同时,计算注意力权重的机制是不同的,回答时的注意力权重也不同。你问chatgpt相同问题,它不一定给你相同的回答。 273 | ``` 274 |
275 | 276 | ##### 2、`Transformer` 中,如果 `Encoder` 和 `Decoder` 都是 Self-Attention ,那么如何处理问题和答案之间的关系?(通过 Mask 吗?) 277 | ```text 278 | 答:问题与答案之间的信息泄露? 是通过mask技术,掩码让问题不能全部看到答案,答案不能全部看到问题,避免信息泄露。 279 | ``` 280 |
281 | 282 | ##### 3、Encoder-Decoder Attention 是 Self-Attention 吗? 283 | ```text 284 | 答:不算是,这个今晚彭老师着重讲过。encoder-decoder attention从编码器中能关注到特定的位置,self-attention是模型内部的自注意力机制,可以关注到输入序列中的所有位置。 285 | ``` 286 |
287 | 288 | ##### 4、Bert是基于编码器,GPT是基于解码器,不是编码和解码一块用吗? 289 | ```text 290 | 答:这3句话都没错,2个维度。 Bert和GPT的训练都用到了transformer,都用transformer的编码器和解码器来做预训练。但Bert目的是捕捉上下文信息,它强化了编码器能力。GPT的目的是序列生成能力,它用自回归强化了解码器能力。 291 | ``` 292 |
293 | 294 | ##### 5、到底应该怎么理解”参数“,几十亿的参数是什么概念,理解成收音机的旋转按钮?跟编程语言的函数参数可以类比吗? 对应到Transformer中的什么地方 295 | ```text 296 | 答:简单点说,参数就是你可以调节的变量。 学术点说,参数是模型训练中可调节的变量和权重,函数中的权重参数,tansformer中的权重和偏置矩阵。 训练的目的,就是找到最佳的参数值。 297 | ``` 298 |
299 | 300 | ##### 6、我讲讲个人朴素的理解,讲的不对请老师和大家指正,信息传递总是会受损的,编码解码过程也会受损,一个人要把自己大脑中的信息讲出来,要编码,信息就会受损,听到的人再在自己的大脑中解码也会受损,但是同对于一个事情,大家大脑中的思考是差不多的 301 | ```text 302 | 答:基本认同,LLM就是在理解语言本身,也即是表示(representation)学习的范畴。大语言模型初步解决了:跨语言同语义问题,同语言长距离(指代)问题等。 303 | ``` 304 |
305 | 306 | ##### 7、当前gpt3.5的语义识别和bert哪个强,同样的语料(比如几万条)微调bert和gpt3.5的ada预训练模型哪个效果好? 307 | ```text 308 | 答:这两个侧重点不同,你关注在上下文信息或语义理解上,就选Bert;关注在任务生成上,就选GPT。侧重点不同。 309 | 310 | 问:比如企业中后台做一些运维操作,对产品的一些自然语言输入需要解析出操作的对象meta信息,然后作为参数调用api后,解析response最终做一个summary返回给用户。 311 | 是不是关注原始输入解析到meta调用api这一步,bert理论上会更有优势? 312 | 但实践中看,langchain调用gpt3.5利用 output_parser效果也不错,调整prompt后没看到多少解析不对的情况,然后应该可以调用agent调完api,结合问题,转到gpt优势领域生成回答了 313 | 所以是不是可以认为除了一些垂直领域如特定情感分析场景,力大砖飞的GPT可以把所有前辈扫到垃圾桶了? 314 | 315 | 答:是这样的,关注原始输入解析到meta信息 理论上bert具有优势 Bert可以学习到更加丰富的上下文信息和语义信息, Bert是有优势的。 316 | 但实际应用比较多样,垂直领域的应用场景具有特定的语言特征和结构,需要更精细的模型进行调整和优化,针对这种特定领域,langchain调用gpt3.5的精调,可能更具有优势。 317 | 不过,对于一些垂直领域,尤其是垂直的狭窄的有很多标注数据的,GPT大语言模型不一定就比其他有针对优化的模型效果更好。 318 | 还是要具体场景具体分析,不过对于应用场景,建议可以把longchain的GPT3.5当成baseline,现在用起来成本不高,而且这个baseline起点不低。 319 | ``` 320 |
321 | 322 | ##### 8、我要做文本分类,text1已经通过llm找到了分类label1了,我将(text1,label1)缓存起来。我想输入侧的text2不经过llm和text1对比拿label,有什么方式吗? 323 | ```text 324 | 答:没太听懂,tex1->label1通过llm做了标注,然后text2不想通过llm了。 那是变成了text2 和tex1的关系来推label2?那你需要挖text2 和text1的关系,特征工程比如词袋模型?然后用传统的SVM机器学习? 325 | ``` 326 |
327 | 328 | ##### 9、向量的比较有余弦相似度等等,这些是不需要经过llm的吧?现在市面上最主流的向量相似度比较方法是什么? 329 | ```text 330 | 答:嗯,不是所有的都需要经过llm的,虽然llm也可以解决。 余弦?欧几里得?曼哈顿?字符串的编辑距离?常用的是这些,应该还有其他的一些。 331 | ``` 332 |
333 | 334 | ##### 10、该怎么理解 transformer 和 langchain 的关系 335 | ```text 336 | 答:简单理解,transfomer是用来训练大模型的,大模型的架构。 langchain是一个应用框架,用来帮助我们开发大模型的端到端应用程序的。 337 | gpt-4/gpt-3.5是一个孤立的模型 + 输入输出interface; 如何用呢,需要其他一些组件,比如数据库、API等,形成一个有机的应用程序。这 338 | 个有机的应用程序,可以是我们一行一行自己开发,也可以基于某个框架来快速开发。 “某个框架”->langchain 339 | ``` 340 | 341 | 便易理解: 342 | - 同学间互相传话(RNNs) 343 | - 老师查小纸条(解码器Decoder) 344 | - 老师叫来每个同学问话(注意力机制Attention) 345 | - 你画我猜(Multi-head Attention) 346 | - 向左看齐(BERT) 347 | -------------------------------------------------------------------------------- /note/笔记10-大模型实战:基于Langchain实现AutoGpt功能.md: -------------------------------------------------------------------------------- 1 | ## 进阶篇:基于LangChain实现网红项目 AutoGPT 2 | 3 | ### 第一部分:课后习题 4 | - 1.实现 LangChain 版本的 AutoGPT 项目的图形化界面。 5 | - [项目代码](../project/langchain_autogpt/autogpt.py) 6 | - [项目启动说明](../project/langchain_autogpt/README.md) 7 | 8 |
9 | 10 | ### 第二部分:相关名词解释 11 | 12 | #### 1、Auto-GPT是什么? 13 | - Auto-GPT是一个实验性的开源应用程序,展示了GPT-4语言模型的能力。 14 | - Auto-GPT由GPT-4驱动,通过链式(Chains)连接LLM “思维(thoughts)”来自主地实现您设定的任何目标。 15 | - 一种基于Agent的AGI 尝试。作为GPT-4完全自主运行的首批示例之一,Auto-GPT 推动了人工智能所能达到的边界。 16 | #### 2、LangChain 版 Auto-GPT 技术方案与架构设计 17 | [Langchain版Auto-GPT 技术方案与架构设计](../resource/Langchain版Auto-GPT技术方案与架构设计.png) 18 | 19 | 20 | ### 第三部分:一些问答 21 | 22 |
23 | -------------------------------------------------------------------------------- /note/笔记11-大模型实战:基于知识库的房产销售Sales-Consultant.md: -------------------------------------------------------------------------------- 1 | ## 进阶篇:基于知识库的房产销售 Sales-Consultant 2 | 3 | ### 第一部分:项目简介 4 | 5 | - Sales-Consultant [业务流程与价值分析](../resource/Sales-Consultant业务流程与价值分析.png) 6 | - Sales-Consultant [技术方案](../resource/基于知识库问答的典型用例.png) 7 | 与[架构设计](../resource/Sales-Consultant技术方案与架构设计.png) 8 | - 使用 GPT-4 生成[销售话术](../resource/销售话术.png) 9 | - [使用 FAISS 向量数据库存储销售问答话术](../resource/使用FAISS向量数据库存储销售问答话术.png) 10 | - 使用 RetrievalQA 11 | 检索销售话术数据,[Top_k](../resource/使用RetrievalQA检索销售话术数据_topk.png),[similarity](../resource/使用RetrievalQA检索销售话术数据_similarity.png) 12 | - [使用 Gradio 实现聊天机器人的图形化界面](../resource/使用Gradio实现聊天机器人的图形化界面.png) 13 | - [实战 LangChain 版 Sales-Consultant](../project/langchain_sales_chatbot) 14 | 15 | - [Apple-AI销售小助手](../project/langchain_sales_chatbot/files/Apple-AI销售小助手.png) 16 | ![图片格式](../project/langchain_sales_chatbot/files/Apple-AI销售小助手.png) 17 | - [房地产-AI销售小助手](../project/langchain_sales_chatbot/files/房地产-AI销售小助手.png) 18 | ![图片格式](../project/langchain_sales_chatbot/files/房地产-AI销售小助手.png) 19 | 20 | 21 | ### 第二部分:课后习题 22 | - 扩展销售机器人(sales_chatbot)项目,应用于不同的销售场景,如:电器、家装、教育等。 23 | - [项目代码](../project/langchain_sales_chatbot/sales_chatbot.py) 24 | - [项目启动说明](../project/langchain_sales_chatbot/README.md) 25 | 26 |
-------------------------------------------------------------------------------- /note/笔记2-大模型基础:理论与技术的演进.md: -------------------------------------------------------------------------------- 1 | ## 基础篇:大模型基础--理论与技术的演进(第二节课) 2 | 3 | ### 第一部分:课后习题 4 | 5 |
6 | 7 | #### 单选题: 8 | 9 | ```text 10 | GPT-1 在哪些方面相较于传统的语言模型取得了突破? 11 | A. 引入了深度学习框架 12 | B. 利用生成式预训练改善语言理解 13 | C. 实现了图像识别的功能 14 | D. 增加了自我监督学习的机制 15 | 答:B 16 | 17 | 对于 ChatGPT 来说,其主要的优势是什么? 18 | A. 高性能的图像识别 19 | B. 自然且连贯的对话生成 20 | C. 精确的数学运算 21 | D. 音乐创作能力 22 | 答:B 23 | 24 | GPT-4 相比于 GPT-3.5 主要的技术进步是? 25 | A. 提升了模型的大小 26 | B. 增加了对话能力 27 | C. 引入了图像识别能力 28 | D. 加强了音乐创作能力 29 | 答:C 30 | 31 | 以下哪项技术是与"Chain-of-Thought"最相关的? 32 | A. 一元语法分析 33 | B. 多路径推理 34 | C. 自洽性分析 35 | D. 情感分析 36 | 答:C ❌(正确答案:B) 37 | 38 | “Tree-of-Thoughts” 的主要作用是? 39 | A. 实现多轮对话 40 | B. 提升语义理解 41 | C. 提供多路径推理 42 | D. 改善模型对话的连贯性 43 | 答:B ❌(正确答案:C) 44 | 45 | GPT-1 的主要研究目标是? 46 | A. 多语言模型训练 47 | B. 通过生成式预训练改善语言理解 48 | C. 实现机器自主创作 49 | D. 多媒体信息处理 50 | 答:B 51 | 52 | 在 GPT-2 中,"模型是无监督多任务学习者"的概念是如何实现的? 53 | A. 通过对话管理 54 | B. 通过多任务联合训练 55 | C. 通过生成式预训练和特定任务微调 56 | D. 通过强化学习训练 57 | 答:C 58 | 59 | GPT-3 的主要特点是? 60 | A. 用极少的样本就可以实现学习 61 | B. 实现了自主创作 62 | C. 优化了对话管理能力 63 | D. 引入了情感分析功能 64 | 答:C ❌ (正确答案:A) 65 | 66 | GPT-4 的训练中,使用了什么新的技术? 67 | A. 情感分析 68 | B. 图像识别 69 | C. 混合专家系统 70 | D. 生成对抗网络 71 | 答:B ❌ (正确答案:C) 72 | 73 | "Self-Consistency: Multi-path Reasoning"的主要目标是? 74 | A. 提升模型的情感理解能力 75 | B. 提升模型对话的连贯性 76 | C. 通过多路径推理,增强模型的自洽性 77 | D. 提升模型的创作能力 78 | 答:A ❌ (正确答案:C) 79 | ``` 80 | 81 | #### 多选题 82 | 83 | ```text 84 | 下列哪些选项是描述 GPT-1 的特点? 85 | A. 利用生成式预训练提升语言理解能力 86 | B. 实现了机器自主创作 87 | C. 可以进行多语言模型训练 88 | D. 引入了情感分析功能 89 | 答:A 90 | 在处理对话任务时,ChatGPT 具有哪些优势? 91 | A. 高性能的图像识别 92 | B. 自然且连贯的对话生成 93 | C. 精确的数学运算 94 | D. 音乐创作能力 95 | 答:B 96 | "Chain-of-Thought"与以下哪些概念相关? 97 | A. 一元语法分析 98 | B. 多路径推理 99 | C. 自洽性分析 100 | D. 情感分析 101 | 答:B、C 102 | 在 GPT-3 的研究中,哪些是其主要特点? 103 | A. 用极少的样本就可以实现学习 104 | B. 实现了机器自主创作 105 | C. 优化了对话管理能力 106 | D. 引入了情感分析功能 107 | 答:C ❌ (正确答案:A) 108 | 在 GPT-4 的开发中,哪些新的技术被采用? 109 | A. 混合专家系统 110 | B. 生成对抗网络 111 | C. 情感分析 112 | D. 图像识别 113 | 答:C、D ❌ (正确答案:A) 114 | ``` 115 | 116 | ### 第二部分:相关名词解释【已完成整理】 117 | 118 |
119 | 120 | #### 1、Prompt Engineering(提示工程)(又称:Prompt Turing) 是人工智能中的一个领域,主要研究如何设计有效的提示或引导,以帮助用户或模型更好地完成特定任务。 121 | - 职责:如何 `找到最优的提示` 以提高模型的性能。 122 | - Prompt技术(不调模型,引导模型更好输出),是使用预训练语言模型的一系列方法的总称,这些方法不会修改模型的权重。目的都是通过不同的方式来更好的引导模型的输出。主要包括: 123 | ```text 124 | In-Context-Learning(上下文学习): 125 | zero-shot 直接问不给样例 126 | one-shot 给一个样例 127 | few-shot 给多个样例 128 | Prompt learning 给一定的背景提示内容,使得大语言模型可以更好的理解问题 129 | Chain of Thoughts 思维链,Let‘s think step by step 130 | self-consistency 自洽性强调内部逻辑一致,不存在推理逻辑矛盾 131 | Tree of Thoughts 多路径推理,多方位、多角度观察问题 132 | Instruction-Tuning(指令微调):也属于Prompt范畴,通过指令性的提示,引导大语言模型输出。 133 | ``` 134 | - Fine Tuning(模型的微调方法): 135 | ```text 136 | Supervised Fine-Tuning(SFT,有监督的微调):喂给大模型一定的人工标注的训练数据,让模型习得将输入映射到预期的输出。 137 | ``` 138 | - 总结: 139 | ```text 140 | Prompt技术,主要关注如何通过提供更好的提示来生成更符合用户需求的文本 141 | Supervised Fine-Tuning,主要关注模型在新任务上的性能改进 142 | ``` 143 |
144 | 145 | #### 2、什么是In-context learning(上下文学习)?什么是Zero-shot, One-shot, Few-shot?【是一种Prompt技术】 146 | 147 | ```text 148 | In-context Learning关注的是如何 `利用` 输入序列中的 `上下文信息` 来影响模型的输出。 149 | 是一种让模型根据给定的几个实例来理解任务并给出答案的学习方法,可以提高模型的泛化能力和适应性,帮助模型更好地理解和处理新的任务和数据。 150 | 151 | 常见的方法:Zero-shot, One-shot, Few-shot。 152 | 目的:主要是解决模型因为训练数据少,导致模型泛化能力差的问题。 153 | 154 | Zero-shot 是在没有接受任何示例训练的情况下,通过适当的提示来进行任务。这需要模型具备广泛的泛化能力,能够从提示中理解任务的要求并生成合适的回答。 155 | One-shot 是在接受仅一个示例训练的情况下,通过提示来进行任务。尽管只有一个示例,但模型试图从这个示例中学到足够的信息,以在新情境中进行泛化。 156 | Few-shot 是在接受少量示例训练的情况下,通过提示来进行任务。这种方法允许模型在少量示例上进行训练,从而在新的情境中产生更好的结果。 157 | 158 | 例如,当你在学习新的单词时,将它们放入句子中以及使用它们,有助于更好地理解它们的含义和用法。这种学习方式强调将知识放入实际情境中,从而更好地理解和记忆。 159 | 在例如:多轮对话中的记忆上下文可以被看作是 "in context-learning" 的一种表现。 160 | ``` 161 | 162 |
163 | 164 | #### 3、什么是Prompt Learning?【是一种Prompt技术】 165 | ```text 166 | Prompt Learning 关注的是如何通过设计 `有效的提示` 来 `引导` 模型的输出。 167 | 举例: 168 | 请根据以下提示,生成一篇关于“气候变化对农业的影响”的文章: 169 | 随着全球气候的不断变化,农业生产面临着越来越大的挑战。极端气候事件,如干旱、洪涝、高温等,对农作物的生长和产量造成了严重影响。此外,气候变化还会导致病虫害的发生和传播,对农业生产带来了更大的压力。因此,我们需要采取有效的措施来应对气候变化对农业的影响,保障粮食安全。 170 | 请结合相关研究和案例,详细阐述气候变化对农业的具体影响,以及农业生产者、政策制定者和科学家应如何采取措施应对这些挑战。 171 | ``` 172 | 173 |
174 | 175 | #### 4、什么是Chain of Thought(思维链) and Self-Consistency(自洽性)and Tree of Thoughts(思维树)?【是一种Prompt技术】 176 | 177 | ```text 178 | Chain of Thought(CoT):下面例子中,使用逐步扩展的方式呈现"Chain of Thought",每一步回答都基于前一步的回答,逐步构建了关于"XXXX"的思维链。这种逐步展开的方式可以更清晰地向用户解释一个复杂问题的多个方面。 179 | 举例1:User: "为什么要保持身体健康?" 180 | Model: "保持身体健康对于个人的各个方面都非常重要。" 181 | Model: "首先,身体健康可以提高生活质量。" 182 | Model: "这意味着你能够更好地享受生活,从事你喜欢的活动,而不会受到体力上的限制。" 183 | Model: "此外,保持身体健康还有助于预防疾病。" 184 | Model: "通过均衡的饮食和适度的运动,你可以降低患上许多慢性疾病的风险,如心脏病和糖尿病。" 185 | Model: "另外,身体健康也与心理健康紧密相关。" 186 | Model: "运动可以释放身体内的化学物质,有助于减轻压力和焦虑,提升情绪状态。" 187 | Model: "最后,保持身体健康可以增强免疫系统。" 188 | Model: "一个强健的免疫系统能够更好地应对疾病和感染,使你的身体更有抵抗力。" 189 | 经典的提示词:Let‘s think step by step! 190 | 191 | 举例2:首先,我们需要找出这个问题的关键信息;其次,我们需要将问题转换为数学表达式;最后,我们通过解方程来求解这个问题 192 | 193 | self-consistency(s-c):确保了模型的回答在逻辑上是合理和可靠的。 194 | 举例:User: "狗的寿命通常有多长?" 195 | Model: "狗的寿命通常因狗的品种和大小而异。较小的狗品种,如吉娃娃,通常寿命更长,可以活到12-20岁。而大型犬,如圣伯纳德,寿命可能较短,大约8-10岁。" 196 | 在这个回答中,大语言模型展示了自洽性,它在内部逻辑上保持一致。模型首先指出寿命与狗的品种和大小有关,然后在具体的品种范围内提供了寿命范围。这种逻辑一致性使得回答更加可信,读者不会在回答中找到矛盾之处。 197 | 198 | Tree of Thoughts(ToT):表现为模型在回答问题时按照层次结构组织信息,从整体到细节展开,呈现出一种层次性的结构。 199 | 举例:User: "手机的重要性是什么?" 200 | Model: "手机在现代社会中具有重要的地位。从整体来看,手机在以下几个方面具有重要性:通信、信息获取和社交。在通信方面,手机是人们日常交流的重要工具,通过电话、短信和社交媒体,人们可以随时保持联系。信息获取是另一个重要方面,手机让我们能够在任何时候获取新闻、知识和娱乐内容。此外,手机也在社交方面发挥着作用,通过社交应用,人们可以与朋友、家人保持联系,甚至结识新的朋友。总之,手机在多个层面上都具有重要的作用,成为了人们生活中不可或缺的一部分。" 201 | 在这个回答中,大语言模型使用了"Tree of Thoughts"的结构,从整体重要性开始,逐步展开到通信、信息获取和社交这三个子主题。每个子主题又分别进一步解释和展开。这种层次性的组织方式帮助读者更清楚地理解回答,从整体到细节逐步展示信息,让回答更具有结构性和连贯性。 202 | 扩充:在ToT框架内,可以根据树结构插入和使用不同的搜索算法。作者探索了两种相对简单的搜索算法,并将更高级的算法(例如AlphaGo(AlphaZero) 蒙特卡洛树搜索(MCTS))留给未来的工作,TOT-BFS广度优先算法、深度优先搜索(ToT-DFS)) 203 | 204 | 总之,"Chain of Thought"是思维按照线性顺序连接的方式,"Self-Consistency"是思想和回答内部保持逻辑一致性,而"Tree of Thoughts"是将思维层次化地组织成树状结构。 205 | ToT包含SC,SC包含CoT 206 | ``` 207 | 208 |
209 | 210 | #### 5、什么是Instruction-Tuning(指令微调)?【是一种Prompt技术】 211 | ```text 212 | 也属于Prompt范畴,通过指令性的提示,引导大语言模型输出。 213 | 指令微调例子: 214 | 原始指令:生成一段描述夏季的天气的文本。 215 | 微调后的指令:生成一段描述夏季阳光明媚、温度适宜的天气的文本。 216 | ``` 217 | 218 | 219 | #### 6.其他Prompt技术技巧 220 | ```text 221 | Pattern-based Prompts:使用特定的模式或结构化的提示来引导模型生成回答。例如,使用 "What is" 或 "Explain" 这样的模式来获取解释性的回答。 222 | Cloze-style Prompts:使用不完整的句子或段落,缺少关键信息,让模型填补缺失部分。例如,"The capital of France is ___." 可以引导模型填写空缺。 223 | Generative Prompts:提供一个开放式的提示,要求模型自由生成相关的回答。例如,"Tell me about" 后面可以是任何话题。 224 | Adversarial Prompts:引入对抗性元素,让模型在不受到敌对输入的干扰下生成鲁棒的回答。 225 | Rewrite Prompts:对初始提示进行重写或改写,以使其更清晰、精确或特定。 226 | Explanation-based Prompts:要求模型不仅给出回答,还要解释其回答的原因或过程。 227 | Comparison Prompts:要求模型比较两个或多个概念、选项等,并给出有关它们的回答。 228 | Scenario-based Prompts:在特定场景下设置提示,以促使模型生成在该场景中有意义的回答。 229 | Socratic Prompts:通过连续提问,引导模型逐步生成更深入的回答,类似于哲学上的苏格拉底式讨论。 230 | ``` 231 | 232 |
233 | 234 | ![avatar](../resource/prompt.png) 235 | 236 | ### 第三部分:一些问答【有些混乱,待整理】 237 | 238 | #### 1、SFT fine-tuning、fine-turning 和 Instruction-Tuning的区别? 239 | 240 | ```text 241 | 答:Fine-tuning:微调 242 | SFT(Supervised Fine-Tuning):有监督的微调 243 | Instruction-Tuning:指令微调 244 | 245 | 1.Fine-tuning: 这是一种通用的深度学习训练策略,通常在预训练模型基础上进行,以适应新任务。通过对预训练模型的参数进行微调,使模型能够在特定任务上表现更好。 246 | 2.SFT: 这是一个监督学习过程,即通过人工标注的训练数据集来调整模型的参数。在这个过程中,模型学习将输入映射到预期的输出。SFT就是一种Fine-tuning的策路。 247 | 3.Instruction-Tuning: 是OpenAI提出的一种新的训练方法。通过向模型提供人类编写的指导性指令,对模型进行训练和调整。主要用于增强模型对特定指令的响应。 248 | 这些指令可以是对输入输出的期望行为描述,如"重要性:高;可读性:中;重要性:低",从而控制模型在生成文本时更好地满足用户需求。使模型能够正确理解并生成预期的输出。 249 | 250 | Prompt和Instruction都是用于指导模型生成输出的文本,不对模型的权重进行修改; fine tunning会对模型的权重进行修改。 Prompt和Instruction比较相似,关注的目标不一样。 251 | ``` 252 | 253 |
254 | 255 | 256 | ##### 2、我要用大模型做分类,我用openai的finetune,效果很好,6w条语料4轮epoch可以到0.94accuracy。但是高质量的语料标注是个难活。我朋友告诉我,prompt-tuning用的语料更少,而语料治疗要求没那么高,而效果更好。 257 | 258 | ```text 259 | 文本分类是一个经典下游任务,如果你的语料本身并没有给使用的OpenAI基础模型增加额外的知识,那么prompt-tuning确实是更有性价比的 260 | 关于prompt-based learning目的是让大家理解如何从 standard prompt 演进到适用性极高的 ToT 的。 261 | ``` 262 | 263 |
264 | 265 | ##### 3、思维链,是指提示词提问时的思维链,还是模型回答问题时运用思维链来回答?我的理解是后者,因为昨天的后半程课,全程讲的是模型在回答问题时的思维链逻辑推理,但是助教直播间说的是提示词提问时用思维链方式。能捋一捋吗?昨天并没有讲什么样的提示词规则更高效 266 | 267 | ```text 268 | 对于一个模型在回答问题时的思维链逻辑推理,可以将其理解为模型对输入问题进行处理和分析的过程。这个过程可以看作是一种思维链,其中模型通过触发不同的关联或推理机制来生成答案。 269 | 当使用提示词提问时,思维链方式可以指引你以一种递进的思考方式来构建问题。你可以从一个提示词出发,将其作为起点,然后依次深入探索相关的概念、关联或细节,构建一个连贯的问题链条。每个问题都基于前一个问题的答案或信息,从而逐步扩展和深化对问题的理解。 270 | 通过思维链方式提问可以帮助你更系统地探索和获取信息,从而得到更准确、全面的回答。这种方法可以用于讨论复杂的主题、解决问题或促进深入思考和探索。 271 | ``` 272 | 273 |
274 | 275 | ##### 4、请教一个小小问题 我看观看视频时 发现如图中的关于Encoder-decoder Architecture的公式和图示 虽然是引自原论文 但我认为高亮部分的公式和Sample是有差异的: 276 | 277 | 1. 公式中:hi是encoder的hidden state, cj是context vector为了计算出decoder的hidden state(有点类似hi是输入cj是输出), 278 | 所以attention weights即aij的角标关系是先i后j, 即先hi输入后cj输出 279 | 2. 但Sample公式中:c2 = a21·h1 + a22·h2 + a23·h3 其attention weights即aij的角标关系是先j 后i, 其实与公式正好相反, 280 | 我觉得这个Sample的算式表达是有问题的 281 | 282 | ![avatar](../resource/笔记2-3-4.1.png) ![avatar](../resource/笔记2-3-4.2.png) 283 | 284 | ```text 285 | 答:要理解这个问题呢,有几个关键第一个就是这个角标你提的很好,l和J在这个表格里面呢,其实我们能看到1呢,其实是指输入我们的encounter编码器的隐藏状态。Hi这个1表示的是输入的一个特定位置,J是输出,就是我们的这个 dcoder,我们的解码器想要去定位的那个位置,就那个特定的词,所以I通常指的是我们图当中的们的比如说 S2Y2 这样的一个输出这个是没问题的,然后在表格里面呢,其实我们能看到它的逻辑是顺畅的,就是我们用 CJ。就是表达我们输出的地接一个隐藏层的状态它是由这个矩阵乘上每一个输入乘出来的的和。 286 | 至于在那个图例里面,为什么感觉好像它的角标倒过来了啊,我的理解啊,个人的理解,作者这里呢更多的是想通过这个图例来表达含义。但是在这里呢,其实就。某种层面上把这个阿尔法这个矩阵,他做了一个转制啊,做这个转制也是为了这个图做的更好看,因为你看这个图中呢,其实中间那一部分是一个神经网络,然后这个神经网络的输出呢,是一个S。然后呢,它的这个每一每一行是一个 S,每一列呢,上面又变成了一个H,这个顺序呢,就跟我们其实正常认为的应该输入是H,输出是 S,有点倒过来了,所以它是为了这个图例的表达方便。我理解在图例当中,把这个阿尔法矩阵做了一个转制,对就相当于它的行和列做了一次交换 287 | 但就理解公式而言,你从表格来看是没有问题的,就表格可能会更明确一点,不管是S还是 C,其实都表达的是解码层的一个特定位置的隐藏成状态,或者它对应的上下文向量,那么对应的这个位置这个J就比如说我们这里看到的 S2 或者C2,都是说锚定了一个输出的位置,然后把这个。腾讯 which,就是我们的注意力权重和对应的输入的这个hi去做相乘,然后再做这个西格玛,就是把它求和,这个逻辑是没问题的。核心就是这里我理解是为了图的表达形式上更直观,做了一次转制的一个展示啊,这我个人的理解。 288 | 289 | 回复:好的 明白了 非常感谢彭老师的细致解答 我一开始也是感觉把矩阵转置了 但没明白为什么要转置 你说NN剪头对应输出所以横向是输出S 这么说的话确实有道理 我还特意重画了一下  290 | ``` 291 | 292 |
293 | 294 | ##### 5、有监督学习和无监督学习,远程监督是啥意思 295 | 296 | ```text 297 | 答:有监督,就是你需要标注信息,在给机器学习。 无监督就是你直接可以给,不需要进行标注。 298 | 远程监督是一种半监督学习方法,它的基本思想是利用已有的知识库自动生成标注数据。在远程监督中,模型会利用知识库中的实体和关系信息,自动标注相关的文本数据, 299 | 然后使用这些标注数据训练模型。相对于有监督学习,远程监督可以减少标注数据的工作量,但标注数据的质量受到知识库的影响。 300 | ``` 301 | 302 |
303 | 304 | ##### 6、GPT-4相较GPT-3、GPT-3.5的优势 305 | 306 | ```text 307 | 答: 308 | 1. 多模态模型: GPT-4支持图像输入,出色的视觉信息理解能力使得GPT-4能对接更多样化的下游任务, 309 | 如:描述不寻常图像中的幽默、总结截屏文本以及回答包含图表的试题。在文本理解能力上,GPT-4 在中 文和多轮对话中也表现出远超 GPT-3.5 的能力。 310 | 2. 扩展上下文窗口:gpt-4 and gpt-4-32k 分别提供了最大长度为8192和32768个token的上下文窗口。 311 | 这使得 GPT-4可以通过更多的上下文来完成更复杂的任务,也为 思维链(CoT)、思维树(ToT)等后续工作提供 了可能。 312 | 3. GPT+生态 :借助GPT-4强大能力,依托 ChatGPT Plugin 搭建AIGC应用生态商店(类似 App Store) 313 | 4. 应用+GPT :GPT-4已经被应用在多个领域,包括微软Office、Duolingo、Khan Academy等。 314 | ``` 315 | 316 |
317 | 318 | ##### 7、如何使用BERT进行文本分类 319 | 320 | ```text 321 | - 数据准备:首先,准备你的文本分类数据集。数据集应包含标记好的文本样本和对应的类别标签。确保你有足够的数据用于训练、验证和测试。 322 | 323 | - BERT模型选择:选择适合你任务的BERT模型。BERT有不同的变体和大小,如BERT-Base、BERT-Large等。较大的模型通常有更多的参数和更强的表示能力,但训练和推理的速度也更慢。 324 | 325 | - 数据预处理:对文本数据进行预处理,使其适应BERT模型的输入格式。首先,将文本切分成词(Word Piece Tokenization),并将每个词转换为对应的词ID。然后,添加特殊标记(如"[CLS]"和"[SEP]")以表示句子的开始和结束。如果需要,还可以进行填充和截断操作,以保证输入序列的长度一致。 326 | 327 | - 模型搭建:根据选择的BERT模型,在代码中构建相应的模型结构。可以使用开源的深度学习框架(如TensorFlow、PyTorch)提供的BERT模型实现,或者使用预训练的BERT权重进行加载。 328 | 329 | - 模型训练:使用准备好的数据集对BERT模型进行训练。在训练过程中,使用适当的优化器(如Adam)和损失函数(如交叉熵损失函数)进行参数更新。根据需要,可以使用验证集进行模型的调优和超参数选择。 330 | 331 | - 模型评估:在训练完成后,使用测试集评估模型的性能。计算分类准确率、精确率、召回率、F1值等指标来评估模型的表现。 332 | 333 | - 推理预测:使用训练好的BERT模型进行推理预测。将待分类的文本转换为BERT模型的输入格式,并通过模型的前向传播获取分类结果。 334 | 335 | 注意:模型训练 <> 预训练。模型训练是指在预训练的基础上进行的微调训练,而不是指BERT的初始预训练过程 336 | ``` 337 | 338 | ##### 8、实际案例:A使用 bert 做文本分类,然后每个epoch的loss不是一直下降的,accuracy也不是一直上升的。目前样本量级只有几十条。 339 | 340 | ```text 341 | 解决问题的思路可以关注以下2点。 342 | 1. 数据工程,需要关注样本量级,是否平衡,特征选择和清洗等预处理 343 | 2. 模型工程,需要关注参数是否是最佳值,例如 lr, rc, batch_size...,还有可能关注下BERT是否已经达到天花板,是否需要更大的模型 344 | 也可以换另外一种做法,把样本扔到嵌入模型取最终向量,在去训练一个分类器,这样更加的快速 345 | 346 | 现在看起来是欠拟合,你可以尝试加多数据量来解决。这点数据量模型都跑不起来的,用嵌入模型的结果在去sklearn做个简单的分类器(这个步骤是:下游任务的分类训练),就可以得到一个比较好的结果了 347 | 总结:目前这个案例中是在模型微调训练阶段的数据集太少了 348 | ``` 349 | 350 | 小点:相同也可以换站点,换了站点一般ip就换了。关闭chrome, 换站点, 换完后电脑重启一下,我遇到后大部分是这三步同时进行,印象中是100%解决。 351 | -------------------------------------------------------------------------------- /note/笔记3-大模型实战:Embedding.md: -------------------------------------------------------------------------------- 1 | ## 基础篇:大模型实战--Embedding(第三节课) 2 | ### 第一部分:课后习题 3 |
4 | 5 | #### 单选题: 6 | ```text 7 | 1、以下哪个观点更接近“图灵测试”的原则? 8 | A. 人工智能必须具备自我意识。 9 | B. 人工智能能够通过模拟人类行为来欺骗人类。 10 | C. 人工智能必须能够编写代码。 11 | D. 人工智能必须能够理解情感。 12 | 答:B 13 | 14 | 2、计算机数据表示的基本单位是什么? 15 | A. 字节 16 | B. 比特 17 | C. 像素 18 | D. 矩阵 19 | 答:B 20 | 解释:"图灵测试"的原则是,如果一个机器的行为无法被一个普通的人类观察者区分出来,那么我们可以认为这个机器是智能的。 21 | 22 | 3、在机器学习中,表示学习的主要目标是什么? 23 | A. 最小化损失函数 24 | B. 寻找数据的最佳表示 25 | C. 增加模型的准确性 26 | D. 避免过拟合 27 | 答:B 28 | 29 | 4、Word2Vec 模型主要用于什么任务? 30 | A. 图像分类 31 | B. 语音识别 32 | C. 单词嵌入学习 33 | D. 时间序列预测 34 | 答:C 35 | 解释:Word2Vec是一种流行的词嵌入模型,它的主要任务是学习词向量,这些向量能够捕捉词的语义和语法信息 36 | 37 | 5、GloVe 模型是用来做什么的? 38 | A. 全局词向量表示学习 39 | B. 局部词向量表示学习 40 | C. 分类任务 41 | D. 回归任务 42 | 答:A 43 | 解释:全称Global Vectors for Word Representation,是一个用于学习全局词向量表示的模型 44 | 45 | 6、以下哪种方法不属于无监督词嵌入的评估方法? 46 | A. 直接比较词向量 47 | B. 使用词向量进行下游任务 48 | C. 通过标签预测词向量 49 | D. 利用词向量完成类比任务 50 | 答:C 51 | 解释:通过标签预测词向量是有监督的词嵌入评估方法,而无监督的词嵌入评估方法通常包括直接比较词向量、使用词向量进行下游任务和利用词向量完成类比任务等。 52 | 53 | 7、OpenAI Embeddings 主要用于什么? 54 | A. 处理图像数据 55 | B. 提供语言模型预训练 56 | C. 对音频数据进行分类 57 | D. 分析社交媒体数据 58 | 答:B 59 | 60 | 8、以下哪个方法不属于词嵌入方法? 61 | A. Word2Vec 62 | B. GloVe 63 | C. FastText 64 | D. VGG16 65 | 答:D 66 | 解释:VGG16 是一种用于处理图像数据的卷积神经网络 67 | 68 | 9、词嵌入模型的主要目标是什么? 69 | A. 最小化预测错误 70 | B. 捕捉词义和语法关系 71 | C. 提高词汇表的覆盖率 72 | D. 减少模型的训练时间 73 | 答:A ❌ (正确答案:B) 74 | 解释:词嵌入模型的主要目标是捕捉词义和语法关系,通过将词映射到高维空间中,相似的词在空间中的位置会更接近。 75 | 76 | 10、在表示学习中,以下哪一种是最常用的表示方式? 77 | A. 图像 78 | B. 词向量 79 | C. 音频波形 80 | D. 视频帧 81 | 答:B 82 | 83 | “表示学习”主要是指什么? 84 | A. 学习数据的原始表示 85 | B. 学习数据的有用表示 86 | C. 学习数据的随机表示 87 | D. 学习数据的复杂表示 88 | 答:B 89 | 90 | 在 NLP 中,最常用的数据表示方法是什么? 91 | A. 图像 92 | B. 视频 93 | C. 文本 94 | D. 音频 95 | 答:C 96 | 97 | Word2Vec 是一个什么样的模型? 98 | A. 用于语音识别的模型 99 | B. 用于图像识别的模型 100 | C. 用于词表示学习的模型 101 | D. 用于视频处理的模型 102 | 答:C 103 | 104 | GloVe 模型的主要目标是什么? 105 | A. 在给定的文本中找到最频繁出现的词 106 | B. 在给定的文本中找到最少出现的词 107 | C. 在给定的文本中找到相关性最强的词 108 | D. 在给定的文本中找到最不相关的词 109 | 答:C 110 | 111 | 表示学习在自然语言处理中的主要应用是什么? 112 | A. 语音识别 113 | B. 语义理解 114 | C. 图像识别 115 | D. 视频处理 116 | 答:B 117 | 118 | Word2Vec 和 GloVe 有什么共同点? 119 | A. 都是图像识别模型 120 | B. 都是词表示学习模型 121 | C. 都是语音识别模型 122 | D. 都是视频处理模型 123 | 答:B 124 | 125 | 在 OpenAI Embeddings 中,一般采用什么方法对词进行表示? 126 | A. 用一个唯一的 ID 表示 127 | B. 用一个独热向量表示 128 | C. 用一个实数向量表示 129 | D. 用一个复数向量表示 130 | 答:C 131 | 132 | 在词向量中,词的相似度通常用什么衡量? 133 | A. 欧氏距离 134 | B. 余弦相似度 135 | C. 曼哈顿距离 136 | D. 切比雪夫距离 137 | 答:B 138 | 139 | 在表示学习中,为什么要用非监督学习? 140 | A. 因为监督学习太复杂 141 | B. 因为监督学习无法处理大数据 142 | C. 因为监督学习需要太多的标签数据 143 | D. 因为监督学习效果不好 144 | 答:C 145 | 146 | 在表示学习中,主要使用哪种方法来优化词向量? 147 | A. 用反向传播优化 148 | B. 用随机梯度下降优化 149 | C. 用动量法优化 150 | D. 用牛顿法优化 151 | 答:B 152 | 153 | ``` 154 | 155 | #### 多选题: 156 | 157 | ```text 158 | 1、以下哪些是评估词嵌入的常用方法? 159 | A. 完成类比任务 160 | B. 用于下游任务 161 | C. 直接比较词向量 162 | D. 使用神经网络训练 163 | 答:A|B|C 164 | 165 | 2、表示学习的主要目标包括哪些? 166 | A. 找到数据的最佳表示 167 | B. 提升模型的预测能力 168 | C. 降低计算成本 169 | D. 优化模型参数 170 | 答:A|B|D 171 | 172 | 3、以下哪些选项是计算机数据表示的基本单位? 173 | A. 比特 174 | B. 字节 175 | C. 千字节 176 | D. 兆字节 177 | 答:A|B 178 | 解释:比特是最基本的单位,而字节是常用的存储单位,千字节和兆字节通常用于表示大量数据。 179 | 180 | 4、Word2Vec 的训练过程主要包括哪些步骤? 181 | A. 对文本进行分词 182 | B. 计算词与词之间的关联 183 | C. 用神经网络学习词嵌入 184 | D. 调整模型参数以最小化预测错误 185 | 答:A|B|C|D 186 | 187 | 5、在表示学习中,以下哪些任务通常会受益于好的表示? 188 | A. 图像分类 189 | B. 语音识别 190 | C. 文本生成 191 | D. 视频理解 192 | 答:A|B|C|D 193 | ``` 194 | #### 编程题:请用自己的数据和 prompt 来测试下方链接中的代码 195 | - [代码](../project/openai_api/3.class_embeddings.ipynb) 196 | 197 | ### 第二部分:相关名词解释 198 |
199 | 200 | ##### 1、表示学习是什么?表示学习的代表? 201 | ```text 202 | 答:表示学习就是帮助计算机把原始的、不直观的数据转换成容易处理的形式。 203 | 比如,计算机要识别图片中的猫,它不懂图片的内容,只能看到像素点的数字。而表示学习的任务就是教会计算机如何把这些数字转换成能够描述猫的特征,比如圆圆的脸、 204 | 尖尖的耳朵等。这样,计算机在看到新的图片时,就可以利用这些学到的特征来判断是否是猫。 205 | 代表如:Embedding、Word2Vec(一种用于学习词向量表示的算法)、自编码器(Autoencoder)等 206 | ``` 207 | ##### 2、Embedding(嵌入)是什么?举例说明。 208 | ```text 209 | 答:Embedding 是表示学习的一种方法。在机器学习和自然语言处理领域,Embedding(嵌入)通常指的是将离散型数据(如单词、词语、类别等)映射到连续型向量空间中的过程。 210 | Word Embedding(词嵌入)、Image Embedding(图像嵌入),将单词或图像映射到向量空间来表示一个物体的方法。 211 | 举个例子,如果我们有一句话“我喜欢机器学习”,Embedding 就会将这个句子转换成一个固定长度的数字向量。这个向量会编码句子中的关键信息,比如“喜欢”、“机器学习”等内容。 212 | ``` 213 | ##### 3、Word2Vec是什么?举例说明。 214 | ```text 215 | 答:Word2Vec是一种用于学习词向量表示的算法。它的任务是将这些句子中的每个单词转换成向量。这些向量能够反映单词之间的语义关系,就像把单词映射到向量空间中的某个位置。 216 | 举个例子:我们假设Word2Vec把“喜欢”这个单词映射成一个二维向量[0.5, 0.8],而“深度学习”这个单词映射成[-0.3, 0.6],以此类推。 217 | 现在,这些向量的有趣之处在于它们捕捉了单词之间的语义关系。例如,两个喜欢某种学习的人(比如“我喜欢机器学习”和“他喜欢深度学习”),它们对应的向量在向量空间中可能会很接近, 218 | 因为它们的语义相似。而与学习无关的单词,比如“她热爱自然语言处理”,对应的向量可能会与前面的向量有一定的距离,因为它们在语义上没有那么相似。 219 | ``` 220 | 221 | 222 | 223 | ### 第三部分:一些问答 -------------------------------------------------------------------------------- /note/笔记4-大模型实战:OpenaiModels.md: -------------------------------------------------------------------------------- 1 | ## 基础篇:大模型实战--OpenAI开发(第四节课) 2 | 3 | ### 第一部分:课后习题 4 | 5 |
6 | 7 | #### 编程题:请用自己的数据和 prompt 来测试下方链接中的代码 8 | - [class_models](../project/openai_api/4.class_models.ipynb) 9 | - [example_chat_completion](../project/python/example_chat_completion.py) 10 | - [class_tiktoken](../project/openai_api/4.class_tiktoken.ipynb) 11 | 12 | 13 | ### 第二部分:相关名词解释 14 | #### 1.completion 与chat completion 15 | 16 | #### 2.ChatCompletion不同的角色有什么差异 17 | 18 |
19 | 20 | ### 第三部分:一些问答 21 | 22 |
23 | -------------------------------------------------------------------------------- /note/笔记6-大模型实战:OpenaiTranslator实战总结.md: -------------------------------------------------------------------------------- 1 | ## 基础篇:学习笔记——实现 OpenAI-Translator V2.0 特性 2 | 3 | ### 1. 引言 4 | 在极客时间《AI 大模型应用开发实战营》中,我学习了 AI 大模型的应用开发,并且根据所学内容开发了进阶版本的 OpenAI-Translator。这个版本需要实现四个主要特性:支持图形用户界面(GUI),添加对保留源 PDF 的原始布局的支持,服务化以 API 形式提供翻译服务支持,以及添加对其他语言的支持。在完成作业的过程中,我记录了关键步骤、方法以及学习心得,下面将进行详细介绍。 5 | 6 | ### 2. 实现步骤 7 | #### 2.1 支持图形用户界面(GUI) 8 | 要支持 GUI,我选择使用 Python 的 Tkinter 库。首先,我创建了一个基本的 GUI 窗口,并添加了文本输入框和翻译按钮。用户可以在文本输入框中输入待翻译文本,然后点击翻译按钮触发翻译功能。 9 | 10 | ```python 11 | import tkinter as tk 12 | from tkinter import messagebox 13 | 14 | def translate_text(): 15 | # 获取文本输入框中的待翻译文本 16 | input_text = text_input.get("1.0", "end-1c") 17 | 18 | # 调用 OpenAI-Translator V2.0 进行翻译 19 | translated_text = openai_translator_v2.translate(input_text) 20 | 21 | # 显示翻译结果 22 | text_output.delete("1.0", "end") 23 | text_output.insert("1.0", translated_text) 24 | 25 | # 创建主窗口 26 | root = tk.Tk() 27 | root.title("OpenAI-Translator V2.0 GUI") 28 | 29 | # 创建文本输入框和翻译按钮 30 | text_input = tk.Text(root, height=10, width=50) 31 | text_input.pack() 32 | 33 | translate_button = tk.Button(root, text="翻译", command=translate_text) 34 | translate_button.pack() 35 | 36 | # 创建文本输出框 37 | text_output = tk.Text(root, height=10, width=50) 38 | text_output.pack() 39 | 40 | # 启动主循环 41 | root.mainloop() 42 | 43 | ``` 44 | 45 | #### 2.2 添加对保留源 PDF 的原始布局的支持 46 | 要支持保留源 PDF 的原始布局,我采用了 PyPDF2 库。首先,我对输入的 PDF 文件进行解析,然后提取其中的文本进行翻译,最后将翻译结果按照原始布局插入到输出的 PDF 中。 47 | 48 | ```python 49 | import PyPDF2 50 | 51 | def translate_pdf(input_file_path, output_file_path): 52 | # 打开 PDF 文件 53 | with open(input_file_path, "rb") as file: 54 | pdf_reader = PyPDF2.PdfFileReader(file) 55 | pdf_writer = PyPDF2.PdfFileWriter() 56 | 57 | # 遍历 PDF 中的每一页 58 | for page_num in range(pdf_reader.numPages): 59 | page = pdf_reader.getPage(page_num) 60 | 61 | # 提取页面文本 62 | page_text = page.extractText() 63 | 64 | # 调用 OpenAI-Translator V2.0 进行翻译 65 | translated_text = openai_translator_v2.translate(page_text) 66 | 67 | # 将翻译结果按原始布局插入到输出的 PDF 中 68 | translated_page = PyPDF2.pdf.PageObject.createTextObject(translated_text) 69 | page.mergePage(translated_page) 70 | 71 | # 将处理后的页面添加到输出 PDF 72 | pdf_writer.addPage(page) 73 | 74 | # 保存输出的 PDF 文件 75 | with open(output_file_path, "wb") as output_file: 76 | pdf_writer.write(output_file) 77 | 78 | ``` 79 | 80 | #### 2.3 服务化:以 API 形式提供翻译服务支持 81 | 为了将翻译功能服务化,我使用 Flask 框架搭建了一个简单的 RESTful API。API 接收 POST 请求,包含待翻译文本作为请求数据,然后返回翻译后的结果。 82 | 83 | ```python 84 | from flask import Flask, request, jsonify 85 | 86 | app = Flask(__name__) 87 | 88 | @app.route("/translate", methods=["POST"]) 89 | def api_translate(): 90 | # 获取请求中的待翻译文本 91 | input_text = request.json.get("text") 92 | 93 | # 调用 OpenAI-Translator V2.0 进行翻译 94 | translated_text = openai_translator_v2.translate(input_text) 95 | 96 | # 返回翻译结果 97 | return jsonify({"translated_text": translated_text}) 98 | 99 | if __name__ == "__main__": 100 | app.run() 101 | 102 | ``` 103 | #### 2.4 添加对其他语言的支持 104 | 为了支持其他语言的翻译,我需要重新训练 OpenAI-Translator V2.0 模型,以包含目标语言的数据。我收集了大量的多语言数据集,并使用这些数据对模型进行训练。在训练完成后,我将新的模型集成到 OpenAI-Translator V2.0 中,并更新 GUI 和 API 以支持选择目标语言。 105 | 106 | 107 | ### 3. 注意事项 108 | 在添加图形用户界面时,需要注意 Tkinter 窗口布局和组件的使用方法,确保界面简洁美观,同时方便用户使用。 109 | 解析 PDF 文件时,要注意一些特殊的 PDF 格式,确保能正确提取文本。 110 | 在服务化的过程中,需要注意安全性和性能问题,可以考虑限制请求频率、对用户身份进行验证等措施。 111 | 112 | ### 4. 学习心得 113 | 在实现 OpenAI-Translator V2.0 特性的过程中,我不仅巩固了在极客时间《AI 大模型应用开发实战营》中学到的知识,还学到了一些新的技术和工具。其中,最让我受益的是学会了如何使用 Tkinter 和 Flask 框架,这为我以后开发更多的 GUI 应用和服务化项目奠定了基础。 114 | 115 | 此外,通过添加对其他语言的支持,我深入了解了多语言数据的收集和处理,以及如何通过重新训练模型来实现新的功能。这让我更加了解 AI 大模型在实际应用中的灵活性和可扩展性。 116 | 117 | 总体而言,参加《AI 大模型应用开发实战营》是一次非常有收获的学习体验。通过实战项目,我不仅加深了对 AI 大模型的理解,还锻炼了自己的开发能力。我相信这些知识和经验将在我的职业生涯中发挥重要作用。 -------------------------------------------------------------------------------- /note/笔记8-大模型应用开发框架-LangChain.md: -------------------------------------------------------------------------------- 1 | ## 进阶篇:大模型应用开发框架-LangChain 2 | 3 | ### 第一部分:课后习题 4 | 5 |
6 | 7 | ### 第二部分:相关名词解释 8 | 9 | #### 1、LangChain是什么?为什么选择LangChain? 10 | 11 | ```text 12 | 1.LangChain是一个整合大语言模型的开发框架,类似于Flask是Python的后台服务开发框架。 13 | 2.他通过组合模块和能力抽象来扩展 LLM,使得用户不用直接与大语言模型对接,他帮我们封装好与大语言的模型交互的,使得用户可以更加轻松的使用模型进行开发。 14 | 比如:GPT-4很强了,但是无法联网、无法对接外部工具、不能调用第三方api等,langchain已经帮用户封装好了预留的接口,用户可以轻松上手 15 | ``` 16 | 17 | 18 | #### [2、怎么使用LangChain?经典案例](../project/langchain) 19 | ```python 20 | import configparser 21 | 22 | conf = configparser.ConfigParser() 23 | conf.read("../config.ini") 24 | chat_model = "gpt-3.5-turbo" 25 | text_model = "gpt-3.5-turbo-instruct" # text-davinci-003 2024-01-04已经下线了 26 | api_key = conf.get("Openai", "api_key") 27 | ``` 28 | ```python 29 | # 1.Completion对比 30 | # 使用openai原生接口方式,调用ChatGPT的接口 31 | import openai 32 | 33 | prompt_str = 'You are a translation assistant' 34 | openai.api_key = api_key 35 | conversation = openai.Completion.create( 36 | model=text_model, 37 | prompt=prompt_str, 38 | max_tokens=100, 39 | temperature=0.2, 40 | stream=False 41 | ) 42 | result_text = conversation["choices"][0]['text'] 43 | print(result_text) 44 | 45 | # ----------------------------------------------------------------- 46 | # 使用langchain,调用ChatGPT的接口 47 | from langchain_openai.llms import OpenAI 48 | 49 | llm = OpenAI(model_name=text_model, openai_api_key=api_key) 50 | llm.max_tokens = 100 51 | llm.temperature = 0.2 52 | result_text = llm(prompt_str) 53 | print(result_text) 54 | 55 | ``` 56 | 57 | ```python 58 | 59 | # 2.ChatCompletion 60 | # 使用openai原生接口方式,调用ChatGPT的接口 61 | prompt_system_str = "You are a translation assistant, and you name is Macy, a kindness young lady." 62 | prompt_user_str = "Hi Macy! I am glad to see you." 63 | 64 | conversation = openai.ChatCompletion.create( 65 | model=chat_model, 66 | messages=[ 67 | {"role": "system", "content": prompt_system_str}, 68 | {"role": "user", "content": prompt_user_str}], 69 | max_tokens=50, 70 | temperature=0.2, 71 | stream=True 72 | ) 73 | for event in conversation: 74 | if event['choices'][0]['finish_reason'] != 'stop': 75 | print(event['choices'][0]['delta']['content'], end='') 76 | 77 | # ----------------------------------------------------------------- 78 | # 使用langchain,调用ChatGPT的接口 79 | from langchain_openai import ChatOpenAI 80 | from langchain.schema import (HumanMessage, AIMessage, SystemMessage) 81 | 82 | chat = ChatOpenAI(model_name=chat_model, openai_api_key=api_key) 83 | chat.max_tokens = 100 84 | chat.temperature = 0.2 85 | 86 | conversation = chat([ 87 | SystemMessage(content=prompt_system_str), 88 | HumanMessage(content=prompt_user_str) 89 | ]) 90 | print(conversation) 91 | ``` 92 | ![avatar](../resource/LangChain案例.png) 93 | 94 |
95 | 96 | #### [3、LangChain的架构(xmind格式)](../resource/AI-LangChain.xmind) 97 | ![图片格式](../resource/AI-LangChain.png) 98 | 99 | ![avatar](../resource/LangChain设计.png) 100 | 101 | ### 第三部分:一些问答 102 | 103 |
-------------------------------------------------------------------------------- /note/笔记9-大模型实战:OpenaiTranslator+Langchain实战总结.md: -------------------------------------------------------------------------------- 1 | ## 进阶篇:结合 OpenAI-Translator 与 Langchain 大模型开发框架,优化OpenAI-Translator项目 2 | ### 第一部分:OpenAI-Translator V-1.0 与 V-2.0总结 3 | - 项目地址:https://github.com/ShengqinYang/openai-quickstart/tree/main/langchain/openai-translator 4 | - Fork From:https://github.com/DjangoPeng/openai-quickstart/tree/main/langchain/openai-translator 5 | 6 | - OpenAI-Translator项目,新旧结构对比: 7 | 8 |
9 |
10 | 11 | 12 | ```plaintext 13 | V-1.0 结构: 14 | openai-translator 15 | ├── ai_translator 16 | │ ├── __init__.py 17 | │ ├── book 18 | │ │ ├── book.py 19 | │ │ ├── content.py 20 | │ │ └── page.py 21 | │ ├── main.py 22 | │ ├── model 23 | │ │ ├── glm_model.py 24 | │ │ ├── model.py 25 | │ │ └── openai_model.py 26 | │ ├── translator 27 | │ │ ├── pdf_parser.py 28 | │ │ ├── pdf_translator.py 29 | │ │ ├── exceptions.py 30 | │ │ └── writer.py 31 | │ └── utils 32 | │ ├── argument_parser.py 33 | │ ├── config_loader.py 34 | │ └── logger.py 35 | ├── config.yaml 36 | ├── fonts 37 | ├── images 38 | ├── jupyter 39 | ├── requirements.txt 40 | └── tests 41 | ``` 42 |
43 | 44 |
45 | 46 | ```plaintext 47 | V-2.0 结构: 48 | openai-translator 49 | ├── ai_translator 50 | │ ├── __init__.py 51 | │ ├── book 52 | │ │ ├── book.py 53 | │ │ ├── content.py 54 | │ │ └── page.py 55 | │ ├── flask_server.py 56 | │ ├── gradio_server.py 57 | │ ├── main.py 58 | │ ├── translator 59 | │ │ ├── __init__.py 60 | │ │ ├── exceptions.py 61 | │ │ ├── pdf_parser.py 62 | │ │ ├── pdf_translator.py 63 | │ │ ├── translation_chain.py 64 | │ │ ├── translation_config.py 65 | │ │ └── writer.py 66 | │ └── utils 67 | │ ├── __init__.py 68 | │ ├── argument_parser.py 69 | │ └── logger.py 70 | ├── config.yaml 71 | ├── fonts 72 | ├── images 73 | ├── requirements.txt 74 | └── tests 75 | ``` 76 | 77 |
78 |
79 | 80 | ### 整体对比: 81 | #### 第一、模型调用优化 82 | * V-1.0:使用各个模型自己的原生的api,举例:使用openai的模型,需要自定义封装调用ChatCompletion和Completion API,构造prompt、构造请求等 83 | * V-2.0:使用Langchain封装的统一的模型接口,用一个LLMChain,传入相应的模型名称即可,使用统一的Prompt,以及构造请求。具体code:translation_chain.py 84 | ```python 85 | chat = ChatOpenAI(model_name=model_name, temperature=0, verbose=verbose) 86 | chain = LLMChain(llm=chat, prompt=chat_prompt_template, verbose=verbose) 87 | ``` 88 | 89 |
90 |
91 | 92 | ```plaintext 93 | V-1.0 痛点: 94 | 95 | 1. 重复的大模型扩展工作 96 | 2. LLM相关方法和接口不统一,维护成本高 97 | 3. Prompt 与 Model 耦合 ————> 98 | 4. 子类需手动区分 LLM 和 Chat Model 99 | 100 | 101 | 102 | │ ├── model 103 | │ │ ├── glm_model.py 104 | │ │ ├── model.py ————> 105 | │ │ └── openai_model.py 106 | 107 | 108 | 109 | ``` 110 |
111 | 112 |
113 | 114 | ```plaintext 115 | V-2.0 优化: 116 | 117 | 1. 使用 LangChain 框架替代自己造轮子 118 | 2. Model I/O 覆盖主流大模型,提供标准接口 119 | 3. 使用 Chains 管理 Prompt 与 Model 120 | 4. 框架原生支持 LLM 和 Chat Model 两类模型 121 | 122 | 123 | │ ├── translator 124 | │ │ ├── __init__.py 125 | │ │ ├── exceptions.py 126 | │ │ ├── pdf_parser.py 127 | │ │ ├── pdf_translator.py 128 | │ │ ├── translation_chain.py 129 | │ │ ├── translation_config.py 130 | │ │ └── writer.py 131 | ``` 132 |
133 | 134 |
135 | 136 | 137 | #### 第二、项目参数配置优化 138 | - V-1.0,项目启动配置比较复杂没有很好的封装 139 | - V-2.0,使用单例模式进行全局配置管理,封装了TranslationConfig类,具体code:translation_config.py 140 | - 调用对比 141 |
142 |
143 | 144 | ```python 145 | V-1.0: 146 | 147 | argument_parser = ArgumentParser() 148 | args = argument_parser.parse_arguments() 149 | config_loader = ConfigLoader(args.config) 150 | 151 | config = config_loader.load_config() 152 | 153 | model_name = args.openai_model 154 | if args.openai_model else config['OpenAIModel']['model'] 155 | api_key = args.openai_api_key if args.openai_api_key \ 156 | else config['OpenAIModel']['api_key'] 157 | model = OpenAIModel(model=model_name, api_key=api_key) 158 | 159 | pdf_file_path = args.book if args.book else config['common']['book'] 160 | file_format = args.file_format if args.file_format \ 161 | else config['common']['file_format'] 162 | 163 | # 实例化 PDFTranslator 类,并调用 translate_pdf() 方法 164 | translator = PDFTranslator(model) 165 | translator.translate_pdf(pdf_file_path, file_format) 166 | ``` 167 |
168 | 169 |
170 | 171 | 172 | ```python 173 | V-2.0: 174 | 175 | # 解析命令行 176 | argument_parser = ArgumentParser() 177 | args = argument_parser.parse_arguments() 178 | 179 | # 初始化配置单例 180 | config = TranslationConfig() 181 | config.initialize(args) 182 | 183 | # 实例化 PDFTranslator 类,并调用 translate_pdf() 方法 184 | translator = PDFTranslator(config.model_name) 185 | translator.translate_pdf(config.input_file, 186 | config.output_file_format, 187 | pages=None) 188 | 189 | 190 | 191 | 192 | 193 | 194 | ``` 195 |
196 | 197 |
198 | 199 | 200 | #### 第三、新增基于 Gradio 的图形化界面设计;新增基于 Flask 的Web服务化API 201 | 202 | - V-1.0 版本仅支持main.py启动项目 203 | - V-2.0 版本: 204 | ```text 205 | 1、支持本地启动项目,启动文件 main.py 206 | 2、支持 Gradio 的图形化界面,启动文件 gradio_server.py 207 | 3、基于 Flask 的Web服务化API,启动文件 flask_server.py 208 | ``` 209 | 210 | ```python 211 | # 2、支持 Gradio 的图形化界面 212 | def launch_gradio(): 213 | 214 | iface = gr.Interface( 215 | fn=translation, 216 | title="OpenAI-Translator v2.0(PDF 电子书翻译工具)", 217 | inputs=[ 218 | gr.File(label="上传PDF文件"), 219 | gr.Textbox(label="源语言(默认:英文)", placeholder="English", value="English"), 220 | gr.Textbox(label="目标语言(默认:中文)", placeholder="Chinese", value="Chinese") 221 | ], 222 | outputs=[ 223 | gr.File(label="下载翻译文件") 224 | ], 225 | allow_flagging="never" 226 | ) 227 | 228 | # iface.launch(share=True, server_name="0.0.0.0") 229 | iface.launch() 230 | ``` 231 | 232 | ```python 233 | # 3、基于 Flask 的Web服务化API 234 | @app.route('/translation', methods=['POST']) 235 | def translation(): 236 | try: 237 | input_file = request.files['input_file'] 238 | source_language = request.form.get('source_language', 'English') 239 | target_language = request.form.get('target_language', 'Chinese') 240 | 241 | LOG.debug(f"[input_file]\n{input_file}") 242 | LOG.debug(f"[input_file.filename]\n{input_file.filename}") 243 | 244 | if input_file and input_file.filename: 245 | # # 创建临时文件 246 | input_file_path = TEMP_FILE_DIR+input_file.filename 247 | LOG.debug(f"[input_file_path]\n{input_file_path}") 248 | 249 | input_file.save(input_file_path) 250 | 251 | # 调用翻译函数 252 | output_file_path = Translator.translate_pdf( 253 | input_file=input_file_path, 254 | source_language=source_language, 255 | target_language=target_language) 256 | 257 | # 移除临时文件 258 | # os.remove(input_file_path) 259 | 260 | # 构造完整的文件路径 261 | output_file_path = os.getcwd() + "/" + output_file_path 262 | LOG.debug(output_file_path) 263 | 264 | # 返回翻译后的文件 265 | return send_file(output_file_path, as_attachment=True) 266 | except Exception as e: 267 | response = { 268 | 'status': 'error', 269 | 'message': str(e) 270 | } 271 | return jsonify(response), 400 272 | ``` 273 | 274 | 275 | ### 第二部分:课后习题【基于openai-translator V2.0】 276 | - 1.在 openai-translator gradio 图形化界面基础上,支持风格化翻译,如:小说、新闻稿、作家风格等。 277 | - 2.添加一些按钮,按钮对应function,预置风格化的翻译,如:小说、新闻稿、特定作家风格(鲁迅)等 278 | - 3.基于 ChatGLM2-6B 实现图形化界面 的 openai-translator 279 | - 新功能: 280 | - 1.支持多语言; 281 | - 2.支持多输出文件格式, 新增word格式输出; 282 | - 3.支持多翻译风格; 283 | - 4.新增下拉框选项 284 | - [项目代码](../project/langchain_openai_translator/ai_translator/gradio_server.py) 285 | - [项目启动说明](../project/langchain_openai_translator/README.md) 286 | - [展示](../resource/homework_openai_translator_v2.0.png) 287 | 288 | 289 | 290 | 291 | -------------------------------------------------------------------------------- /pip_file.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | import sys 3 | from pip._internal import main as pip_main 4 | import os 5 | 6 | 7 | def install(package): 8 | package_name = package.decode("utf-8").replace("\n", "") 9 | # print(package) 10 | # pip_main(['--default-timeout=1000', 'install', '-U', package, '-i', 11 | # 'http://pypi.douban.com/simple/']) 12 | # os.system(f'pip install {package_name} -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com') 13 | os.system(f'pip install {package_name} -i https://mirrors.aliyun.com/pypi/simple/') 14 | 15 | 16 | if __name__ == '__main__': 17 | with open(sys.argv[1], 'rb') as f: 18 | for line in f: 19 | install(line) -------------------------------------------------------------------------------- /project/langchain/agents/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShengqinYang/AINote/b2882d3cf5f0ee00dad7d4bde955368c37327ae6/project/langchain/agents/__init__.py -------------------------------------------------------------------------------- /project/langchain/agents/openai_function.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": { 6 | "collapsed": false 7 | }, 8 | "source": [ 9 | "# LangChain 核心模块 Agent - OpenAI Function" 10 | ] 11 | }, 12 | { 13 | "cell_type": "code", 14 | "execution_count": 3, 15 | "metadata": { 16 | "ExecuteTime": { 17 | "end_time": "2023-08-21T11:23:53.022006Z", 18 | "start_time": "2023-08-21T11:23:53.014787Z" 19 | }, 20 | "collapsed": false 21 | }, 22 | "outputs": [], 23 | "source": [ 24 | "import os\n", 25 | "import configparser\n", 26 | "\n", 27 | "conf = configparser.ConfigParser()\n", 28 | "current_directory = os.path.dirname(os.path.realpath('__file__'))\n", 29 | "config_file_path = os.path.join(current_directory, '..', '..', '..', 'config.ini')\n", 30 | "conf.read(config_file_path)\n", 31 | "os.environ[\"HTTP_PROXY\"] = conf.get(\"Proxy\", \"HTTP_PROXY\") # 配置自己的代理\n", 32 | "os.environ[\"HTTPS_PROXY\"] = conf.get(\"Proxy\", \"HTTPS_PROXY\")\n", 33 | "os.environ[\"OPENAI_API_KEY\"] = conf.get(\"Openai\", \"api_key\") # 在config.ini中配置自己的APIkey\n", 34 | "os.environ[\"SERPAPI_API_KEY\"] = conf.get(\"SerpApi\", \"serp_apikey\") # 在config.ini中配置自己的APIkey\n", 35 | "chat_model = \"gpt-3.5-turbo\"\n", 36 | "text_model = \"gpt-3.5-turbo-instruct\" # text-davinci-003 2024-01-04已经下线了" 37 | ] 38 | }, 39 | { 40 | "cell_type": "code", 41 | "execution_count": 4, 42 | "metadata": { 43 | "ExecuteTime": { 44 | "end_time": "2023-08-21T11:23:54.320925Z", 45 | "start_time": "2023-08-21T11:23:53.022801Z" 46 | }, 47 | "collapsed": false 48 | }, 49 | "outputs": [], 50 | "source": [ 51 | "from langchain_openai import ChatOpenAI\n", 52 | "\n", 53 | "llm = ChatOpenAI(temperature=0)" 54 | ] 55 | }, 56 | { 57 | "cell_type": "code", 58 | "execution_count": 2, 59 | "metadata": { 60 | "ExecuteTime": { 61 | "end_time": "2023-08-21T11:31:41.914058Z", 62 | "start_time": "2023-08-21T11:31:41.896596Z" 63 | }, 64 | "collapsed": false 65 | }, 66 | "outputs": [], 67 | "source": [ 68 | "\n", 69 | "from langchain.agents import tool\n", 70 | "\n", 71 | "\n", 72 | "@tool\n", 73 | "def get_word_length(words: str) -> int:\n", 74 | " \"\"\"Return the length of a word.\"\"\"\n", 75 | " return len(words)\n", 76 | "\n", 77 | "\n", 78 | "tools = [get_word_length]\n" 79 | ] 80 | }, 81 | { 82 | "cell_type": "code", 83 | "execution_count": 4, 84 | "metadata": { 85 | "ExecuteTime": { 86 | "end_time": "2023-08-21T11:31:42.896410Z", 87 | "start_time": "2023-08-21T11:31:42.892431Z" 88 | }, 89 | "collapsed": false 90 | }, 91 | "outputs": [], 92 | "source": [ 93 | "from langchain.agents import OpenAIFunctionsAgent\n", 94 | "from langchain.schema import SystemMessage\n", 95 | "\n", 96 | "system_message = SystemMessage(content=\"You are very powerful assistant, but bad at calculating lengths of words.\")\n", 97 | "prompt = OpenAIFunctionsAgent.create_prompt(system_message=system_message)\n" 98 | ] 99 | }, 100 | { 101 | "cell_type": "code", 102 | "execution_count": 5, 103 | "metadata": { 104 | "ExecuteTime": { 105 | "end_time": "2023-08-21T11:31:43.725236Z", 106 | "start_time": "2023-08-21T11:31:43.721474Z" 107 | }, 108 | "collapsed": false 109 | }, 110 | "outputs": [], 111 | "source": [ 112 | "agent = OpenAIFunctionsAgent(llm=llm, tools=tools, prompt=prompt)" 113 | ] 114 | }, 115 | { 116 | "cell_type": "code", 117 | "execution_count": 6, 118 | "metadata": { 119 | "ExecuteTime": { 120 | "end_time": "2023-08-21T11:31:57.803605Z", 121 | "start_time": "2023-08-21T11:31:44.754852Z" 122 | }, 123 | "collapsed": false 124 | }, 125 | "outputs": [ 126 | { 127 | "name": "stdout", 128 | "output_type": "stream", 129 | "text": [ 130 | "\n", 131 | "\n", 132 | "\u001b[1m> Entering new AgentExecutor chain...\u001b[0m\n", 133 | "\u001b[32;1m\u001b[1;3m\n", 134 | "Invoking: `get_word_length` with `{'words': 'AgentExecutor'}`\n", 135 | "\n", 136 | "\n", 137 | "\u001b[0m\u001b[36;1m\u001b[1;3m13\u001b[0m\u001b[32;1m\u001b[1;3mThere are 13 letters in the word \"AgentExecutor\".\u001b[0m\n", 138 | "\n", 139 | "\u001b[1m> Finished chain.\u001b[0m\n" 140 | ] 141 | }, 142 | { 143 | "data": { 144 | "text/plain": [ 145 | "'There are 13 letters in the word \"AgentExecutor\".'" 146 | ] 147 | }, 148 | "execution_count": 6, 149 | "metadata": {}, 150 | "output_type": "execute_result" 151 | } 152 | ], 153 | "source": [ 154 | "from langchain.agents import AgentExecutor\n", 155 | "\n", 156 | "agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)\n", 157 | "agent_executor.run(\"how many letters in the word AgentExecutor?\")" 158 | ] 159 | }, 160 | { 161 | "cell_type": "code", 162 | "execution_count": 7, 163 | "metadata": { 164 | "ExecuteTime": { 165 | "end_time": "2023-08-21T11:39:40.514592Z", 166 | "start_time": "2023-08-21T11:39:40.508986Z" 167 | }, 168 | "collapsed": false 169 | }, 170 | "outputs": [], 171 | "source": [ 172 | "from langchain.prompts import MessagesPlaceholder\n", 173 | "\n", 174 | "MEMORY_KEY = \"chat_history\"\n", 175 | "prompt = OpenAIFunctionsAgent.create_prompt(\n", 176 | " system_message=system_message,\n", 177 | " extra_prompt_messages=[MessagesPlaceholder(variable_name=MEMORY_KEY)]\n", 178 | ")" 179 | ] 180 | }, 181 | { 182 | "cell_type": "code", 183 | "execution_count": 8, 184 | "metadata": { 185 | "ExecuteTime": { 186 | "end_time": "2023-08-21T11:41:13.481532Z", 187 | "start_time": "2023-08-21T11:41:13.470892Z" 188 | }, 189 | "collapsed": false 190 | }, 191 | "outputs": [], 192 | "source": [ 193 | "from langchain.memory import ConversationBufferMemory\n", 194 | "\n", 195 | "memory = ConversationBufferMemory(memory_key=MEMORY_KEY, return_messages=True)" 196 | ] 197 | }, 198 | { 199 | "cell_type": "code", 200 | "execution_count": 9, 201 | "metadata": { 202 | "ExecuteTime": { 203 | "end_time": "2023-08-21T11:43:24.303653Z", 204 | "start_time": "2023-08-21T11:43:03.656882Z" 205 | }, 206 | "collapsed": false 207 | }, 208 | "outputs": [ 209 | { 210 | "name": "stdout", 211 | "output_type": "stream", 212 | "text": [ 213 | "\n", 214 | "\n", 215 | "\u001b[1m> Entering new AgentExecutor chain...\u001b[0m\n", 216 | "\u001b[32;1m\u001b[1;3m\n", 217 | "Invoking: `get_word_length` with `{'words': 'AgentExecutor'}`\n", 218 | "\n", 219 | "\n", 220 | "\u001b[0m\u001b[36;1m\u001b[1;3m13\u001b[0m\u001b[32;1m\u001b[1;3mThere are 13 letters in the word \"AgentExecutor\".\u001b[0m\n", 221 | "\n", 222 | "\u001b[1m> Finished chain.\u001b[0m\n" 223 | ] 224 | }, 225 | { 226 | "data": { 227 | "text/plain": [ 228 | "'There are 13 letters in the word \"AgentExecutor\".'" 229 | ] 230 | }, 231 | "execution_count": 9, 232 | "metadata": {}, 233 | "output_type": "execute_result" 234 | } 235 | ], 236 | "source": [ 237 | "agent = OpenAIFunctionsAgent(llm=llm, tools=tools, prompt=prompt)\n", 238 | "agent_executor = AgentExecutor(agent=agent, tools=tools, memory=memory, verbose=True)\n", 239 | "agent_executor.run(\"how many letters in the word AgentExecutor?\")" 240 | ] 241 | }, 242 | { 243 | "cell_type": "code", 244 | "execution_count": 10, 245 | "metadata": { 246 | "ExecuteTime": { 247 | "end_time": "2023-08-21T11:43:49.046481Z", 248 | "start_time": "2023-08-21T11:43:32.192424Z" 249 | }, 250 | "collapsed": false 251 | }, 252 | "outputs": [ 253 | { 254 | "name": "stdout", 255 | "output_type": "stream", 256 | "text": [ 257 | "\n", 258 | "\n", 259 | "\u001b[1m> Entering new AgentExecutor chain...\u001b[0m\n", 260 | "\u001b[32;1m\u001b[1;3m\n", 261 | "Invoking: `get_word_length` with `{'words': 'AgentExecutor'}`\n", 262 | "\n", 263 | "\n", 264 | "\u001b[0m\u001b[36;1m\u001b[1;3m13\u001b[0m" 265 | ] 266 | }, 267 | { 268 | "name": "stderr", 269 | "output_type": "stream", 270 | "text": [ 271 | "Retrying langchain.chat_models.openai.ChatOpenAI.completion_with_retry.._completion_with_retry in 4.0 seconds as it raised RateLimitError: Rate limit reached for default-gpt-3.5-turbo in organization org-x42xnbIQNTmMDq6adIeja9TZ on requests per min. Limit: 3 / min. Please try again in 20s. Contact us through our help center at help.openai.com if you continue to have issues. Please add a payment method to your account to increase your rate limit. Visit https://platform.openai.com/account/billing to add a payment method..\n" 272 | ] 273 | }, 274 | { 275 | "name": "stdout", 276 | "output_type": "stream", 277 | "text": [ 278 | "\u001b[32;1m\u001b[1;3mNo, \"AgentExecutor\" is not a real word. It is a combination of the words \"Agent\" and \"Executor\".\u001b[0m\n", 279 | "\n", 280 | "\u001b[1m> Finished chain.\u001b[0m\n" 281 | ] 282 | }, 283 | { 284 | "data": { 285 | "text/plain": [ 286 | "'No, \"AgentExecutor\" is not a real word. It is a combination of the words \"Agent\" and \"Executor\".'" 287 | ] 288 | }, 289 | "execution_count": 10, 290 | "metadata": {}, 291 | "output_type": "execute_result" 292 | } 293 | ], 294 | "source": [ 295 | "agent_executor.run(\"is that a real word?\")\n" 296 | ] 297 | }, 298 | { 299 | "cell_type": "code", 300 | "execution_count": null, 301 | "metadata": { 302 | "collapsed": false 303 | }, 304 | "outputs": [], 305 | "source": [] 306 | } 307 | ], 308 | "metadata": { 309 | "kernelspec": { 310 | "display_name": "AINote", 311 | "language": "python", 312 | "name": "ainote" 313 | }, 314 | "language_info": { 315 | "codemirror_mode": { 316 | "name": "ipython", 317 | "version": 3 318 | }, 319 | "file_extension": ".py", 320 | "mimetype": "text/x-python", 321 | "name": "python", 322 | "nbconvert_exporter": "python", 323 | "pygments_lexer": "ipython3", 324 | "version": "3.10.0" 325 | } 326 | }, 327 | "nbformat": 4, 328 | "nbformat_minor": 0 329 | } 330 | -------------------------------------------------------------------------------- /project/langchain/agents/react.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": { 6 | "collapsed": false 7 | }, 8 | "source": [ 9 | "# LangChain 核心模块 Agent - ReAct\n", 10 | "\n", 11 | "ReAct 核心思想是 推理+操作,本示例以` Google Search` 和 `LLM Math` 作为可选操作集合(toolkits),实现 ReAct 功能。" 12 | ] 13 | }, 14 | { 15 | "cell_type": "code", 16 | "execution_count": 4, 17 | "metadata": { 18 | "ExecuteTime": { 19 | "end_time": "2023-08-21T11:03:42.986499Z", 20 | "start_time": "2023-08-21T11:03:42.981023Z" 21 | }, 22 | "collapsed": false 23 | }, 24 | "outputs": [], 25 | "source": [ 26 | "import os\n", 27 | "import configparser\n", 28 | "\n", 29 | "conf = configparser.ConfigParser()\n", 30 | "current_directory = os.path.dirname(os.path.realpath('__file__'))\n", 31 | "config_file_path = os.path.join(current_directory, '..', '..', '..', 'config.ini')\n", 32 | "conf.read(config_file_path)\n", 33 | "os.environ[\"HTTP_PROXY\"] = conf.get(\"Proxy\", \"HTTP_PROXY\") # 配置自己的代理\n", 34 | "os.environ[\"HTTPS_PROXY\"] = conf.get(\"Proxy\", \"HTTPS_PROXY\")\n", 35 | "os.environ[\"OPENAI_API_KEY\"] = conf.get(\"Openai\", \"api_key\") # 在config.ini中配置自己的APIkey\n", 36 | "os.environ[\"SERPAPI_API_KEY\"] = conf.get(\"SerpApi\", \"serp_apikey\") # 在config.ini中配置自己的APIkey\n", 37 | "chat_model = \"gpt-3.5-turbo\"\n", 38 | "text_model = \"gpt-3.5-turbo-instruct\" # text-davinci-003 2024-01-04已经下线了" 39 | ] 40 | }, 41 | { 42 | "cell_type": "code", 43 | "execution_count": 5, 44 | "metadata": { 45 | "ExecuteTime": { 46 | "end_time": "2023-08-21T11:03:53.655805Z", 47 | "start_time": "2023-08-21T11:03:53.635034Z" 48 | }, 49 | "collapsed": false 50 | }, 51 | "outputs": [], 52 | "source": [ 53 | "from langchain_openai.llms import OpenAI\n", 54 | "from langchain.agents import load_tools, initialize_agent, AgentType\n", 55 | "\n", 56 | "llm = OpenAI(temperature=0)\n", 57 | "tools = load_tools([\"serpapi\", \"llm-math\"], llm=llm)" 58 | ] 59 | }, 60 | { 61 | "cell_type": "code", 62 | "execution_count": 4, 63 | "metadata": { 64 | "ExecuteTime": { 65 | "end_time": "2023-08-21T11:05:50.457957Z", 66 | "start_time": "2023-08-21T11:05:50.455489Z" 67 | }, 68 | "collapsed": false 69 | }, 70 | "outputs": [], 71 | "source": [ 72 | "agent = initialize_agent(tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True)\n" 73 | ] 74 | }, 75 | { 76 | "cell_type": "code", 77 | "execution_count": 5, 78 | "metadata": { 79 | "ExecuteTime": { 80 | "end_time": "2023-08-21T11:06:25.486040Z", 81 | "start_time": "2023-08-21T11:05:52.181395Z" 82 | }, 83 | "collapsed": false 84 | }, 85 | "outputs": [ 86 | { 87 | "name": "stdout", 88 | "output_type": "stream", 89 | "text": [ 90 | "\n", 91 | "\n", 92 | "\u001b[1m> Entering new AgentExecutor chain...\u001b[0m\n", 93 | "\u001b[32;1m\u001b[1;3m I need to find out Elon Musk's age and the ages of his children.\n", 94 | "Action: Search\n", 95 | "Action Input: \"Elon Musk age\"\u001b[0m\n", 96 | "Observation: \u001b[36;1m\u001b[1;3m52 years\u001b[0m\n", 97 | "Thought:\u001b[32;1m\u001b[1;3m I need to find out how many children Elon Musk has and their ages.\n", 98 | "Action: Search\n", 99 | "Action Input: \"Elon Musk children\"\u001b[0m\n", 100 | "Observation: \u001b[36;1m\u001b[1;3mElon Reeve Musk is a business magnate and investor. Musk is the founder, chairman, CEO and chief technology officer of SpaceX, angel investor, CEO and product architect of Tesla, Inc., owner, chairman ...\u001b[0m\n", 101 | "Thought:\u001b[32;1m\u001b[1;3m I need to find out more specific information about Elon Musk's children.\n", 102 | "Action: Search\n", 103 | "Action Input: \"Elon Musk children ages\"\u001b[0m\n", 104 | "Observation: \u001b[36;1m\u001b[1;3mWho are Elon Musk's kids? His 10 children's names, ages and mothers · Nevada Alexander Musk · Griffin and Vivian Musk · Kai, Saxon and Damian Musk · X AE A-XII Musk.\u001b[0m\n", 105 | "Thought:\u001b[32;1m\u001b[1;3m I now know the final answer.\n", 106 | "Final Answer: Elon Reeve Musk is 52 years old and has 10 children: Nevada Alexander Musk (age 5), Griffin and Vivian Musk (age 7), Kai, Saxon and Damian Musk (age 10), and X AE A-XII Musk (age 2).\u001b[0m\n", 107 | "\n", 108 | "\u001b[1m> Finished chain.\u001b[0m\n" 109 | ] 110 | }, 111 | { 112 | "data": { 113 | "text/plain": [ 114 | "'Elon Reeve Musk is 52 years old and has 10 children: Nevada Alexander Musk (age 5), Griffin and Vivian Musk (age 7), Kai, Saxon and Damian Musk (age 10), and X AE A-XII Musk (age 2).'" 115 | ] 116 | }, 117 | "execution_count": 5, 118 | "metadata": {}, 119 | "output_type": "execute_result" 120 | } 121 | ], 122 | "source": [ 123 | "agent.run(\"Elon Reeve Musk 今年多少岁?\")" 124 | ] 125 | }, 126 | { 127 | "cell_type": "code", 128 | "execution_count": 8, 129 | "metadata": { 130 | "ExecuteTime": { 131 | "end_time": "2023-08-21T11:18:18.069320Z", 132 | "start_time": "2023-08-21T11:17:45.686249Z" 133 | }, 134 | "collapsed": false 135 | }, 136 | "outputs": [ 137 | { 138 | "name": "stdout", 139 | "output_type": "stream", 140 | "text": [ 141 | "\n", 142 | "\n", 143 | "\u001b[1m> Entering new AgentExecutor chain...\u001b[0m\n", 144 | "\u001b[32;1m\u001b[1;3m I need to find out the number of children and their ages\n", 145 | "Action: Search\n", 146 | "Action Input: \"Elon Musk children\"\u001b[0m\n", 147 | "Observation: \u001b[36;1m\u001b[1;3mElon Reeve Musk is a business magnate and investor. Musk is the founder, chairman, CEO and chief technology officer of SpaceX, angel investor, CEO and product architect of Tesla, Inc., owner, chairman ...\u001b[0m\n", 148 | "Thought:\u001b[32;1m\u001b[1;3m I need to find out the ages of the children\n", 149 | "Action: Search\n", 150 | "Action Input: \"Elon Musk children ages\"\u001b[0m\n", 151 | "Observation: \u001b[36;1m\u001b[1;3mWho are Elon Musk's kids? His 10 children's names, ages and mothers · Nevada Alexander Musk · Griffin and Vivian Musk · Kai, Saxon and Damian Musk · X AE A-XII Musk.\u001b[0m\n", 152 | "Thought:\u001b[32;1m\u001b[1;3m I now know the final answer\n", 153 | "Final Answer: Elon Reeve Musk has 10 children. Their ages are Nevada Alexander (6), Griffin and Vivian (4), Kai, Saxon and Damian (twins, 2), and X AE A-XII (1). The total age of all of his children is 19.\u001b[0m\n", 154 | "\n", 155 | "\u001b[1m> Finished chain.\u001b[0m\n" 156 | ] 157 | }, 158 | { 159 | "data": { 160 | "text/plain": [ 161 | "'Elon Reeve Musk has 10 children. Their ages are Nevada Alexander (6), Griffin and Vivian (4), Kai, Saxon and Damian (twins, 2), and X AE A-XII (1). The total age of all of his children is 19.'" 162 | ] 163 | }, 164 | "execution_count": 8, 165 | "metadata": {}, 166 | "output_type": "execute_result" 167 | } 168 | ], 169 | "source": [ 170 | "agent.run(\"Elon Reeve Musk 一共有几个孩子?他的孩子们的年龄分别是?年龄的总和是多少?\")" 171 | ] 172 | }, 173 | { 174 | "cell_type": "code", 175 | "execution_count": 7, 176 | "metadata": { 177 | "ExecuteTime": { 178 | "end_time": "2023-08-21T11:12:31.538262Z", 179 | "start_time": "2023-08-21T11:11:25.151996Z" 180 | }, 181 | "collapsed": false 182 | }, 183 | "outputs": [ 184 | { 185 | "name": "stdout", 186 | "output_type": "stream", 187 | "text": [ 188 | "\n", 189 | "\n", 190 | "\u001b[1m> Entering new AgentExecutor chain...\u001b[0m\n", 191 | "\u001b[32;1m\u001b[1;3m I need to find out who Leonardo DiCaprio's girlfriend is and then calculate her age to the 0.43 power.\n", 192 | "Action: Search\n", 193 | "Action Input: \"Leonardo DiCaprio girlfriend\"\u001b[0m\n", 194 | "Observation: \u001b[36;1m\u001b[1;3mCamila Morrone It's believed Morrone and DiCaprio began dating in 2017.\u001b[0m\n", 195 | "Thought:\u001b[32;1m\u001b[1;3m I need to find out how old Camila Morrone is.\n", 196 | "Action: Search\n", 197 | "Action Input: \"Camila Morrone age\"\u001b[0m\n", 198 | "Observation: \u001b[36;1m\u001b[1;3m26 years\u001b[0m\n", 199 | "Thought:\u001b[32;1m\u001b[1;3m I now know the age of Camila Morrone and can calculate it to the 0.43 power.\n", 200 | "Action: Calculator\n", 201 | "Action Input: 26^0.43\u001b[0m\n", 202 | "Observation: \u001b[33;1m\u001b[1;3mAnswer: 4.059182145592686\u001b[0m\n", 203 | "Thought:\u001b[32;1m\u001b[1;3m I now know the final answer.\n", 204 | "Final Answer: Camila Morrone's age to the 0.43 power is 4.059182145592686.\u001b[0m\n", 205 | "\n", 206 | "\u001b[1m> Finished chain.\u001b[0m\n" 207 | ] 208 | }, 209 | { 210 | "data": { 211 | "text/plain": [ 212 | "\"Camila Morrone's age to the 0.43 power is 4.059182145592686.\"" 213 | ] 214 | }, 215 | "execution_count": 7, 216 | "metadata": {}, 217 | "output_type": "execute_result" 218 | } 219 | ], 220 | "source": [ 221 | "agent.run(\"谁是莱昂纳多·迪卡普里奥的女朋友?她现在年龄的0.43次方是多少?\")" 222 | ] 223 | }, 224 | { 225 | "cell_type": "code", 226 | "execution_count": 9, 227 | "metadata": { 228 | "ExecuteTime": { 229 | "end_time": "2023-08-21T11:20:42.961828Z", 230 | "start_time": "2023-08-21T11:20:19.815486Z" 231 | }, 232 | "collapsed": false 233 | }, 234 | "outputs": [ 235 | { 236 | "name": "stdout", 237 | "output_type": "stream", 238 | "text": [ 239 | "\n", 240 | "\n", 241 | "\u001b[1m> Entering new AgentExecutor chain...\u001b[0m\n", 242 | "\u001b[32;1m\u001b[1;3mI need to find out who is Leonardo DiCaprio's girlfriend and then calculate 0.43 raised to her current age.\n", 243 | "Action: Search\n", 244 | "Action Input: \"Leonardo DiCaprio girlfriend\"\u001b[0m\n", 245 | "Observation: \u001b[36;1m\u001b[1;3mCamila Morrone It's believed Morrone and DiCaprio began dating in 2017.\u001b[0m\n", 246 | "Thought:\u001b[32;1m\u001b[1;3mNow I need to find out Camila Morrone's current age.\n", 247 | "Action: Search\n", 248 | "Action Input: \"Camila Morrone age\"\u001b[0m\n", 249 | "Observation: \u001b[36;1m\u001b[1;3m26 years\u001b[0m\n", 250 | "Thought:\u001b[32;1m\u001b[1;3mNow I can calculate 0.43 raised to the power of 26.\n", 251 | "Action: Calculator\n", 252 | "Action Input: 0.43^26\u001b[0m\n", 253 | "Observation: \u001b[33;1m\u001b[1;3mAnswer: 2.9524316007955867e-10\u001b[0m\n", 254 | "Thought:\u001b[32;1m\u001b[1;3mI now know the final answer\n", 255 | "Final Answer: 2.9524316007955867e-10\u001b[0m\n", 256 | "\n", 257 | "\u001b[1m> Finished chain.\u001b[0m\n" 258 | ] 259 | }, 260 | { 261 | "data": { 262 | "text/plain": [ 263 | "'2.9524316007955867e-10'" 264 | ] 265 | }, 266 | "execution_count": 9, 267 | "metadata": {}, 268 | "output_type": "execute_result" 269 | } 270 | ], 271 | "source": [ 272 | "from langchain_openai import ChatOpenAI\n", 273 | "\n", 274 | "chat_llm = ChatOpenAI(model=chat_model)\n", 275 | "agent = initialize_agent(tools, chat_llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True)\n", 276 | "agent.run(\"谁是莱昂纳多·迪卡普里奥的女朋友?她现在年龄的0.43次方是多少?\")\n" 277 | ] 278 | }, 279 | { 280 | "cell_type": "code", 281 | "execution_count": null, 282 | "metadata": { 283 | "collapsed": false 284 | }, 285 | "outputs": [], 286 | "source": [] 287 | } 288 | ], 289 | "metadata": { 290 | "kernelspec": { 291 | "display_name": "AINote", 292 | "language": "python", 293 | "name": "ainote" 294 | }, 295 | "language_info": { 296 | "codemirror_mode": { 297 | "name": "ipython", 298 | "version": 3 299 | }, 300 | "file_extension": ".py", 301 | "mimetype": "text/x-python", 302 | "name": "python", 303 | "nbconvert_exporter": "python", 304 | "pygments_lexer": "ipython3", 305 | "version": "3.10.0" 306 | } 307 | }, 308 | "nbformat": 4, 309 | "nbformat_minor": 0 310 | } 311 | -------------------------------------------------------------------------------- /project/langchain/chains/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShengqinYang/AINote/b2882d3cf5f0ee00dad7d4bde955368c37327ae6/project/langchain/chains/__init__.py -------------------------------------------------------------------------------- /project/langchain/chains/router_chain.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": { 6 | "collapsed": false 7 | }, 8 | "source": [ 9 | "## Part-4.4:Chain -> LLMRouterChain、MultiPromptChain:实现条件判断的大模型调用" 10 | ] 11 | }, 12 | { 13 | "cell_type": "code", 14 | "execution_count": 6, 15 | "metadata": { 16 | "collapsed": false 17 | }, 18 | "outputs": [], 19 | "source": [ 20 | "import os\n", 21 | "import openai\n", 22 | "import configparser\n", 23 | "from langchain_openai import ChatOpenAI\n", 24 | "from langchain.schema import HumanMessage, SystemMessage, AIMessage\n", 25 | "from langchain_openai.llms import OpenAI\n", 26 | "from langchain import PromptTemplate\n", 27 | "from langchain.output_parsers import CommaSeparatedListOutputParser\n", 28 | "from langchain.output_parsers import DatetimeOutputParser\n", 29 | "from langchain.chains import LLMChain\n", 30 | "from langchain.chains import SequentialChain\n", 31 | "from langchain.chains import SimpleSequentialChain\n", 32 | "\n", 33 | "\n", 34 | "conf = configparser.ConfigParser()\n", 35 | "current_directory = os.path.dirname(os.path.realpath('__file__'))\n", 36 | "config_file_path = os.path.join(current_directory, '..', '..', '..', 'config.ini')\n", 37 | "conf.read(config_file_path)\n", 38 | "api_key = conf.get(\"Openai\", \"api_key\") # 在config.ini中配置自己的APIkey\n", 39 | "os.environ[\"HTTP_PROXY\"] = conf.get(\"Proxy\", \"HTTP_PROXY\") # 配置自己的代理\n", 40 | "os.environ[\"HTTPS_PROXY\"] = conf.get(\"Proxy\", \"HTTPS_PROXY\")\n", 41 | "chat_model = \"gpt-3.5-turbo\"\n", 42 | "text_model = \"gpt-3.5-turbo-instruct\"" 43 | ] 44 | }, 45 | { 46 | "cell_type": "code", 47 | "execution_count": 7, 48 | "metadata": { 49 | "collapsed": false 50 | }, 51 | "outputs": [], 52 | "source": [ 53 | "llm = OpenAI(openai_api_key=api_key)" 54 | ] 55 | }, 56 | { 57 | "cell_type": "code", 58 | "execution_count": 8, 59 | "metadata": { 60 | "collapsed": false 61 | }, 62 | "outputs": [], 63 | "source": [ 64 | "from langchain.chains import ConversationChain\n", 65 | "from langchain.chains.router.multi_prompt_prompt import MULTI_PROMPT_ROUTER_TEMPLATE\n", 66 | "\n", 67 | "templates = [\n", 68 | " {\n", 69 | " \"name\": \"游戏设计师(Game Designer)\",\n", 70 | " \"description\": \"适合回答设计游戏的玩法、关卡、角色和系统,确保游戏的乐趣和挑战性。\",\n", 71 | " \"template\": \"你是游戏设计师,你需要根据下面的主题:{input},给出10个关键词描述。\"\n", 72 | " }, {\n", 73 | " \"name\": \"角色设计师(Character Designer)\",\n", 74 | " \"description\": \"适合回答创造游戏中的各种角色,包括主角、配角、敌人、NPC(非玩家角色)等\",\n", 75 | " \"template\": \"你是角色设计师,你需要根据下面的主题:{input},给出10个关键词描述。\"\n", 76 | " }, {\n", 77 | " \"name\": \"关卡设计师(Level Designer)\",\n", 78 | " \"description\": \"适合回答设计游戏中的各个关卡、场景和环境\",\n", 79 | " \"template\": \"你是关卡设计师,你需要根据下面的主题:{input},给出10个关键词描述。\"\n", 80 | " }, {\n", 81 | " \"name\": \"美术设计师(Art Designer)\",\n", 82 | " \"description\": \"适合回答游戏的视觉风格、角色造型、场景设计等美术方面的工作。\",\n", 83 | " \"template\": \"你是美术设计师,你需要根据下面的主题:{input},给出10个关键词描述。\"\n", 84 | " }\n", 85 | "]\n", 86 | "\n", 87 | "destination_chains = {}\n", 88 | "for tem in templates:\n", 89 | " name = tem['name']\n", 90 | " description = tem[\"description\"]\n", 91 | " template = tem[\"template\"]\n", 92 | " prompt = PromptTemplate(template=template, input_variables=[\"input\"])\n", 93 | " chain = LLMChain(llm=llm, prompt=prompt, verbose=True)\n", 94 | " destination_chains[name] = chain\n", 95 | "\n", 96 | "default_chain = ConversationChain(llm=llm, output_key=\"text\")" 97 | ] 98 | }, 99 | { 100 | "cell_type": "code", 101 | "execution_count": 9, 102 | "metadata": { 103 | "collapsed": false 104 | }, 105 | "outputs": [ 106 | { 107 | "name": "stdout", 108 | "output_type": "stream", 109 | "text": [ 110 | "Given a raw text input to a language model select the model prompt best suited for the input. You will be given the names of the available prompts and a description of what the prompt is best suited for. You may also revise the original input if you think that revising it will ultimately lead to a better response from the language model.\n", 111 | "\n", 112 | "<< FORMATTING >>\n", 113 | "Return a markdown code snippet with a JSON object formatted to look like:\n", 114 | "```json\n", 115 | "{{\n", 116 | " \"destination\": string \\ name of the prompt to use or \"DEFAULT\"\n", 117 | " \"next_inputs\": string \\ a potentially modified version of the original input\n", 118 | "}}\n", 119 | "```\n", 120 | "\n", 121 | "REMEMBER: \"destination\" MUST be one of the candidate prompt names specified below OR it can be \"DEFAULT\" if the input is not well suited for any of the candidate prompts.\n", 122 | "REMEMBER: \"next_inputs\" can just be the original input if you don't think any modifications are needed.\n", 123 | "\n", 124 | "<< CANDIDATE PROMPTS >>\n", 125 | "游戏设计师(Game Designer): 适合回答设计游戏的玩法、关卡、角色和系统,确保游戏的乐趣和挑战性。\n", 126 | "角色设计师(Character Designer): 适合回答创造游戏中的各种角色,包括主角、配角、敌人、NPC(非玩家角色)等\n", 127 | "关卡设计师(Level Designer): 适合回答设计游戏中的各个关卡、场景和环境\n", 128 | "美术设计师(Art Designer): 适合回答游戏的视觉风格、角色造型、场景设计等美术方面的工作。\n", 129 | "\n", 130 | "<< INPUT >>\n", 131 | "{input}\n", 132 | "\n", 133 | "<< OUTPUT (must include ```json at the start of the response) >>\n", 134 | "<< OUTPUT (must end with ```) >>\n", 135 | "\n" 136 | ] 137 | } 138 | ], 139 | "source": [ 140 | "from langchain.chains.router.llm_router import RouterOutputParser, LLMRouterChain\n", 141 | "\n", 142 | "destinations = [f\"{p['name']}: {p['description']}\" for p in templates]\n", 143 | "destinations_str = \"\\n\".join(destinations)\n", 144 | "router_template = MULTI_PROMPT_ROUTER_TEMPLATE.format(destinations=destinations_str)\n", 145 | "print(router_template)\n", 146 | "\n", 147 | "router_prompt = PromptTemplate(\n", 148 | " template=router_template,\n", 149 | " input_variables=[\"input\"],\n", 150 | " output_parser=RouterOutputParser()\n", 151 | "\n", 152 | ")\n", 153 | "\n", 154 | "router_chain = LLMRouterChain.from_llm(llm=llm, prompt=router_prompt, verbose=True)" 155 | ] 156 | }, 157 | { 158 | "cell_type": "code", 159 | "execution_count": null, 160 | "metadata": { 161 | "collapsed": false 162 | }, 163 | "outputs": [], 164 | "source": [ 165 | "from langchain.chains import MultiPromptChain\n", 166 | "\n", 167 | "mult_chain = MultiPromptChain(\n", 168 | " router_chain=router_chain,\n", 169 | " default_chain=default_chain,\n", 170 | " destination_chains=destination_chains,\n", 171 | " verbose=True\n", 172 | ")" 173 | ] 174 | }, 175 | { 176 | "cell_type": "code", 177 | "execution_count": null, 178 | "metadata": { 179 | "collapsed": false 180 | }, 181 | "outputs": [], 182 | "source": [ 183 | "print(mult_chain.run({\"input\": \"设计一个6岁的ncp小男孩的特征\"}))" 184 | ] 185 | }, 186 | { 187 | "cell_type": "code", 188 | "execution_count": null, 189 | "metadata": { 190 | "collapsed": false 191 | }, 192 | "outputs": [], 193 | "source": [ 194 | "result = mult_chain.run({'input': '设计一个宇宙空间站的游戏场景'})\n" 195 | ] 196 | }, 197 | { 198 | "cell_type": "code", 199 | "execution_count": null, 200 | "metadata": { 201 | "collapsed": false 202 | }, 203 | "outputs": [], 204 | "source": [] 205 | } 206 | ], 207 | "metadata": { 208 | "kernelspec": { 209 | "display_name": "AINote", 210 | "language": "python", 211 | "name": "ainote" 212 | }, 213 | "language_info": { 214 | "codemirror_mode": { 215 | "name": "ipython", 216 | "version": 3 217 | }, 218 | "file_extension": ".py", 219 | "mimetype": "text/x-python", 220 | "name": "python", 221 | "nbconvert_exporter": "python", 222 | "pygments_lexer": "ipython3", 223 | "version": "3.10.0" 224 | } 225 | }, 226 | "nbformat": 4, 227 | "nbformat_minor": 0 228 | } 229 | -------------------------------------------------------------------------------- /project/langchain/chains/sequential_chain.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": { 6 | "collapsed": false 7 | }, 8 | "source": [ 9 | "## Part-4:Chain\n", 10 | "### Part-4.1:Chain -> LLMChain\n", 11 | "**LLMChain最简单的链,作为其他复杂 Chains 和 Agents 的内部调用,被广泛应用**" 12 | ] 13 | }, 14 | { 15 | "cell_type": "code", 16 | "execution_count": 3, 17 | "metadata": { 18 | "collapsed": false 19 | }, 20 | "outputs": [], 21 | "source": [ 22 | "import os\n", 23 | "import openai\n", 24 | "import configparser\n", 25 | "from langchain_openai import ChatOpenAI\n", 26 | "from langchain.schema import HumanMessage, SystemMessage, AIMessage\n", 27 | "from langchain_openai.llms import OpenAI\n", 28 | "from langchain import PromptTemplate\n", 29 | "from langchain.output_parsers import CommaSeparatedListOutputParser\n", 30 | "from langchain.output_parsers import DatetimeOutputParser\n", 31 | "from langchain.chains import LLMChain\n", 32 | "from langchain.chains import SequentialChain\n", 33 | "from langchain.chains import SimpleSequentialChain\n", 34 | "\n", 35 | "\n", 36 | "conf = configparser.ConfigParser()\n", 37 | "current_directory = os.path.dirname(os.path.realpath('__file__'))\n", 38 | "config_file_path = os.path.join(current_directory, '..', '..', '..', 'config.ini')\n", 39 | "conf.read(config_file_path)\n", 40 | "api_key = conf.get(\"Openai\", \"api_key\") # 在config.ini中配置自己的APIkey\n", 41 | "os.environ[\"HTTP_PROXY\"] = conf.get(\"Proxy\", \"HTTP_PROXY\") # 配置自己的代理\n", 42 | "os.environ[\"HTTPS_PROXY\"] = conf.get(\"Proxy\", \"HTTPS_PROXY\")\n", 43 | "chat_model = \"gpt-3.5-turbo\"\n", 44 | "text_model = \"gpt-3.5-turbo-instruct\"" 45 | ] 46 | }, 47 | { 48 | "cell_type": "code", 49 | "execution_count": 4, 50 | "metadata": { 51 | "collapsed": false 52 | }, 53 | "outputs": [], 54 | "source": [ 55 | "\n", 56 | "llm = OpenAI(temperature=0.9, max_tokens=500, openai_api_key=api_key)\n", 57 | "\n", 58 | "prompt_template = \"Tell me a {adjective} joke\"\n", 59 | "prompt = PromptTemplate(\n", 60 | " input_variables=[\"adjective\"],\n", 61 | " template=prompt_template\n", 62 | ")\n", 63 | "chain = LLMChain(llm=llm, prompt=prompt)" 64 | ] 65 | }, 66 | { 67 | "cell_type": "code", 68 | "execution_count": null, 69 | "metadata": { 70 | "collapsed": false 71 | }, 72 | "outputs": [], 73 | "source": [ 74 | "# print(chain.run({\n", 75 | "# 'adjective': \"dogs jokes\"\n", 76 | "# }))" 77 | ] 78 | }, 79 | { 80 | "cell_type": "markdown", 81 | "metadata": { 82 | "collapsed": false 83 | }, 84 | "source": [ 85 | "### Part-4.2:Chain -> SimpleSequentialChain\n", 86 | "**这是一个SimpleSequentialChain,按顺序运行这两个链,简单形式,单一输入/输出,并且一个步骤的输出是下一个步骤的输入。**" 87 | ] 88 | }, 89 | { 90 | "cell_type": "code", 91 | "execution_count": null, 92 | "metadata": { 93 | "collapsed": false 94 | }, 95 | "outputs": [], 96 | "source": [ 97 | "\n", 98 | "output_parser = CommaSeparatedListOutputParser()\n", 99 | "\n", 100 | "prompt_1 = PromptTemplate(template=\"你是一个游戏原画设计师,根据关键词生成描述信息,关键词:{keywords}\",\n", 101 | " input_variables=[\"keywords\"])\n", 102 | "\n", 103 | "prompt_2 = PromptTemplate(template=\"根据的文本内容,生成原画关键词列表。\\n文本内容:{text_content} \\n{output_prompt}\",\n", 104 | " input_variables=[\"text_content\"],\n", 105 | " partial_variables={\"output_prompt\": output_parser.get_format_instructions()})\n", 106 | "\n", 107 | "chain1 = LLMChain(llm=llm, prompt=prompt_1)\n", 108 | "chain2 = LLMChain(llm=llm, prompt=prompt_2)\n", 109 | "simple_chain = SimpleSequentialChain(chains=[chain1, chain2], verbose=True)" 110 | ] 111 | }, 112 | { 113 | "cell_type": "code", 114 | "execution_count": null, 115 | "metadata": { 116 | "collapsed": false 117 | }, 118 | "outputs": [], 119 | "source": [ 120 | "result_art_designer = simple_chain.run(\"慈祥的白发苍苍的老奶奶\")\n", 121 | "output_parser.parse(result_art_designer)" 122 | ] 123 | }, 124 | { 125 | "cell_type": "markdown", 126 | "metadata": { 127 | "collapsed": false 128 | }, 129 | "source": [ 130 | "### Part-4.3:Chain -> SequentialChain\n", 131 | "**SequentialChain 更通用形式的顺序链,允许多个输入/输出。**\n", 132 | "#### 使用 OutputParser 优化 overall_chain 输出格式,区分 synopsis_chain 和 review_chain 的结果" 133 | ] 134 | }, 135 | { 136 | "cell_type": "code", 137 | "execution_count": null, 138 | "metadata": { 139 | "collapsed": false 140 | }, 141 | "outputs": [], 142 | "source": [ 143 | "\n", 144 | "llm = OpenAI(temperature=0.9, max_tokens=500, openai_api_key=api_key)\n", 145 | "\n", 146 | "prompt_1 = PromptTemplate(template=\"你是一个游戏原画设计师,根据关键词生成描述信息,关键词:{keywords}\",\n", 147 | " input_variables=[\"keywords\"])\n", 148 | "\n", 149 | "prompt_2 = PromptTemplate(template=\"根据的文本内容,生成原画关键词列表。\\n文本内容:{text_content} \\n{output_prompt}\",\n", 150 | " input_variables=[\"text_content\"],\n", 151 | " partial_variables={\"output_prompt\": output_parser.get_format_instructions()})\n", 152 | "\n", 153 | "chain3 = LLMChain(llm=llm, prompt=prompt_1, output_key=\"text_content\")\n", 154 | "chain4 = LLMChain(llm=llm, prompt=prompt_2, output_key=\"keywords_list\")\n", 155 | "se_chain = SequentialChain(chains=[chain3, chain4], input_variables=[\"keywords\"],\n", 156 | " output_variables=[\"text_content\", \"keywords_list\"], verbose=True)" 157 | ] 158 | }, 159 | { 160 | "cell_type": "code", 161 | "execution_count": null, 162 | "metadata": { 163 | "collapsed": false 164 | }, 165 | "outputs": [], 166 | "source": [ 167 | "result_se_chain = se_chain({\"keywords\": \"12岁的npc少年\"})" 168 | ] 169 | }, 170 | { 171 | "cell_type": "code", 172 | "execution_count": null, 173 | "metadata": { 174 | "collapsed": false 175 | }, 176 | "outputs": [], 177 | "source": [ 178 | "output_parser.parse(result_se_chain.get(\"text_content\"))" 179 | ] 180 | } 181 | ], 182 | "metadata": { 183 | "kernelspec": { 184 | "display_name": "AINote", 185 | "language": "python", 186 | "name": "ainote" 187 | }, 188 | "language_info": { 189 | "codemirror_mode": { 190 | "name": "ipython", 191 | "version": 3 192 | }, 193 | "file_extension": ".py", 194 | "mimetype": "text/x-python", 195 | "name": "python", 196 | "nbconvert_exporter": "python", 197 | "pygments_lexer": "ipython3", 198 | "version": "3.10.0" 199 | } 200 | }, 201 | "nbformat": 4, 202 | "nbformat_minor": 0 203 | } 204 | -------------------------------------------------------------------------------- /project/langchain/chains/transform_chain.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": { 6 | "collapsed": false 7 | }, 8 | "source": [ 9 | "## Part-4.5:Chain -> TransformChain:实现快捷处理超长文本\n" 10 | ] 11 | }, 12 | { 13 | "cell_type": "code", 14 | "execution_count": 2, 15 | "metadata": { 16 | "collapsed": false 17 | }, 18 | "outputs": [], 19 | "source": [ 20 | "import os\n", 21 | "import openai\n", 22 | "import configparser\n", 23 | "from langchain_openai import ChatOpenAI\n", 24 | "from langchain.schema import HumanMessage, SystemMessage, AIMessage\n", 25 | "from langchain_openai.llms import OpenAI\n", 26 | "from langchain import PromptTemplate\n", 27 | "from langchain.output_parsers import CommaSeparatedListOutputParser\n", 28 | "from langchain.output_parsers import DatetimeOutputParser\n", 29 | "from langchain.chains import LLMChain\n", 30 | "from langchain.chains import SequentialChain\n", 31 | "from langchain.chains import SimpleSequentialChain\n", 32 | "\n", 33 | "conf = configparser.ConfigParser()\n", 34 | "current_directory = os.path.dirname(os.path.realpath('__file__'))\n", 35 | "config_file_path = os.path.join(current_directory, '..', '..', '..', 'config.ini')\n", 36 | "conf.read(config_file_path)\n", 37 | "api_key = conf.get(\"Openai\", \"api_key\") # 在config.ini中配置自己的APIkey\n", 38 | "os.environ[\"HTTP_PROXY\"] = conf.get(\"Proxy\", \"HTTP_PROXY\") # 配置自己的代理\n", 39 | "os.environ[\"HTTPS_PROXY\"] = conf.get(\"Proxy\", \"HTTPS_PROXY\")\n", 40 | "chat_model = \"gpt-3.5-turbo\"\n", 41 | "text_model = \"gpt-3.5-turbo-instruct\"" 42 | ] 43 | }, 44 | { 45 | "cell_type": "code", 46 | "execution_count": 3, 47 | "metadata": { 48 | "collapsed": false 49 | }, 50 | "outputs": [], 51 | "source": [ 52 | "llm = OpenAI(openai_api_key=api_key)" 53 | ] 54 | }, 55 | { 56 | "cell_type": "code", 57 | "execution_count": 4, 58 | "metadata": { 59 | "collapsed": false 60 | }, 61 | "outputs": [ 62 | { 63 | "ename": "FileNotFoundError", 64 | "evalue": "[Errno 2] No such file or directory: '../datas/the_old_man_and_the_sea.txt'", 65 | "output_type": "error", 66 | "traceback": [ 67 | "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", 68 | "\u001b[0;31mFileNotFoundError\u001b[0m Traceback (most recent call last)", 69 | "Cell \u001b[0;32mIn[4], line 3\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mlangchain\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mchains\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m TransformChain\n\u001b[0;32m----> 3\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m \u001b[38;5;28;43mopen\u001b[39;49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43m../datas/the_old_man_and_the_sea.txt\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m \u001b[38;5;28;01mas\u001b[39;00m f:\n\u001b[1;32m 4\u001b[0m novel_text \u001b[38;5;241m=\u001b[39m f\u001b[38;5;241m.\u001b[39mread()\n\u001b[1;32m 7\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mtransform_func\u001b[39m(inputs: \u001b[38;5;28mdict\u001b[39m) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m \u001b[38;5;28mdict\u001b[39m:\n", 70 | "File \u001b[0;32m~/pyenv/AINote/lib/python3.10/site-packages/IPython/core/interactiveshell.py:286\u001b[0m, in \u001b[0;36m_modified_open\u001b[0;34m(file, *args, **kwargs)\u001b[0m\n\u001b[1;32m 279\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m file \u001b[38;5;129;01min\u001b[39;00m {\u001b[38;5;241m0\u001b[39m, \u001b[38;5;241m1\u001b[39m, \u001b[38;5;241m2\u001b[39m}:\n\u001b[1;32m 280\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\n\u001b[1;32m 281\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mIPython won\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mt let you open fd=\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mfile\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m by default \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 282\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mas it is likely to crash IPython. If you know what you are doing, \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 283\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124myou can use builtins\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m open.\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 284\u001b[0m )\n\u001b[0;32m--> 286\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mio_open\u001b[49m\u001b[43m(\u001b[49m\u001b[43mfile\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", 71 | "\u001b[0;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: '../datas/the_old_man_and_the_sea.txt'" 72 | ] 73 | } 74 | ], 75 | "source": [ 76 | "from langchain.chains import TransformChain\n", 77 | "\n", 78 | "with open(\"../datas/the_old_man_and_the_sea.txt\") as f:\n", 79 | " novel_text = f.read()\n", 80 | "\n", 81 | "\n", 82 | "def transform_func(inputs: dict) -> dict:\n", 83 | " text = inputs[\"text\"]\n", 84 | " shortened_text = \"\\n\\n\".join(text.split(\"\\n\\n\")[:3])\n", 85 | " return {\"output_text\": shortened_text}\n", 86 | "\n", 87 | "\n", 88 | "transform_chain = TransformChain(\n", 89 | " input_variables=[\"text\"], output_variables=[\"output_text\"], transform=transform_func\n", 90 | ")\n", 91 | "transformed_novel = transform_chain(novel_text)" 92 | ] 93 | }, 94 | { 95 | "cell_type": "code", 96 | "execution_count": null, 97 | "metadata": { 98 | "collapsed": false 99 | }, 100 | "outputs": [], 101 | "source": [ 102 | "transformed_novel.keys()" 103 | ] 104 | }, 105 | { 106 | "cell_type": "code", 107 | "execution_count": null, 108 | "metadata": { 109 | "collapsed": false 110 | }, 111 | "outputs": [], 112 | "source": [ 113 | "template = \"\"\"总结下面文本:\n", 114 | "\n", 115 | "{output_text}\n", 116 | "\n", 117 | "总结:\"\"\"\n", 118 | "prompt = PromptTemplate(input_variables=[\"output_text\"], template=template)\n", 119 | "llm_chain = LLMChain(llm=llm, prompt=prompt, verbose=True)\n", 120 | "\n", 121 | "simple_chain = SimpleSequentialChain(chains=[transform_chain, llm_chain])\n", 122 | "\n", 123 | "simple_chain.run(novel_text[:100])" 124 | ] 125 | } 126 | ], 127 | "metadata": { 128 | "kernelspec": { 129 | "display_name": "AINote", 130 | "language": "python", 131 | "name": "ainote" 132 | }, 133 | "language_info": { 134 | "codemirror_mode": { 135 | "name": "ipython", 136 | "version": 3 137 | }, 138 | "file_extension": ".py", 139 | "mimetype": "text/x-python", 140 | "name": "python", 141 | "nbconvert_exporter": "python", 142 | "pygments_lexer": "ipython3", 143 | "version": "3.10.0" 144 | } 145 | }, 146 | "nbformat": 4, 147 | "nbformat_minor": 0 148 | } 149 | -------------------------------------------------------------------------------- /project/langchain/data_connection/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShengqinYang/AINote/b2882d3cf5f0ee00dad7d4bde955368c37327ae6/project/langchain/data_connection/__init__.py -------------------------------------------------------------------------------- /project/langchain/imgs/mac_chatglm推理.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShengqinYang/AINote/b2882d3cf5f0ee00dad7d4bde955368c37327ae6/project/langchain/imgs/mac_chatglm推理.png -------------------------------------------------------------------------------- /project/langchain/memory/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShengqinYang/AINote/b2882d3cf5f0ee00dad7d4bde955368c37327ae6/project/langchain/memory/__init__.py -------------------------------------------------------------------------------- /project/langchain/memory/mermory.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": { 6 | "collapsed": false, 7 | "jupyter": { 8 | "outputs_hidden": false 9 | } 10 | }, 11 | "source": [ 12 | "## LangChain 核心模块学习:Memory\n", 13 | "记住之前的对话。两个功能:读取(READ)和写入(WRITE)" 14 | ] 15 | }, 16 | { 17 | "cell_type": "code", 18 | "execution_count": 6, 19 | "metadata": { 20 | "collapsed": false, 21 | "jupyter": { 22 | "outputs_hidden": false 23 | } 24 | }, 25 | "outputs": [], 26 | "source": [ 27 | "import os\n", 28 | "import openai\n", 29 | "import configparser\n", 30 | "from langchain_openai import ChatOpenAI\n", 31 | "from langchain.schema import HumanMessage, SystemMessage, AIMessage\n", 32 | "from langchain_openai.llms import OpenAI\n", 33 | "from langchain import PromptTemplate\n", 34 | "from langchain.output_parsers import CommaSeparatedListOutputParser\n", 35 | "from langchain.output_parsers import DatetimeOutputParser\n", 36 | "from langchain.chains import LLMChain\n", 37 | "from langchain.chains import SequentialChain\n", 38 | "from langchain.chains import SimpleSequentialChain\n", 39 | "\n", 40 | "conf = configparser.ConfigParser()\n", 41 | "current_directory = os.path.dirname(os.path.realpath('__file__'))\n", 42 | "config_file_path = os.path.join(current_directory, '..', '..', '..', 'config.ini')\n", 43 | "conf.read(config_file_path)\n", 44 | "api_key = conf.get(\"Openai\", \"api_key\") # 在config.ini中配置自己的APIkey\n", 45 | "os.environ[\"HTTP_PROXY\"] = conf.get(\"Proxy\", \"HTTP_PROXY\") # 配置自己的代理\n", 46 | "os.environ[\"HTTPS_PROXY\"] = conf.get(\"Proxy\", \"HTTPS_PROXY\")\n", 47 | "chat_model = \"gpt-3.5-turbo\"\n", 48 | "text_model = \"gpt-3.5-turbo-instruct\"" 49 | ] 50 | }, 51 | { 52 | "cell_type": "code", 53 | "execution_count": 8, 54 | "metadata": { 55 | "collapsed": false, 56 | "jupyter": { 57 | "outputs_hidden": false 58 | } 59 | }, 60 | "outputs": [], 61 | "source": [ 62 | "llm = OpenAI(openai_api_key=api_key)" 63 | ] 64 | }, 65 | { 66 | "cell_type": "markdown", 67 | "metadata": { 68 | "collapsed": false, 69 | "jupyter": { 70 | "outputs_hidden": false 71 | } 72 | }, 73 | "source": [] 74 | }, 75 | { 76 | "cell_type": "code", 77 | "execution_count": 10, 78 | "metadata": { 79 | "collapsed": false, 80 | "jupyter": { 81 | "outputs_hidden": false 82 | } 83 | }, 84 | "outputs": [ 85 | { 86 | "name": "stdout", 87 | "output_type": "stream", 88 | "text": [ 89 | "\n", 90 | "\n", 91 | "\u001b[1m> Entering new ConversationChain chain...\u001b[0m\n", 92 | "Prompt after formatting:\n", 93 | "\u001b[32;1m\u001b[1;3mThe following is a friendly conversation between a human and an AI. The AI is talkative and provides lots of specific details from its context. If the AI does not know the answer to a question, it truthfully says it does not know.\n", 94 | "\n", 95 | "Current conversation:\n", 96 | "\n", 97 | "Human: Hi there!\n", 98 | "AI:\u001b[0m\n", 99 | "\n", 100 | "\u001b[1m> Finished chain.\u001b[0m\n" 101 | ] 102 | }, 103 | { 104 | "data": { 105 | "text/plain": [ 106 | "\" Hello! It's so nice to meet you. How are you doing today?\"" 107 | ] 108 | }, 109 | "execution_count": 10, 110 | "metadata": {}, 111 | "output_type": "execute_result" 112 | } 113 | ], 114 | "source": [ 115 | "\n", 116 | "from langchain.chains import ConversationChain\n", 117 | "from langchain.memory import ConversationBufferMemory\n", 118 | "\n", 119 | "cov_chain = ConversationChain(llm=llm, verbose=True, memory=ConversationBufferMemory())\n", 120 | "cov_chain.predict(input=\"Hi there!\")" 121 | ] 122 | }, 123 | { 124 | "cell_type": "code", 125 | "execution_count": null, 126 | "metadata": { 127 | "collapsed": false, 128 | "jupyter": { 129 | "outputs_hidden": false 130 | } 131 | }, 132 | "outputs": [], 133 | "source": [ 134 | "cov_chain.predict(input=\"help me translate to chinese: do you like me?\")\n" 135 | ] 136 | }, 137 | { 138 | "cell_type": "code", 139 | "execution_count": null, 140 | "metadata": { 141 | "collapsed": false, 142 | "jupyter": { 143 | "outputs_hidden": false 144 | } 145 | }, 146 | "outputs": [], 147 | "source": [ 148 | "from langchain.memory import ConversationBufferWindowMemory\n", 149 | "\n", 150 | "buffchain = ConversationChain(\n", 151 | " llm=llm,\n", 152 | " memory=ConversationBufferWindowMemory(k=2),\n", 153 | " verbose=True\n", 154 | ")\n", 155 | "buffchain.predict(input=\"hi your name is rose\")" 156 | ] 157 | }, 158 | { 159 | "cell_type": "code", 160 | "execution_count": null, 161 | "metadata": { 162 | "collapsed": false, 163 | "jupyter": { 164 | "outputs_hidden": false 165 | } 166 | }, 167 | "outputs": [], 168 | "source": [ 169 | "buffchain.predict(input=\"do you like study?\")\n" 170 | ] 171 | }, 172 | { 173 | "cell_type": "code", 174 | "execution_count": null, 175 | "metadata": { 176 | "collapsed": false, 177 | "jupyter": { 178 | "outputs_hidden": false 179 | } 180 | }, 181 | "outputs": [], 182 | "source": [ 183 | "buffchain.predict(input=\"i like study english\")\n" 184 | ] 185 | }, 186 | { 187 | "cell_type": "code", 188 | "execution_count": null, 189 | "metadata": { 190 | "collapsed": false, 191 | "jupyter": { 192 | "outputs_hidden": false 193 | } 194 | }, 195 | "outputs": [], 196 | "source": [ 197 | "buffchain.predict(input=\"i am bob, what's your name?\")\n" 198 | ] 199 | } 200 | ], 201 | "metadata": { 202 | "kernelspec": { 203 | "display_name": "AINote", 204 | "language": "python", 205 | "name": "ainote" 206 | }, 207 | "language_info": { 208 | "codemirror_mode": { 209 | "name": "ipython", 210 | "version": 3 211 | }, 212 | "file_extension": ".py", 213 | "mimetype": "text/x-python", 214 | "name": "python", 215 | "nbconvert_exporter": "python", 216 | "pygments_lexer": "ipython3", 217 | "version": "3.10.0" 218 | } 219 | }, 220 | "nbformat": 4, 221 | "nbformat_minor": 4 222 | } 223 | -------------------------------------------------------------------------------- /project/langchain/model_io/__init__.py: -------------------------------------------------------------------------------- 1 | from mm import PromptTemplate 2 | myPromptTemplate = PromptTemplate -------------------------------------------------------------------------------- /project/langchain/model_io/model.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": { 6 | "collapsed": false 7 | }, 8 | "source": [ 9 | "## Part-1:Models\n", 10 | "* 包括LLM and ChatModel" 11 | ] 12 | }, 13 | { 14 | "cell_type": "code", 15 | "execution_count": 11, 16 | "metadata": { 17 | "ExecuteTime": { 18 | "end_time": "2023-08-17T03:40:42.156112Z", 19 | "start_time": "2023-08-17T03:40:42.144407Z" 20 | }, 21 | "collapsed": false 22 | }, 23 | "outputs": [], 24 | "source": [ 25 | "import os\n", 26 | "import openai\n", 27 | "import configparser\n", 28 | "from langchain_openai import ChatOpenAI\n", 29 | "from langchain.schema import HumanMessage, SystemMessage, AIMessage\n", 30 | "from langchain_community.llms import OpenAI\n", 31 | "\n", 32 | "conf = configparser.ConfigParser()\n", 33 | "current_directory = os.path.dirname(os.path.realpath('__file__'))\n", 34 | "config_file_path = os.path.join(current_directory, '..', '..', '..','config.ini')\n", 35 | "conf.read(config_file_path)\n", 36 | "api_key = conf.get(\"Openai\", \"api_key\") # 在config.ini中配置自己的APIkey\n", 37 | "os.environ[\"HTTP_PROXY\"] = conf.get(\"Proxy\", \"HTTP_PROXY\") # 配置自己的代理\n", 38 | "os.environ[\"HTTPS_PROXY\"] = conf.get(\"Proxy\", \"HTTPS_PROXY\")\n", 39 | "chat_model = \"gpt-3.5-turbo\"\n", 40 | "text_model = \"gpt-3.5-turbo-instruct\" # text-davinci-003 2024-01-04已经下线了" 41 | ] 42 | }, 43 | { 44 | "cell_type": "code", 45 | "execution_count": 8, 46 | "metadata": { 47 | "ExecuteTime": { 48 | "end_time": "2023-08-17T03:40:51.952176Z", 49 | "start_time": "2023-08-17T03:40:46.588096Z" 50 | }, 51 | "collapsed": false 52 | }, 53 | "outputs": [ 54 | { 55 | "name": "stdout", 56 | "output_type": "stream", 57 | "text": [ 58 | "[1, 1, 2, 3, 6, 8, 10]\n" 59 | ] 60 | } 61 | ], 62 | "source": [ 63 | "# LLM\n", 64 | "text_object = OpenAI(model_name=text_model, openai_api_key=api_key)\n", 65 | "text_object.max_tokens = 300\n", 66 | "text_object.temperature = 0\n", 67 | "result = text_object(\"write a quick sort by python\")\n", 68 | "exec(result)\n", 69 | "print(quick_sort([3, 6, 8, 10, 1, 2, 1]))" 70 | ] 71 | }, 72 | { 73 | "cell_type": "markdown", 74 | "metadata": { 75 | "collapsed": false 76 | }, 77 | "source": [ 78 | "### Part-1.2:ChatModel" 79 | ] 80 | }, 81 | { 82 | "cell_type": "code", 83 | "execution_count": 9, 84 | "metadata": { 85 | "collapsed": false 86 | }, 87 | "outputs": [ 88 | { 89 | "name": "stdout", 90 | "output_type": "stream", 91 | "text": [ 92 | "[SystemMessage(content='you are my translator assisstant'), HumanMessage(content='translate into chinese: I am a lovely girl')]\n", 93 | "\n" 94 | ] 95 | }, 96 | { 97 | "data": { 98 | "text/plain": [ 99 | "AIMessage(content=\"我是一个可爱的女孩 (Wǒ shì yīgè kě'ài de nǚhái)\", additional_kwargs={'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 32, 'prompt_tokens': 27, 'total_tokens': 59}, 'model_name': 'gpt-3.5-turbo-0125', 'system_fingerprint': None, 'finish_reason': 'stop', 'logprobs': None}, id='run-dc29aa82-9c19-4b78-a65c-aec6980c7cef-0', usage_metadata={'input_tokens': 27, 'output_tokens': 32, 'total_tokens': 59})" 100 | ] 101 | }, 102 | "execution_count": 9, 103 | "metadata": {}, 104 | "output_type": "execute_result" 105 | } 106 | ], 107 | "source": [ 108 | "# ChatModel\n", 109 | "chat_object = ChatOpenAI(model_name=chat_model, openai_api_key=api_key)\n", 110 | "\n", 111 | "chat_object.max_tokens = 100\n", 112 | "chat_object.temperature = 0\n", 113 | "\n", 114 | "messages = [\n", 115 | " SystemMessage(content=\"you are my translator assisstant\"),\n", 116 | " HumanMessage(content=\"translate into chinese: I am a lovely girl\")\n", 117 | "]\n", 118 | "print(messages)\n", 119 | "result = chat_object(messages)\n", 120 | "print(type(result))\n", 121 | "result" 122 | ] 123 | } 124 | ], 125 | "metadata": { 126 | "kernelspec": { 127 | "display_name": "AINote", 128 | "language": "python", 129 | "name": "ainote" 130 | }, 131 | "language_info": { 132 | "codemirror_mode": { 133 | "name": "ipython", 134 | "version": 3 135 | }, 136 | "file_extension": ".py", 137 | "mimetype": "text/x-python", 138 | "name": "python", 139 | "nbconvert_exporter": "python", 140 | "pygments_lexer": "ipython3", 141 | "version": "3.10.0" 142 | } 143 | }, 144 | "nbformat": 4, 145 | "nbformat_minor": 0 146 | } 147 | -------------------------------------------------------------------------------- /project/langchain/model_io/model_chatglm.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "source": [ 6 | "## 在Macbook上私有化模型部署,ChatGLM2-6B-int4\n", 7 | "**1.ChatGLM2-6B项目仓库:**\n", 8 | " - https://github.com/THUDM/ChatGLM2-6B\n", 9 | "\n", 10 | "**2.chatglm.cpp项目仓库:**\n", 11 | " - https://github.com/li-plus/chatglm.cpp\n", 12 | " *因为要实现 Mac 笔记本上实时对话,所以选chatglm.cpp,chatglm.cpp 类似 llama.cpp 的 CPU 量化加速推理方案*\n", 13 | "\n", 14 | "**3.Models:模型选择chatglm2-6b-int4**\n", 15 | " - huggingface社区下载模型地址:\n", 16 | " - https://huggingface.co/THUDM/chatglm2-6b-int4/tree/main\n", 17 | "** **\n", 18 | "![mac_chatglm推理](../imgs/mac_chatglm推理.png)\n", 19 | "
\n", 20 | "\n", 21 | "** **\n", 22 | "### 具体步骤参见chatglm.cpp项目readme,下面是几个不容易理解的点\n", 23 | "\n", 24 | "
\n", 25 | "\n", 26 | "**1.clone chatglm.cpp 在下载第3方模块(third_party)时,可以进入third_party目录一个一个的下载**\n", 27 | "\n", 28 | "
\n", 29 | "\n", 30 | "```shell\n", 31 | " git clone --recursive https://github.com/li-plus/chatglm.cpp.git && cd chatglm.cpp\n", 32 | " git submodule update --init --recursive\n", 33 | "```\n", 34 | "
\n", 35 | "\n", 36 | "**2.THUDM/chatglm-6b模型下载太慢,可以手动去huggingface社区下载模型,(这里我选择的model:chatglm2-6b-int4)**\n", 37 | "\n", 38 | "
\n", 39 | "\n", 40 | "```shell\n", 41 | " python3 chatglm_cpp/convert.py -i THUDM/chatglm2-6b-int4 -t q4_0 -o chatglm-ggml.bin\n", 42 | " 如果是手动下载的 THUDM/chatglm2-6b-int4 替换成你的手动下载好的模型的路径\n", 43 | "\n", 44 | " cmake -B build\n", 45 | " cmake --build build -j --config Release\n", 46 | "```\n", 47 | "
\n", 48 | "\n", 49 | "**3.启动LangChain API -- Start the api server for LangChain:**\n", 50 | "\n", 51 | "
\n", 52 | "\n", 53 | "```shell\n", 54 | " cd chatglm.cpp/chatglm_cpp\n", 55 | " MODEL=../chatglm-ggml.bin uvicorn chatglm_cpp.langchain_api:app --host 127.0.0.1 --port 8000\n", 56 | "\n", 57 | " curl http://127.0.0.1:8000 -H 'Content-Type: application/json' -d '{\"prompt\": \"你好\"}'\n", 58 | "```\n", 59 | "** **\n" 60 | ], 61 | "metadata": { 62 | "collapsed": false 63 | } 64 | }, 65 | { 66 | "cell_type": "code", 67 | "execution_count": 27, 68 | "outputs": [ 69 | { 70 | "name": "stdout", 71 | "output_type": "stream", 72 | "text": [ 73 | "您好,我是您的英中翻译助手小智,请提供需要翻译的内容。\n", 74 | "['你好, 你是我的英中翻译助手:小智,请帮我将下面的内容翻译成中文', '您好,我是您的英中翻译助手小智,请提供需要翻译的内容。']\n" 75 | ] 76 | } 77 | ], 78 | "source": [ 79 | "# 直接调模型chatglm_cpp\n", 80 | "import chatglm_cpp\n", 81 | "\n", 82 | "chatglm_ggml = \"/Users/xxx/mygithub/chatglm.cpp/chatglm-ggml.bin\" # 替换成自己本地的模型路径\n", 83 | "pipeline = chatglm_cpp.Pipeline(chatglm_ggml)\n", 84 | "history = [\"你好, 你是我的英中翻译助手:小智,请帮我将下面的内容翻译成中文\"]\n", 85 | "res = pipeline.chat(history)\n", 86 | "history.append(res)\n", 87 | "print(res)\n", 88 | "print(history)" 89 | ], 90 | "metadata": { 91 | "collapsed": false, 92 | "ExecuteTime": { 93 | "end_time": "2023-10-17T08:26:17.247582Z", 94 | "start_time": "2023-10-17T08:26:13.650330Z" 95 | } 96 | } 97 | }, 98 | { 99 | "cell_type": "code", 100 | "execution_count": 28, 101 | "outputs": [ 102 | { 103 | "name": "stdout", 104 | "output_type": "stream", 105 | "text": [ 106 | "\"I am interested in Ai and have been studying it recently\" 翻译成中文是 \"我对AI很感兴趣,并且最近一直在学习它\"。\n", 107 | "['你好, 你是我的英中翻译助手:小智,请帮我将下面的内容翻译成中文', '您好,我是您的英中翻译助手小智,请提供需要翻译的内容。', 'I am interested in Ai and have been studying it recently', '\"I am interested in Ai and have been studying it recently\" 翻译成中文是 \"我对AI很感兴趣,并且最近一直在学习它\"。']\n" 108 | ] 109 | } 110 | ], 111 | "source": [ 112 | "history.append(\"I am interested in Ai and have been studying it recently\")\n", 113 | "res = pipeline.chat(history)\n", 114 | "history.append(res)\n", 115 | "print(res)\n", 116 | "print(history)" 117 | ], 118 | "metadata": { 119 | "collapsed": false, 120 | "ExecuteTime": { 121 | "end_time": "2023-10-17T08:26:24.438224Z", 122 | "start_time": "2023-10-17T08:26:22.682688Z" 123 | } 124 | } 125 | }, 126 | { 127 | "cell_type": "code", 128 | "execution_count": 29, 129 | "outputs": [ 130 | { 131 | "name": "stdout", 132 | "output_type": "stream", 133 | "text": [ 134 | "我叫小智。\n" 135 | ] 136 | } 137 | ], 138 | "source": [ 139 | "history.append(\"你叫什么名字?\")\n", 140 | "res = pipeline.chat(history)\n", 141 | "print(res)" 142 | ], 143 | "metadata": { 144 | "collapsed": false, 145 | "ExecuteTime": { 146 | "end_time": "2023-10-17T08:27:01.102658Z", 147 | "start_time": "2023-10-17T08:27:01.101009Z" 148 | } 149 | } 150 | }, 151 | { 152 | "cell_type": "code", 153 | "execution_count": 2, 154 | "outputs": [], 155 | "source": [ 156 | "# 使用Langchain调用chatglm_cpp模型\n", 157 | "from langchain.llms import ChatGLM\n", 158 | "from langchain.schema import SystemMessage, HumanMessage\n", 159 | "\n", 160 | "endpoint_url = (\n", 161 | " \"http://127.0.0.1:8000\"\n", 162 | ")\n", 163 | "history = []\n", 164 | "chatglm_llm = ChatGLM(\n", 165 | " endpoint_url=endpoint_url,\n", 166 | " history=history\n", 167 | ")" 168 | ], 169 | "metadata": { 170 | "collapsed": false, 171 | "ExecuteTime": { 172 | "end_time": "2023-09-20T04:02:11.181756Z", 173 | "start_time": "2023-09-20T04:02:11.178580Z" 174 | } 175 | } 176 | }, 177 | { 178 | "cell_type": "code", 179 | "execution_count": 4, 180 | "outputs": [], 181 | "source": [ 182 | "\n", 183 | "messages = [\n", 184 | " SystemMessage(content=\"you are my translator assisstant and your name is XJ-T, translate into chinese. \"),\n", 185 | " HumanMessage(content=\"I am a lovely girl\")\n", 186 | "]" 187 | ], 188 | "metadata": { 189 | "collapsed": false, 190 | "ExecuteTime": { 191 | "end_time": "2023-09-14T10:10:26.326811Z", 192 | "start_time": "2023-09-14T10:10:26.323840Z" 193 | } 194 | } 195 | }, 196 | { 197 | "cell_type": "code", 198 | "execution_count": 5, 199 | "outputs": [ 200 | { 201 | "data": { 202 | "text/plain": "AIMessage(content='我是一个可爱的女孩', additional_kwargs={}, example=False)" 203 | }, 204 | "execution_count": 5, 205 | "metadata": {}, 206 | "output_type": "execute_result" 207 | } 208 | ], 209 | "source": [ 210 | "result = chatglm_llm.predict_messages(messages)\n", 211 | "messages.append(result)\n", 212 | "result" 213 | ], 214 | "metadata": { 215 | "collapsed": false, 216 | "ExecuteTime": { 217 | "end_time": "2023-09-14T10:10:32.392420Z", 218 | "start_time": "2023-09-14T10:10:28.545166Z" 219 | } 220 | } 221 | }, 222 | { 223 | "cell_type": "code", 224 | "execution_count": 6, 225 | "outputs": [ 226 | { 227 | "data": { 228 | "text/plain": "AIMessage(content='AI: 我最喜欢的中国明星是周杰伦', additional_kwargs={}, example=False)" 229 | }, 230 | "execution_count": 6, 231 | "metadata": {}, 232 | "output_type": "execute_result" 233 | } 234 | ], 235 | "source": [ 236 | "messages.append(HumanMessage(content=\"My favorite star is JC-T\"))\n", 237 | "result = chatglm_llm.predict_messages(messages)\n", 238 | "messages.append(result)\n", 239 | "result" 240 | ], 241 | "metadata": { 242 | "collapsed": false, 243 | "ExecuteTime": { 244 | "end_time": "2023-09-14T10:10:46.592353Z", 245 | "start_time": "2023-09-14T10:10:41.642196Z" 246 | } 247 | } 248 | }, 249 | { 250 | "cell_type": "code", 251 | "execution_count": 7, 252 | "outputs": [ 253 | { 254 | "name": "stdout", 255 | "output_type": "stream", 256 | "text": [ 257 | "[SystemMessage(content='you are my translator assisstant and your name is XJ-T, translate into chinese. ', additional_kwargs={}), HumanMessage(content='I am a lovely girl', additional_kwargs={}, example=False), AIMessage(content='我是一个可爱的女孩', additional_kwargs={}, example=False), HumanMessage(content='My favorite star is JC-T', additional_kwargs={}, example=False), AIMessage(content='AI: 我最喜欢的中国明星是周杰伦', additional_kwargs={}, example=False)]\n" 258 | ] 259 | } 260 | ], 261 | "source": [ 262 | "print(messages)" 263 | ], 264 | "metadata": { 265 | "collapsed": false, 266 | "ExecuteTime": { 267 | "end_time": "2023-09-14T10:10:54.144853Z", 268 | "start_time": "2023-09-14T10:10:54.134393Z" 269 | } 270 | } 271 | }, 272 | { 273 | "cell_type": "code", 274 | "execution_count": 10, 275 | "outputs": [ 276 | { 277 | "data": { 278 | "text/plain": "AIMessage(content='AI: 我的名字是XJ-T。', additional_kwargs={}, example=False)" 279 | }, 280 | "execution_count": 10, 281 | "metadata": {}, 282 | "output_type": "execute_result" 283 | } 284 | ], 285 | "source": [ 286 | "messages.append(HumanMessage(content=\"你的名字是什么\"))\n", 287 | "result_m = chatglm_llm.predict_messages(messages)\n", 288 | "result_m" 289 | ], 290 | "metadata": { 291 | "collapsed": false, 292 | "ExecuteTime": { 293 | "end_time": "2023-09-14T10:12:31.478720Z", 294 | "start_time": "2023-09-14T10:12:25.464542Z" 295 | } 296 | } 297 | }, 298 | { 299 | "cell_type": "markdown", 300 | "source": [ 301 | "### 基于ChatGLM大语言模型的LLMChain" 302 | ], 303 | "metadata": { 304 | "collapsed": false 305 | } 306 | }, 307 | { 308 | "cell_type": "code", 309 | "execution_count": 15, 310 | "outputs": [ 311 | { 312 | "name": "stdout", 313 | "output_type": "stream", 314 | "text": [ 315 | "\n", 316 | "\n", 317 | "\u001B[1m> Entering new LLMChain chain...\u001B[0m\n", 318 | "Prompt after formatting:\n", 319 | "\u001B[32;1m\u001B[1;3mTell me a cold joke\u001B[0m\n", 320 | "\n", 321 | "\u001B[1m> Finished chain.\u001B[0m\n" 322 | ] 323 | }, 324 | { 325 | "data": { 326 | "text/plain": "\"Sure, here's a cold joke:\\n\\nWhy don't scientists trust atoms?\\n\\nBecause they make up everything!\"" 327 | }, 328 | "execution_count": 15, 329 | "metadata": {}, 330 | "output_type": "execute_result" 331 | } 332 | ], 333 | "source": [ 334 | "from langchain import LLMChain, PromptTemplate\n", 335 | "\n", 336 | "prompt_template = \"Tell me a {adjective} joke\"\n", 337 | "prompt = PromptTemplate(\n", 338 | " input_variables=[\"adjective\"], template=prompt_template\n", 339 | ")\n", 340 | "llm = LLMChain(llm=ChatGLM(), prompt=prompt, verbose=True)\n", 341 | "llm.run({\"adjective\": \"cold\"})\n" 342 | ], 343 | "metadata": { 344 | "collapsed": false, 345 | "ExecuteTime": { 346 | "end_time": "2023-09-14T10:40:07.308955Z", 347 | "start_time": "2023-09-14T10:40:04.882387Z" 348 | } 349 | } 350 | }, 351 | { 352 | "cell_type": "code", 353 | "execution_count": 16, 354 | "outputs": [ 355 | { 356 | "name": "stdout", 357 | "output_type": "stream", 358 | "text": [ 359 | "\n", 360 | "\n", 361 | "\u001B[1m> Entering new LLMChain chain...\u001B[0m\n", 362 | "Prompt after formatting:\n", 363 | "\u001B[32;1m\u001B[1;3mTell me a math joke\u001B[0m\n", 364 | "\n", 365 | "\u001B[1m> Finished chain.\u001B[0m\n" 366 | ] 367 | }, 368 | { 369 | "data": { 370 | "text/plain": "\"Sure, here's one:\\n\\nWhy did the math book look so sad?\\n\\nBecause it had too many problems.\"" 371 | }, 372 | "execution_count": 16, 373 | "metadata": {}, 374 | "output_type": "execute_result" 375 | } 376 | ], 377 | "source": [ 378 | "llm.run({\"adjective\": \"math\"})\n" 379 | ], 380 | "metadata": { 381 | "collapsed": false, 382 | "ExecuteTime": { 383 | "end_time": "2023-09-14T10:40:15.744134Z", 384 | "start_time": "2023-09-14T10:40:13.320563Z" 385 | } 386 | } 387 | } 388 | ], 389 | "metadata": { 390 | "kernelspec": { 391 | "display_name": "Python 3", 392 | "language": "python", 393 | "name": "python3" 394 | }, 395 | "language_info": { 396 | "codemirror_mode": { 397 | "name": "ipython", 398 | "version": 2 399 | }, 400 | "file_extension": ".py", 401 | "mimetype": "text/x-python", 402 | "name": "python", 403 | "nbconvert_exporter": "python", 404 | "pygments_lexer": "ipython2", 405 | "version": "2.7.6" 406 | } 407 | }, 408 | "nbformat": 4, 409 | "nbformat_minor": 0 410 | } 411 | -------------------------------------------------------------------------------- /project/langchain_autogpt/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShengqinYang/AINote/b2882d3cf5f0ee00dad7d4bde955368c37327ae6/project/langchain_autogpt/.gitkeep -------------------------------------------------------------------------------- /project/langchain_autogpt/README.md: -------------------------------------------------------------------------------- 1 | ### 基于LangChain实现网红项目 AutoGPT 2 | - 项目启动步骤: 3 | ```linux 4 | cd AINote/project/langchain_autogpt 5 | export OPENAI_API_KEY='openai apikey' 6 | export SERPAPI_API_KEY='google search apikey' 7 | python autogpt.py 8 | ``` 9 | ![img_1.png](files/img_1.png) 10 | 11 | - 查询结果展示 12 | ![img.png](files/img.png) 13 | ![img_2.png](files/img_2.png) 14 | 15 | -------------------------------------------------------------------------------- /project/langchain_autogpt/autogpt.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | import faiss 4 | import gradio as gr 5 | import openai 6 | from langchain import SerpAPIWrapper, FAISS, InMemoryDocstore 7 | from langchain_openai import ChatOpenAI 8 | from langchain.embeddings import OpenAIEmbeddings 9 | from langchain.tools import Tool, WriteFileTool, ReadFileTool 10 | from langchain_experimental.autonomous_agents import AutoGPT 11 | 12 | openai.api_key = os.getenv("OPENAI_API_KEY") 13 | 14 | 15 | class AutoGPTTool: 16 | def __init__(self): 17 | self.search = SerpAPIWrapper() 18 | self.tools = [ 19 | Tool( 20 | name="search", 21 | func=self.search.run, 22 | description="useful for when you need to answer questions about current events. You should ask targeted questions", 23 | ), 24 | WriteFileTool(), 25 | ReadFileTool(), 26 | ] 27 | 28 | self.embeddings_model = OpenAIEmbeddings() 29 | self.embedding_size = 1536 30 | self.index = faiss.IndexFlatL2(self.embedding_size) 31 | self.vectorstore = FAISS( 32 | self.embeddings_model.embed_query, 33 | self.index, 34 | InMemoryDocstore({}), 35 | {}, 36 | ) 37 | 38 | self.agent = AutoGPT.from_llm_and_tools( 39 | ai_name="檀小椒", 40 | ai_role="Assistant", 41 | tools=self.tools, 42 | llm=ChatOpenAI(temperature=0), 43 | memory=self.vectorstore.as_retriever(), 44 | ) 45 | self.agent.chain.verbose = True 46 | 47 | def process_question(self, question): 48 | return self.agent.run([question]) 49 | 50 | def setup_gradio_interface(self): 51 | iface = gr.Interface( 52 | fn=self.process_question, 53 | inputs=[gr.Textbox(lines=5, label="问题", placeholder="请输入问题...")], 54 | outputs=[gr.Textbox(lines=5, label="答案")], 55 | title="AutoGPT Chat 小助理", 56 | description="我是你的AutoGPT小助理:檀小椒,让我们开始聊天吧~", 57 | theme="soft", 58 | examples=["2023年9月4日北京的天气怎么样?", "2023年大运会举办地在哪?", 59 | "Auto-GPT 是什么?把结果写到autogpt.txt文件中"], 60 | allow_flagging="never" 61 | ) 62 | return iface 63 | 64 | 65 | if __name__ == "__main__": 66 | # 使用示例 67 | autogpt_tool = AutoGPTTool() 68 | gradio_interface = autogpt_tool.setup_gradio_interface() 69 | gradio_interface.launch(share=True, server_name="0.0.0.0") 70 | -------------------------------------------------------------------------------- /project/langchain_autogpt/files/img.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShengqinYang/AINote/b2882d3cf5f0ee00dad7d4bde955368c37327ae6/project/langchain_autogpt/files/img.png -------------------------------------------------------------------------------- /project/langchain_autogpt/files/img_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShengqinYang/AINote/b2882d3cf5f0ee00dad7d4bde955368c37327ae6/project/langchain_autogpt/files/img_1.png -------------------------------------------------------------------------------- /project/langchain_autogpt/files/img_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShengqinYang/AINote/b2882d3cf5f0ee00dad7d4bde955368c37327ae6/project/langchain_autogpt/files/img_2.png -------------------------------------------------------------------------------- /project/langchain_openai_translator/.idea/.gitignore: -------------------------------------------------------------------------------- 1 | # 默认忽略的文件 2 | /shelf/ 3 | /workspace.xml 4 | # 基于编辑器的 HTTP 客户端请求 5 | /httpRequests/ 6 | # Datasource local storage ignored files 7 | /dataSources/ 8 | /dataSources.local.xml 9 | -------------------------------------------------------------------------------- /project/langchain_openai_translator/.idea/inspectionProfiles/Project_Default.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | -------------------------------------------------------------------------------- /project/langchain_openai_translator/.idea/inspectionProfiles/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | -------------------------------------------------------------------------------- /project/langchain_openai_translator/.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /project/langchain_openai_translator/.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /project/langchain_openai_translator/.idea/openai-translator.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 11 | -------------------------------------------------------------------------------- /project/langchain_openai_translator/.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /project/langchain_openai_translator/README-CN.md: -------------------------------------------------------------------------------- 1 | # OpenAI-Translator 2 | 3 |

4 |
English | 中文 5 |

6 |

7 | 所有的代码和文档完全由 OpenAI 的 GPT-4 模型生成 8 |

9 | 10 | ## 介绍 11 | 12 | OpenAI 翻译器是一个使用 AI 技术将英文 PDF 书籍翻译成中文的工具。这个工具使用了大型语言模型 (LLMs),如 ChatGLM 和 OpenAI 的 GPT-3 以及 GPT-3.5 Turbo 来进行翻译。它是用 Python 构建的,并且具有灵活、模块化和面向对象的设计。 13 | 14 | ## 为什么做这个项目 15 | 16 | 在现今的环境中,缺乏非商业而且有效的 PDF 翻译工具。很多用户有包含敏感数据的 PDF 文件,他们更倾向于不将其上传到公共商业服务网站,以保护隐私。这个项目就是为了解决这个问题,为需要翻译他们的 PDF 文件同时又要保护数据隐私的用户提供解决方案。 17 | 18 | ## 示例结果 19 | 20 | OpenAI 翻译器目前还处于早期开发阶段,我正在积极地添加更多功能和改进其性能。我们非常欢迎任何反馈或贡献! 21 | 22 | ![The_Old_Man_of_the_Sea](images/sample_image_0.png) 23 | 24 |

25 | "老人与海" 26 |

27 | 28 | ## 特性 29 | 30 | - [X] 使用大型语言模型 (LLMs) 将英文 PDF 书籍翻译成中文。 31 | - [X] 支持 ChatGLM 和 OpenAI 模型。 32 | - [X] 通过 YAML 文件或命令行参数灵活配置。 33 | - [X] 对健壮的翻译操作进行超时和错误处理。 34 | - [X] 模块化和面向对象的设计,易于定制和扩展。 35 | - [x] 添加对其他语言和翻译方向的支持。 36 | - [ ] 实现图形用户界面 (GUI) 以便更易于使用。 37 | - [ ] 创建一个网络服务或 API,以便在网络应用中使用。 38 | - [ ] 添加对多个 PDF 文件的批处理支持。 39 | - [ ] 添加对保留源 PDF 的原始布局和格式的支持。 40 | - [ ] 通过使用自定义训练的翻译模型来提高翻译质量。 41 | 42 | 43 | ## 开始使用 44 | 45 | ### 环境准备 46 | 47 | 1.克隆仓库 `git clone git@github.com:DjangoPeng/openai-translator.git`。 48 | 49 | 2.OpenAI-翻译器 需要 Python 3.10 或更高版本。使用 `pip install -r requirements.txt` 安装依赖项。 50 | 51 | 3.设置您的 OpenAI API 密钥(`$OPENAI_API_KEY`)。您可以将其添加到环境变量中,或者在 config.yaml 文件中指定。 52 | 53 | ### 使用示例 54 | 55 | 您可以通过指定配置文件或提供命令行参数来使用 OpenAI-Translator 工具。 56 | 57 | #### 使用配置文件 58 | 59 | 根据您的设置调整 `config.yaml` 文件: 60 | 61 | ```yaml 62 | model_name: "gpt-3.5-turbo" 63 | input_file: "tests/test.pdf" 64 | output_file_format: "markdown" 65 | source_language: "English" 66 | target_language: "Chinese" 67 | ``` 68 | 69 | 然后命令行直接运行: 70 | 71 | ```bash 72 | python ai_translator/main.py 73 | ``` 74 | 75 | ![sample_out](images/sample_image_1.png) 76 | 77 | #### 使用命令行参数 78 | 79 | 您也可以直接在命令行上指定设置。这是使用 OpenAI 模型的例子: 80 | 81 | ```bash 82 | # 将您的 api_key 设置为环境变量 83 | export OPENAI_API_KEY="sk-xxx" 84 | python ai_translator/main.py --model_name "gpt-3.5-turbo" --input_file "your_input.pdf" --output_file_format "markdown" --source_language "English" --target_language "Chinese" 85 | ``` 86 | 87 | ```bash 88 | # 基于gradio_server图形化界面 89 | # 将您的 api_key 设置为环境变量 90 | export OPENAI_API_KEY="sk-xxx" 91 | # --model_name 可选 "chat_glm" or "gpt-3.5-turbo" 92 | python ai_translator/gradio_server.py --model_name "chat_glm" --input_file "your_input.pdf" --output_file_format "markdown" --source_language "English" --target_language "Chinese" 93 | ``` 94 | 95 | ```bash 96 | # 基于flask_server API接口模式 97 | # 将您的 api_key 设置为环境变量 98 | export OPENAI_API_KEY="sk-xxx" 99 | python ai_translator/flask_server.py --model_name "gpt-3.5-turbo" --input_file "your_input.pdf" --output_file_format "markdown" --source_language "English" --target_language "Chinese" 100 | ``` 101 | ## 许可证 102 | 103 | 该项目采用 GPL-3.0 许可证。有关详细信息,请查看 [LICENSE](LICENSE) 文件。 104 | 105 | 106 | 107 | 108 | -------------------------------------------------------------------------------- /project/langchain_openai_translator/README.md: -------------------------------------------------------------------------------- 1 | # OpenAI-Translator 2 | 3 |

4 |
English | 中文 5 |

6 |

7 | All the code and documentation are entirely generated by OpenAI's GPT-4 Model 8 |

9 | 10 | 11 | ## Introduction 12 | 13 | OpenAI Translator is an AI-powered translation tool designed to translate English PDF books to Chinese. The tool leverages large language models (LLMs) like ChatGLM and OpenAI's GPT-3 and GPT-3.5 Turbo for translation. It's built in Python and has a flexible, modular, and object-oriented design. 14 | 15 | ## Why this project 16 | 17 | In the current landscape, there's a lack of non-commercial yet efficient PDF translation tools. Many users have PDF documents with sensitive data that they prefer not to upload to public commercial service websites due to privacy concerns. This project was developed to address this gap, providing a solution for users who need to translate their PDFs while maintaining data privacy. 18 | 19 | ### Sample Results 20 | 21 | The OpenAI Translator is still in its early stages of development, and I'm actively working on adding more features and improving its performance. We appreciate any feedback or contributions! 22 | 23 | ![The_Old_Man_of_the_Sea](images/sample_image_0.png) 24 | 25 |

26 | "The Old Man and the Sea" 27 |

28 | 29 | ## Features 30 | 31 | - [X] Translation of English PDF books to Chinese using LLMs. 32 | - [X] Support for both [ChatGLM](https://github.com/THUDM/ChatGLM-6B) and [OpenAI](https://platform.openai.com/docs/models) models. 33 | - [X] Flexible configuration through a YAML file or command-line arguments. 34 | - [X] Timeouts and error handling for robust translation operations. 35 | - [X] Modular and object-oriented design for easy customization and extension. 36 | - [x] Add support for other languages and translation directions. 37 | - [ ] Implement a graphical user interface (GUI) for easier use. 38 | - [ ] Create a web service or API to enable usage in web applications. 39 | - [ ] Add support for batch processing of multiple PDF files. 40 | - [ ] Add support for preserving the original layout and formatting of the source PDF. 41 | - [ ] Improve translation quality by using custom-trained translation models. 42 | 43 | 44 | ## Getting Started 45 | 46 | ### Environment Setup 47 | 48 | 1.Clone the repository `git clone git@github.com:DjangoPeng/openai-translator.git`. 49 | 50 | 2.The `OpenAI-Translator` requires Python 3.10 or later. Install the dependencies with `pip install -r requirements.txt`. 51 | 52 | 3.Set up your OpenAI API key(`$OPENAI_API_KEY`). You can either add it to your environment variables or specify it in the config.yaml file. 53 | 54 | ### Usage 55 | 56 | You can use OpenAI-Translator either by specifying a configuration file or by providing command-line arguments. 57 | 58 | #### Using a configuration file: 59 | 60 | Adapt `config.yaml` file with your settings: 61 | 62 | ```yaml 63 | model_name: "gpt-3.5-turbo" 64 | input_file: "tests/test.pdf" 65 | output_file_format: "markdown" 66 | source_language: "English" 67 | target_language: "Chinese" 68 | ``` 69 | 70 | Then run the tool: 71 | 72 | ```bash 73 | python ai_translator/main.py 74 | ``` 75 | 76 | ![sample_out](images/sample_image_1.png) 77 | 78 | #### Using command-line arguments: 79 | 80 | You can also specify the settings directly on the command line. Here's an example of how to use the OpenAI model: 81 | 82 | ```bash 83 | # Set your api_key as an env variable 84 | export OPENAI_API_KEY="sk-xxx" 85 | python ai_translator/main.py --model_name "gpt-3.5-turbo" --input_file "your_input.pdf" --output_file_format "markdown" --source_language "English" --target_language "Chinese" 86 | ``` 87 | 88 | ```bash 89 | # Based on the gradio_server graphical interface, supported ChatGLM 90 | # Set your api_key as an env variable 91 | export OPENAI_API_KEY="sk-xxx" 92 | # --model_name optional "chat_glm" or "gpt-3.5-turbo" 93 | python ai_translator/gradio_server.py --model_name "chat_glm" --input_file "your_input.pdf" --output_file_format "markdown" --source_language "English" --target_language "Chinese" 94 | ``` 95 | 96 | ```bash 97 | # Based on the flask_server API pattern 98 | # Set your api_key as an env variable 99 | export OPENAI_API_KEY="sk-xxx" 100 | python ai_translator/flask_server.py --model_name "gpt-3.5-turbo" --input_file "your_input.pdf" --output_file_format "markdown" --source_language "English" --target_language "Chinese" 101 | ``` 102 | 103 | ## License 104 | 105 | This project is licensed under the GPL-3.0 License. See the [LICENSE](LICENSE) file for details. -------------------------------------------------------------------------------- /project/langchain_openai_translator/ai_translator/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShengqinYang/AINote/b2882d3cf5f0ee00dad7d4bde955368c37327ae6/project/langchain_openai_translator/ai_translator/__init__.py -------------------------------------------------------------------------------- /project/langchain_openai_translator/ai_translator/book/__init__.py: -------------------------------------------------------------------------------- 1 | from .book import Book 2 | from .page import Page 3 | from .content import ContentType, Content, TableContent -------------------------------------------------------------------------------- /project/langchain_openai_translator/ai_translator/book/book.py: -------------------------------------------------------------------------------- 1 | from .page import Page 2 | 3 | class Book: 4 | def __init__(self, pdf_file_path): 5 | self.pdf_file_path = pdf_file_path 6 | self.pages = [] 7 | 8 | def add_page(self, page: Page): 9 | self.pages.append(page) -------------------------------------------------------------------------------- /project/langchain_openai_translator/ai_translator/book/content.py: -------------------------------------------------------------------------------- 1 | import pandas as pd 2 | 3 | from enum import Enum, auto 4 | from PIL import Image as PILImage 5 | from utils import LOG 6 | from io import StringIO 7 | 8 | class ContentType(Enum): 9 | TEXT = auto() 10 | TABLE = auto() 11 | IMAGE = auto() 12 | 13 | class Content: 14 | def __init__(self, content_type, original, translation=None): 15 | self.content_type = content_type 16 | self.original = original 17 | self.translation = translation 18 | self.status = False 19 | 20 | def set_translation(self, translation, status): 21 | if not self.check_translation_type(translation): 22 | raise ValueError(f"Invalid translation type. Expected {self.content_type}, but got {type(translation)}") 23 | self.translation = translation 24 | self.status = status 25 | 26 | def check_translation_type(self, translation): 27 | if self.content_type == ContentType.TEXT and isinstance(translation, str): 28 | return True 29 | elif self.content_type == ContentType.TABLE and isinstance(translation, list): 30 | return True 31 | elif self.content_type == ContentType.IMAGE and isinstance(translation, PILImage.Image): 32 | return True 33 | return False 34 | 35 | def __str__(self): 36 | return self.original 37 | 38 | 39 | class TableContent(Content): 40 | def __init__(self, data, translation=None): 41 | df = pd.DataFrame(data) 42 | 43 | # Verify if the number of rows and columns in the data and DataFrame object match 44 | if len(data) != len(df) or len(data[0]) != len(df.columns): 45 | raise ValueError("The number of rows and columns in the extracted table data and DataFrame object do not match.") 46 | 47 | super().__init__(ContentType.TABLE, df) 48 | 49 | def set_translation(self, translation, status): 50 | try: 51 | if not isinstance(translation, str): 52 | raise ValueError(f"Invalid translation type. Expected str, but got {type(translation)}") 53 | 54 | LOG.debug(f"[translation]\n{translation}") 55 | # Extract column names from the first set of brackets 56 | header = translation.split(']')[0][1:].split(', ') 57 | # Extract data rows from the remaining brackets 58 | data_rows = translation.split('] ')[1:] 59 | # Replace Chinese punctuation and split each row into a list of values 60 | data_rows = [row[1:-1].split(', ') for row in data_rows] 61 | # Create a DataFrame using the extracted header and data 62 | translated_df = pd.DataFrame(data_rows, columns=header) 63 | LOG.debug(f"[translated_df]\n{translated_df}") 64 | self.translation = translated_df 65 | self.status = status 66 | except Exception as e: 67 | LOG.error(f"An error occurred during table translation: {e}") 68 | self.translation = None 69 | self.status = False 70 | 71 | def __str__(self): 72 | return self.original.to_string(header=False, index=False) 73 | 74 | def iter_items(self, translated=False): 75 | target_df = self.translation if translated else self.original 76 | for row_idx, row in target_df.iterrows(): 77 | for col_idx, item in enumerate(row): 78 | yield (row_idx, col_idx, item) 79 | 80 | def update_item(self, row_idx, col_idx, new_value, translated=False): 81 | target_df = self.translation if translated else self.original 82 | target_df.at[row_idx, col_idx] = new_value 83 | 84 | def get_original_as_str(self): 85 | return self.original.to_string(header=False, index=False) -------------------------------------------------------------------------------- /project/langchain_openai_translator/ai_translator/book/page.py: -------------------------------------------------------------------------------- 1 | from .content import Content 2 | 3 | class Page: 4 | def __init__(self): 5 | self.contents = [] 6 | 7 | def add_content(self, content: Content): 8 | self.contents.append(content) 9 | -------------------------------------------------------------------------------- /project/langchain_openai_translator/ai_translator/flask_server.py: -------------------------------------------------------------------------------- 1 | import sys 2 | import os 3 | 4 | sys.path.append(os.path.dirname(os.path.abspath(__file__))) 5 | 6 | from flask import Flask, request, send_file, jsonify 7 | from translator import PDFTranslator, TranslationConfig 8 | from utils import ArgumentParser, LOG 9 | 10 | app = Flask(__name__) 11 | 12 | TEMP_FILE_DIR = "flask_temps/" 13 | 14 | @app.route('/translation', methods=['POST']) 15 | def translation(): 16 | try: 17 | input_file = request.files['input_file'] 18 | source_language = request.form.get('source_language', 'English') 19 | target_language = request.form.get('target_language', 'Chinese') 20 | 21 | LOG.debug(f"[input_file]\n{input_file}") 22 | LOG.debug(f"[input_file.filename]\n{input_file.filename}") 23 | 24 | if input_file and input_file.filename: 25 | # # 创建临时文件 26 | input_file_path = TEMP_FILE_DIR+input_file.filename 27 | LOG.debug(f"[input_file_path]\n{input_file_path}") 28 | 29 | input_file.save(input_file_path) 30 | 31 | # 调用翻译函数 32 | output_file_path = Translator.translate_pdf( 33 | input_file=input_file_path, 34 | source_language=source_language, 35 | target_language=target_language) 36 | 37 | # 移除临时文件 38 | # os.remove(input_file_path) 39 | 40 | # 构造完整的文件路径 41 | output_file_path = os.getcwd() + "/" + output_file_path 42 | LOG.debug(output_file_path) 43 | 44 | # 返回翻译后的文件 45 | return send_file(output_file_path, as_attachment=True) 46 | except Exception as e: 47 | response = { 48 | 'status': 'error', 49 | 'message': str(e) 50 | } 51 | return jsonify(response), 400 52 | 53 | 54 | def initialize_translator(): 55 | # 解析命令行 56 | argument_parser = ArgumentParser() 57 | args = argument_parser.parse_arguments() 58 | 59 | # 初始化配置单例 60 | config = TranslationConfig() 61 | config.initialize(args) 62 | # 实例化 PDFTranslator 类,并调用 translate_pdf() 方法 63 | global Translator 64 | Translator = PDFTranslator(config.model_name) 65 | 66 | 67 | if __name__ == "__main__": 68 | # 初始化 translator 69 | initialize_translator() 70 | # 启动 Flask Web Server 71 | app.run(host="0.0.0.0", port=5000, debug=True) -------------------------------------------------------------------------------- /project/langchain_openai_translator/ai_translator/gradio_server.py: -------------------------------------------------------------------------------- 1 | import sys 2 | import os 3 | import gradio as gr 4 | 5 | sys.path.append(os.path.dirname(os.path.abspath(__file__))) 6 | 7 | from utils import ArgumentParser, LOG 8 | from translator import PDFTranslator, TranslationConfig 9 | 10 | 11 | def translation(input_file, source_language, target_language, output_file_format, translation_style): 12 | LOG.debug( 13 | f"[翻译任务]\n源文件: {input_file.name}\n源语言: {source_language}\n目标语言: {target_language}\n输出文件格式: {output_file_format}\n翻译风格: {translation_style}") 14 | 15 | output_file_path = Translator.translate_pdf( 16 | input_file.name, 17 | output_file_format=output_file_format, 18 | source_language=source_language, 19 | target_language=target_language, 20 | translation_style=translation_style) 21 | 22 | return output_file_path 23 | 24 | 25 | def launch_gradio(): 26 | language_options = ["Chinese", "English", "French", "German", "Spanish", "Korean", "Japanese"] 27 | file_format_options = ["Novels", "Press Releases", "Luxun Style"] 28 | output_file_options = ["Markdown", "PDF", "Word"] 29 | iface = gr.Interface( 30 | fn=translation, 31 | title="OpenAI-Translator v2.0(PDF 电子书翻译工具)", 32 | inputs=[ 33 | gr.File(label="上传PDF文件"), 34 | gr.inputs.Dropdown(choices=language_options, label="源语言(默认:英文)", default="English"), 35 | gr.inputs.Dropdown(choices=language_options, label="目标语言(默认:中文)", default="Chinese"), 36 | gr.inputs.Dropdown(choices=output_file_options, label="输出文件格式(默认:markdown)", default="markdown"), 37 | gr.inputs.Dropdown(choices=file_format_options, label="翻译风格(默认:小说)", default="novel") 38 | ], 39 | outputs=[ 40 | gr.File(label="下载翻译文件") 41 | ], 42 | allow_flagging="never", 43 | theme="default" 44 | ) 45 | 46 | iface.launch(share=True, server_name="0.0.0.0") 47 | 48 | 49 | def initialize_translator(): 50 | # 解析命令行 51 | argument_parser = ArgumentParser() 52 | args = argument_parser.parse_arguments() 53 | 54 | # 初始化配置单例 55 | config = TranslationConfig() 56 | config.initialize(args) 57 | # 实例化 PDFTranslator 类,并调用 translate_pdf() 方法 58 | global Translator 59 | Translator = PDFTranslator(config.model_name) 60 | 61 | 62 | if __name__ == "__main__": 63 | # 初始化 translator 64 | initialize_translator() 65 | # 启动 Gradio 服务 66 | launch_gradio() 67 | -------------------------------------------------------------------------------- /project/langchain_openai_translator/ai_translator/logs/translation.log: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShengqinYang/AINote/b2882d3cf5f0ee00dad7d4bde955368c37327ae6/project/langchain_openai_translator/ai_translator/logs/translation.log -------------------------------------------------------------------------------- /project/langchain_openai_translator/ai_translator/main.py: -------------------------------------------------------------------------------- 1 | import sys 2 | import os 3 | 4 | sys.path.append(os.path.dirname(os.path.abspath(__file__))) 5 | 6 | from utils import ArgumentParser, LOG 7 | from translator import PDFTranslator, TranslationConfig 8 | 9 | if __name__ == "__main__": 10 | # 解析命令行 11 | argument_parser = ArgumentParser() 12 | args = argument_parser.parse_arguments() 13 | 14 | # 初始化配置单例 15 | config = TranslationConfig() 16 | config.initialize(args) 17 | 18 | # 实例化 PDFTranslator 类,并调用 translate_pdf() 方法 19 | translator = PDFTranslator(config.model_name) 20 | translator.translate_pdf(config.input_file, config.output_file_format, pages=None) 21 | -------------------------------------------------------------------------------- /project/langchain_openai_translator/ai_translator/translator/__init__.py: -------------------------------------------------------------------------------- 1 | from .pdf_translator import PDFTranslator 2 | from .translation_config import TranslationConfig -------------------------------------------------------------------------------- /project/langchain_openai_translator/ai_translator/translator/exceptions.py: -------------------------------------------------------------------------------- 1 | class PageOutOfRangeException(Exception): 2 | def __init__(self, book_pages, requested_pages): 3 | self.book_pages = book_pages 4 | self.requested_pages = requested_pages 5 | super().__init__(f"Page out of range: Book has {book_pages} pages, but {requested_pages} pages were requested.") 6 | -------------------------------------------------------------------------------- /project/langchain_openai_translator/ai_translator/translator/pdf_parser.py: -------------------------------------------------------------------------------- 1 | import pdfplumber 2 | from typing import Optional 3 | from book import Book, Page, Content, ContentType, TableContent 4 | from translator.exceptions import PageOutOfRangeException 5 | from utils import LOG 6 | 7 | 8 | class PDFParser: 9 | def __init__(self): 10 | pass 11 | 12 | def parse_pdf(self, pdf_file_path: str, pages: Optional[int] = None) -> Book: 13 | book = Book(pdf_file_path) 14 | 15 | with pdfplumber.open(pdf_file_path) as pdf: 16 | if pages is not None and pages > len(pdf.pages): 17 | raise PageOutOfRangeException(len(pdf.pages), pages) 18 | 19 | if pages is None: 20 | pages_to_parse = pdf.pages 21 | else: 22 | pages_to_parse = pdf.pages[:pages] 23 | 24 | for pdf_page in pages_to_parse: 25 | page = Page() 26 | 27 | # Store the original text content 28 | raw_text = pdf_page.extract_text() 29 | tables = pdf_page.extract_tables() 30 | 31 | # Remove each cell's content from the original text 32 | for table_data in tables: 33 | for row in table_data: 34 | for cell in row: 35 | raw_text = raw_text.replace(cell, "", 1) 36 | 37 | # Handling text 38 | if raw_text: 39 | # Remove empty lines and leading/trailing whitespaces 40 | raw_text_lines = raw_text.splitlines() 41 | cleaned_raw_text_lines = [line.strip() for line in raw_text_lines if line.strip()] 42 | cleaned_raw_text = "\n".join(cleaned_raw_text_lines) 43 | 44 | text_content = Content(content_type=ContentType.TEXT, original=cleaned_raw_text) 45 | page.add_content(text_content) 46 | LOG.debug(f"[raw_text]\n {cleaned_raw_text}") 47 | 48 | 49 | 50 | # Handling tables 51 | if tables: 52 | table = TableContent(tables) 53 | page.add_content(table) 54 | LOG.debug(f"[table]\n{table}") 55 | 56 | book.add_page(page) 57 | 58 | return book 59 | -------------------------------------------------------------------------------- /project/langchain_openai_translator/ai_translator/translator/pdf_translator.py: -------------------------------------------------------------------------------- 1 | from typing import Optional 2 | from translator.pdf_parser import PDFParser 3 | from translator.writer import Writer 4 | from translator.translation_chain import TranslationChain 5 | from utils import LOG 6 | 7 | class PDFTranslator: 8 | def __init__(self, model_name: str): 9 | self.translate_chain = TranslationChain(model_name) 10 | self.pdf_parser = PDFParser() 11 | self.writer = Writer() 12 | 13 | def translate_pdf(self, 14 | input_file: str, 15 | output_file_format: str = 'markdown', 16 | source_language: str = "English", 17 | target_language: str = 'Chinese', 18 | translation_style: str = 'novel', 19 | pages: Optional[int] = None): 20 | 21 | self.book = self.pdf_parser.parse_pdf(input_file, pages) 22 | 23 | for page_idx, page in enumerate(self.book.pages): 24 | for content_idx, content in enumerate(page.contents): 25 | # Translate content.original 26 | translation, status = self.translate_chain.run(content, source_language, target_language, translation_style) 27 | # Update the content in self.book.pages directly 28 | self.book.pages[page_idx].contents[content_idx].set_translation(translation, status) 29 | 30 | return self.writer.save_translated_book(self.book, output_file_format, translation_style) 31 | -------------------------------------------------------------------------------- /project/langchain_openai_translator/ai_translator/translator/translation_chain.py: -------------------------------------------------------------------------------- 1 | from langchain_openai import ChatOpenAI 2 | from langchain.chains import LLMChain 3 | from langchain.llms import ChatGLM 4 | 5 | from langchain.prompts.chat import ( 6 | ChatPromptTemplate, 7 | SystemMessagePromptTemplate, 8 | HumanMessagePromptTemplate, 9 | ) 10 | 11 | from utils import LOG 12 | 13 | class TranslationChain: 14 | def __init__(self, model_name: str = "gpt-3.5-turbo", verbose: bool = True): 15 | 16 | # 翻译任务指令始终由 System 角色承担 17 | template = ( 18 | "You are a translation expert, proficient in various languages, \n" 19 | "and proficient in all kinds of style translation. Please use style: '{translation_style}'. \n" 20 | "Translates {source_language} to {target_language}. " 21 | ) 22 | system_message_prompt = SystemMessagePromptTemplate.from_template(template) 23 | 24 | # 待翻译文本由 Human 角色输入 25 | human_template = "{text}" 26 | human_message_prompt = HumanMessagePromptTemplate.from_template(human_template) 27 | 28 | # 使用 System 和 Human 角色的提示模板构造 ChatPromptTemplate 29 | chat_prompt_template = ChatPromptTemplate.from_messages( 30 | [system_message_prompt, human_message_prompt] 31 | ) 32 | if model_name == "gpt-3.5-turbo": 33 | # 为了翻译结果的稳定性,将 temperature 设置为 0 34 | chat = ChatOpenAI(model_name=model_name, temperature=0, verbose=verbose) 35 | elif model_name == "chat_glm": 36 | endpoint_url = ("http://127.0.0.1:8000") # endpoint_url 填写跑模型的地址 37 | chat = ChatGLM(endpoint_url=endpoint_url, temperature=0, verbose=verbose) 38 | else: 39 | raise Exception(f"This model is not supported. ModelName:{model_name}") 40 | 41 | self.chain = LLMChain(llm=chat, prompt=chat_prompt_template, verbose=verbose) 42 | 43 | def run(self, text: str, source_language: str, target_language: str, translation_style: str) -> (str, bool): 44 | result = "" 45 | try: 46 | result = self.chain.run({ 47 | "text": text, 48 | "source_language": source_language, 49 | "target_language": target_language, 50 | "translation_style": translation_style, 51 | }) 52 | except Exception as e: 53 | LOG.error(f"An error occurred during translation: {e}") 54 | return result, False 55 | 56 | return result, True -------------------------------------------------------------------------------- /project/langchain_openai_translator/ai_translator/translator/translation_config.py: -------------------------------------------------------------------------------- 1 | import yaml 2 | 3 | class TranslationConfig: 4 | _instance = None 5 | 6 | def __new__(cls): 7 | if cls._instance is None: 8 | cls._instance = super(TranslationConfig, cls).__new__(cls) 9 | cls._instance._config = None 10 | return cls._instance 11 | 12 | def initialize(self, args): 13 | with open(args.config_file, "r") as f: 14 | config = yaml.safe_load(f) 15 | 16 | # Use the argparse Namespace to update the configuration 17 | overridden_values = { 18 | key: value for key, value in vars(args).items() if key in config and value is not None 19 | } 20 | config.update(overridden_values) 21 | 22 | # Store the original config dictionary 23 | self._instance._config = config 24 | 25 | def __getattr__(self, name): 26 | # Try to get attribute from _config 27 | if self._instance._config and name in self._instance._config: 28 | return self._instance._config[name] 29 | raise AttributeError(f"'TranslationConfig' object has no attribute '{name}'") -------------------------------------------------------------------------------- /project/langchain_openai_translator/ai_translator/translator/writer.py: -------------------------------------------------------------------------------- 1 | import os 2 | from reportlab.lib import colors, pagesizes, units 3 | from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle 4 | from reportlab.pdfbase import pdfmetrics 5 | from reportlab.pdfbase.ttfonts import TTFont 6 | from reportlab.platypus import ( 7 | SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle, PageBreak 8 | ) 9 | from docx import Document 10 | from docx.shared import Pt, Inches 11 | 12 | from book import Book, ContentType 13 | from utils import LOG 14 | 15 | 16 | class Writer: 17 | def __init__(self): 18 | pass 19 | 20 | def save_translated_book(self, book: Book, ouput_file_format: str, translation_style: str): 21 | LOG.debug(ouput_file_format) 22 | 23 | if ouput_file_format.lower() == "pdf": 24 | file_suffix = f'_translated_{translation_style}.pdf' 25 | output_file_path = self._save_translated_book_pdf(book, file_suffix) 26 | elif ouput_file_format.lower() == "markdown": 27 | file_suffix = f'_translated_{translation_style}.md' 28 | output_file_path = self._save_translated_book_markdown(book, file_suffix) 29 | elif ouput_file_format.lower() == "word": 30 | file_suffix = f'_translated_{translation_style}.docx' 31 | output_file_path = self._save_translated_book_word(book, file_suffix) 32 | else: 33 | LOG.error(f"不支持文件类型: {ouput_file_format}") 34 | return "" 35 | 36 | LOG.info(f"翻译完成,文件保存至: {output_file_path}") 37 | 38 | return output_file_path 39 | 40 | def _save_translated_book_pdf(self, book: Book, file_suffix: str, output_file_path: str = None): 41 | output_file_path = book.pdf_file_path.replace('.pdf', file_suffix) 42 | LOG.info(f"开始导出: {output_file_path}") 43 | 44 | # Register Chinese font 45 | font_path = "../fonts/simsun.ttc" # 请将此路径替换为您的字体文件路径 46 | pdfmetrics.registerFont(TTFont("SimSun", font_path)) 47 | 48 | # Create a new ParagraphStyle with the SimSun font 49 | simsun_style = ParagraphStyle('SimSun', fontName='SimSun', fontSize=12, leading=14) 50 | 51 | # Create a PDF document 52 | doc = SimpleDocTemplate(output_file_path, pagesize=pagesizes.letter) 53 | styles = getSampleStyleSheet() 54 | story = [] 55 | 56 | # Iterate over the pages and contents 57 | for page in book.pages: 58 | for content in page.contents: 59 | if content.status: 60 | if content.content_type == ContentType.TEXT: 61 | # Add translated text to the PDF 62 | text = content.translation 63 | para = Paragraph(text, simsun_style) 64 | story.append(para) 65 | 66 | elif content.content_type == ContentType.TABLE: 67 | # Add table to the PDF 68 | table = content.translation 69 | table_style = TableStyle([ 70 | ('BACKGROUND', (0, 0), (-1, 0), colors.grey), 71 | ('TEXTCOLOR', (0, 0), (-1, 0), colors.whitesmoke), 72 | ('ALIGN', (0, 0), (-1, -1), 'CENTER'), 73 | ('FONTNAME', (0, 0), (-1, 0), 'SimSun'), # 更改表头字体为 "SimSun" 74 | ('FONTSIZE', (0, 0), (-1, 0), 14), 75 | ('BOTTOMPADDING', (0, 0), (-1, 0), 12), 76 | ('BACKGROUND', (0, 1), (-1, -1), colors.beige), 77 | ('FONTNAME', (0, 1), (-1, -1), 'SimSun'), # 更改表格中的字体为 "SimSun" 78 | ('GRID', (0, 0), (-1, -1), 1, colors.black) 79 | ]) 80 | pdf_table = Table(table.values.tolist()) 81 | pdf_table.setStyle(table_style) 82 | story.append(pdf_table) 83 | # Add a page break after each page except the last one 84 | if page != book.pages[-1]: 85 | story.append(PageBreak()) 86 | 87 | # Save the translated book as a new PDF file 88 | doc.build(story) 89 | return output_file_path 90 | 91 | def _save_translated_book_markdown(self, book: Book, file_suffix: str, output_file_path: str = None): 92 | output_file_path = book.pdf_file_path.replace('.pdf', file_suffix) 93 | 94 | LOG.info(f"开始导出: {output_file_path}") 95 | with open(output_file_path, 'w', encoding='utf-8') as output_file: 96 | # Iterate over the pages and contents 97 | for page in book.pages: 98 | for content in page.contents: 99 | if content.status: 100 | if content.content_type == ContentType.TEXT: 101 | # Add translated text to the Markdown file 102 | text = content.translation 103 | output_file.write(text + '\n\n') 104 | 105 | elif content.content_type == ContentType.TABLE: 106 | # Add table to the Markdown file 107 | table = content.translation 108 | header = '| ' + ' | '.join(str(column) for column in table.columns) + ' |' + '\n' 109 | separator = '| ' + ' | '.join(['---'] * len(table.columns)) + ' |' + '\n' 110 | # body = '\n'.join(['| ' + ' | '.join(row) + ' |' for row in table.values.tolist()]) + '\n\n' 111 | body = '\n'.join(['| ' + ' | '.join(str(cell) for cell in row) + ' |' for row in 112 | table.values.tolist()]) + '\n\n' 113 | output_file.write(header + separator + body) 114 | 115 | # Add a page break (horizontal rule) after each page except the last one 116 | if page != book.pages[-1]: 117 | output_file.write('---\n\n') 118 | 119 | return output_file_path 120 | 121 | def _save_translated_book_word(self, book: Book, file_suffix: str, output_file_path: str = None): 122 | output_file_path = book.pdf_file_path.replace('.pdf', file_suffix) 123 | LOG.info(f"开始导出: {output_file_path}") 124 | 125 | 126 | doc = Document() 127 | 128 | # Iterate over the pages and contents 129 | for page in book.pages: 130 | for content in page.contents: 131 | if content.status: 132 | if content.content_type == ContentType.TEXT: 133 | # Add translated text to the Word document 134 | text = content.translation 135 | p = doc.add_paragraph() 136 | run = p.add_run(text) 137 | run.font.size = Pt(12) # Set font size to 12pt 138 | run.font.name = 'Arial' # Set font to Arial 139 | 140 | elif content.content_type == ContentType.TABLE: 141 | # Add table to the Word document 142 | table = content.translation 143 | rows = len(table.values) 144 | cols = len(table.columns) 145 | doc.add_table(rows=rows + 1, cols=cols) 146 | table_cells = doc.tables[-1].rows 147 | header_row = table_cells[0].cells 148 | for i, column in enumerate(table.columns): 149 | header_row[i].text = str(column) 150 | for i, row in enumerate(table.values.tolist()): 151 | table_row = table_cells[i + 1].cells 152 | for j, cell in enumerate(row): 153 | table_row[j].text = str(cell) 154 | elif content.content_type == ContentType.IMAGE: 155 | # Add image to the Word document 156 | image_path = content.translation 157 | doc.add_picture(image_path, width=Inches(3)) # Adjust width as needed 158 | 159 | # Add a page break after each page except the last one 160 | if page != book.pages[-1]: 161 | doc.add_page_break() 162 | 163 | doc.save(output_file_path) 164 | 165 | LOG.info(f"翻译完成: {output_file_path}") 166 | return output_file_path 167 | -------------------------------------------------------------------------------- /project/langchain_openai_translator/ai_translator/utils/__init__.py: -------------------------------------------------------------------------------- 1 | from .argument_parser import ArgumentParser 2 | from .logger import LOG -------------------------------------------------------------------------------- /project/langchain_openai_translator/ai_translator/utils/argument_parser.py: -------------------------------------------------------------------------------- 1 | import argparse 2 | 3 | class ArgumentParser: 4 | def __init__(self): 5 | self.parser = argparse.ArgumentParser(description='A translation tool that supports translations in any language pair.') 6 | self.parser.add_argument('--config_file', type=str, default='config.yaml', help='Configuration file with model and API settings.') 7 | self.parser.add_argument('--model_name', type=str, help='Name of the Large Language Model.') 8 | self.parser.add_argument('--input_file', type=str, help='PDF file to translate.') 9 | self.parser.add_argument('--output_file_format', type=str, help='The file format of translated book. Now supporting PDF and Markdown') 10 | self.parser.add_argument('--source_language', type=str, help='The language of the original book to be translated.') 11 | self.parser.add_argument('--target_language', type=str, help='The target language for translating the original book.') 12 | 13 | def parse_arguments(self): 14 | args = self.parser.parse_args() 15 | return args 16 | -------------------------------------------------------------------------------- /project/langchain_openai_translator/ai_translator/utils/logger.py: -------------------------------------------------------------------------------- 1 | from loguru import logger 2 | import os 3 | import sys 4 | 5 | LOG_FILE = "translation.log" 6 | ROTATION_TIME = "02:00" 7 | 8 | class Logger: 9 | def __init__(self, name="translation", log_dir="logs", debug=False): 10 | if not os.path.exists(log_dir): 11 | os.makedirs(log_dir) 12 | log_file_path = os.path.join(log_dir, LOG_FILE) 13 | 14 | # Remove default loguru handler 15 | logger.remove() 16 | 17 | # Add console handler with a specific log level 18 | level = "DEBUG" if debug else "INFO" 19 | logger.add(sys.stdout, level=level) 20 | # Add file handler with a specific log level and timed rotation 21 | logger.add(log_file_path, rotation=ROTATION_TIME, level="DEBUG") 22 | self.logger = logger 23 | 24 | LOG = Logger(debug=True).logger 25 | 26 | if __name__ == "__main__": 27 | log = Logger().logger 28 | 29 | log.debug("This is a debug message.") 30 | log.info("This is an info message.") 31 | log.warning("This is a warning message.") 32 | log.error("This is an error message.") 33 | -------------------------------------------------------------------------------- /project/langchain_openai_translator/config.yaml: -------------------------------------------------------------------------------- 1 | model_name: "gpt-3.5-turbo" 2 | input_file: "tests/test.pdf" 3 | output_file_format: "markdown" 4 | source_language: "English" 5 | target_language: "Chinese" -------------------------------------------------------------------------------- /project/langchain_openai_translator/flask_temps/cesi.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShengqinYang/AINote/b2882d3cf5f0ee00dad7d4bde955368c37327ae6/project/langchain_openai_translator/flask_temps/cesi.pdf -------------------------------------------------------------------------------- /project/langchain_openai_translator/flask_temps/cesi_1.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShengqinYang/AINote/b2882d3cf5f0ee00dad7d4bde955368c37327ae6/project/langchain_openai_translator/flask_temps/cesi_1.pdf -------------------------------------------------------------------------------- /project/langchain_openai_translator/flask_temps/cesi_translated.md: -------------------------------------------------------------------------------- 1 | 测试数据 2 | 这个数据集包含了由OpenAI的AI语言模型ChatGPT提供的两个测试样本。这些样本包括一个Markdown表格和一个英文文本段落,可以用来测试支持文本和表格格式的英译中翻译软件。 3 | 文本测试 4 | 快速的棕色狐狸跳过懒狗。这个句子包含了英文字母表中的每个字母至少一次。句子是经常用来测试字体、键盘和其他与文本相关的工具的。除了英语,还有很多其他语言的句子。由于语言的独特特点,有些句子更难构造。 5 | 6 | -------------------------------------------------------------------------------- /project/langchain_openai_translator/flask_temps/cesi_translated_1.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShengqinYang/AINote/b2882d3cf5f0ee00dad7d4bde955368c37327ae6/project/langchain_openai_translator/flask_temps/cesi_translated_1.md -------------------------------------------------------------------------------- /project/langchain_openai_translator/fonts/simsun.ttc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShengqinYang/AINote/b2882d3cf5f0ee00dad7d4bde955368c37327ae6/project/langchain_openai_translator/fonts/simsun.ttc -------------------------------------------------------------------------------- /project/langchain_openai_translator/images/sample_image_0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShengqinYang/AINote/b2882d3cf5f0ee00dad7d4bde955368c37327ae6/project/langchain_openai_translator/images/sample_image_0.png -------------------------------------------------------------------------------- /project/langchain_openai_translator/images/sample_image_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShengqinYang/AINote/b2882d3cf5f0ee00dad7d4bde955368c37327ae6/project/langchain_openai_translator/images/sample_image_1.png -------------------------------------------------------------------------------- /project/langchain_openai_translator/jupyter/flask_client.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "id": "a4e32dd8-6716-463e-8120-91682dd65830", 7 | "metadata": {}, 8 | "outputs": [ 9 | { 10 | "name": "stdout", 11 | "output_type": "stream", 12 | "text": [ 13 | "Requirement already satisfied: requests in /root/miniconda3/envs/langchain/lib/python3.10/site-packages (2.31.0)\n", 14 | "Requirement already satisfied: charset-normalizer<4,>=2 in /root/miniconda3/envs/langchain/lib/python3.10/site-packages (from requests) (3.1.0)\n", 15 | "Requirement already satisfied: urllib3<3,>=1.21.1 in /root/miniconda3/envs/langchain/lib/python3.10/site-packages (from requests) (2.0.4)\n", 16 | "Requirement already satisfied: certifi>=2017.4.17 in /root/miniconda3/envs/langchain/lib/python3.10/site-packages (from requests) (2023.5.7)\n", 17 | "Requirement already satisfied: idna<4,>=2.5 in /root/miniconda3/envs/langchain/lib/python3.10/site-packages (from requests) (3.4)\n", 18 | "\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\u001b[33m\n", 19 | "\u001b[0m" 20 | ] 21 | } 22 | ], 23 | "source": [ 24 | "!pip install requests" 25 | ] 26 | }, 27 | { 28 | "cell_type": "markdown", 29 | "id": "eab5fa3d-3e27-4337-a891-85eda96ddf50", 30 | "metadata": {}, 31 | "source": [ 32 | "# 使用 requests 库请求翻译服务 API" 33 | ] 34 | }, 35 | { 36 | "cell_type": "code", 37 | "execution_count": 30, 38 | "id": "596c6c45-8b95-4beb-ae6f-b1c49aa4020c", 39 | "metadata": {}, 40 | "outputs": [ 41 | { 42 | "name": "stdout", 43 | "output_type": "stream", 44 | "text": [ 45 | "Translation completed. Translated file saved as translated_output.md.\n" 46 | ] 47 | } 48 | ], 49 | "source": [ 50 | "import requests\n", 51 | "\n", 52 | "# Flask服务器的地址\n", 53 | "FLASK_SERVER_URL = 'http://localhost:5000'\n", 54 | "\n", 55 | "# 翻译服务接口\n", 56 | "translation_url = f'{FLASK_SERVER_URL}/translation'\n", 57 | "\n", 58 | "# 要上传的文件路径\n", 59 | "file_path = '../tests/test.pdf' # 修改为你的文件路径\n", 60 | "\n", 61 | "# 构建请求参数\n", 62 | "params = {\n", 63 | " 'source_language': 'English', # 修改为你的源语言\n", 64 | " 'target_language': 'Chinese' # 修改为你的目标语言\n", 65 | "}\n", 66 | "\n", 67 | "# 发送POST请求\n", 68 | "with open(file_path, 'rb') as file:\n", 69 | " files = {'input_file': file}\n", 70 | " response = requests.post(translation_url, files=files, data=params)\n", 71 | "\n", 72 | "\n", 73 | "# 翻译后文件\n", 74 | "output_filename = \"translated_output.md\"\n", 75 | "\n", 76 | "# 处理响应\n", 77 | "if response.status_code == 200:\n", 78 | " # 保存翻译后的文件\n", 79 | " with open(output_filename, 'wb') as output_file:\n", 80 | " output_file.write(response.content)\n", 81 | " print(f\"Translation completed. Translated file saved as {output_filename}.\")\n", 82 | "else:\n", 83 | " print(f\"Translation failed. Status code: {response.status_code}\")\n", 84 | " print(response.text)\n" 85 | ] 86 | }, 87 | { 88 | "cell_type": "code", 89 | "execution_count": null, 90 | "id": "2da6286a-d92c-4eaf-abec-9f74cb7af599", 91 | "metadata": {}, 92 | "outputs": [], 93 | "source": [] 94 | } 95 | ], 96 | "metadata": { 97 | "kernelspec": { 98 | "display_name": "Python 3 (ipykernel)", 99 | "language": "python", 100 | "name": "python3" 101 | }, 102 | "language_info": { 103 | "codemirror_mode": { 104 | "name": "ipython", 105 | "version": 3 106 | }, 107 | "file_extension": ".py", 108 | "mimetype": "text/x-python", 109 | "name": "python", 110 | "nbconvert_exporter": "python", 111 | "pygments_lexer": "ipython3", 112 | "version": "3.10.11" 113 | } 114 | }, 115 | "nbformat": 4, 116 | "nbformat_minor": 5 117 | } 118 | -------------------------------------------------------------------------------- /project/langchain_openai_translator/logs/translation.2023-08-27_17-12-09_650050.log: -------------------------------------------------------------------------------- 1 | 2023-08-27 17:13:53.493 | DEBUG | __main__:translation:12 - [翻译任务] 2 | 源文件: /var/folders/33/xqd2f50x2qz5lyrrx621d81c0000gn/T/gradio/dc8fd32c027c5f2f838fa7f3b0414829e8c5c569/maven学习踩坑之旅.pdf 3 | 源语言: Chinese 4 | 目标语言: English 5 | 2023-08-27 17:13:53.553 | DEBUG | translator.pdf_parser:parse_pdf:46 - [raw_text] 6 | 理解⼀个Maven项目和Python的不同之处 7 | 1. Maven和Python虚拟环境的区别。 8 | 1. Python为了解决不同的项目包版本不⼀样的问题,直接开辟了⼀个新的独立于系统本体之外的环境,即虚拟环境。 9 | 2.Java是直接在将包的不同的版本放在同⼀个地⽅即: repository,通过各自项目配置各自的pom.xml来让maven加载相应的jar包。 10 | 2.Maven是什么? 11 | 1. 包管理⼯具,包的下载存放之类等,类似python的使用pip下载包,将包存放在各自项目对应的虚拟环境里等 12 | 3.setting.xml是什么⼲嘛的? 13 | 1. 设置maven参数的配置⽂件。并且,settings.xml是maven的全局配置⽂件。Settings.xml中包含类似本地仓储位置、修改远程仓储服 14 | 务器、认证信息等配置。配置包的下载地址,源等配置信息 15 | 4.Pom.xml是什么⼲嘛的? 16 | 1. Pom.xml⽂件是所在项目的局部配置。 配置具体要使用到的包内容,在改⽂件里添加了包名,maven会自动下载; 17 | 2.Java里确定唯⼀⼀个包的三个要点,groupId,artifactId,version 18 | 5.repository是什么⼲嘛的? 19 | 1. 包的具体存放地⽅:/Users/yangshengqin/myapps/maven/repository,等价python虚拟环境 20 | 6.Java和Scala不需要像Python⼀样虚拟环境? 21 | 1. 是的,因为在项目的pom.xml里指定里要使用的版本。项目回去 repositor y里找相应的版本 22 | 2023-08-27 17:17:27.345 | DEBUG | __main__:translation:12 - [翻译任务] 23 | 源文件: /var/folders/33/xqd2f50x2qz5lyrrx621d81c0000gn/T/gradio/dc8fd32c027c5f2f838fa7f3b0414829e8c5c569/maven学习踩坑之旅.pdf 24 | 源语言: Chinese 25 | 目标语言: English 26 | 2023-08-27 17:17:27.390 | DEBUG | translator.pdf_parser:parse_pdf:46 - [raw_text] 27 | 理解⼀个Maven项目和Python的不同之处 28 | 1. Maven和Python虚拟环境的区别。 29 | 1. Python为了解决不同的项目包版本不⼀样的问题,直接开辟了⼀个新的独立于系统本体之外的环境,即虚拟环境。 30 | 2.Java是直接在将包的不同的版本放在同⼀个地⽅即: repository,通过各自项目配置各自的pom.xml来让maven加载相应的jar包。 31 | 2.Maven是什么? 32 | 1. 包管理⼯具,包的下载存放之类等,类似python的使用pip下载包,将包存放在各自项目对应的虚拟环境里等 33 | 3.setting.xml是什么⼲嘛的? 34 | 1. 设置maven参数的配置⽂件。并且,settings.xml是maven的全局配置⽂件。Settings.xml中包含类似本地仓储位置、修改远程仓储服 35 | 务器、认证信息等配置。配置包的下载地址,源等配置信息 36 | 4.Pom.xml是什么⼲嘛的? 37 | 1. Pom.xml⽂件是所在项目的局部配置。 配置具体要使用到的包内容,在改⽂件里添加了包名,maven会自动下载; 38 | 2.Java里确定唯⼀⼀个包的三个要点,groupId,artifactId,version 39 | 5.repository是什么⼲嘛的? 40 | 1. 包的具体存放地⽅:/Users/yangshengqin/myapps/maven/repository,等价python虚拟环境 41 | 6.Java和Scala不需要像Python⼀样虚拟环境? 42 | 1. 是的,因为在项目的pom.xml里指定里要使用的版本。项目回去 repositor y里找相应的版本 43 | 2023-08-27 17:17:56.593 | DEBUG | translator.writer:save_translated_book:18 - markdown 44 | 2023-08-27 17:17:56.594 | INFO | translator.writer:_save_translated_book_markdown:90 - 开始导出: /var/folders/33/xqd2f50x2qz5lyrrx621d81c0000gn/T/gradio/dc8fd32c027c5f2f838fa7f3b0414829e8c5c569/maven学习踩坑之旅_translated.md 45 | 2023-08-27 17:17:56.594 | INFO | translator.writer:save_translated_book:28 - 翻译完成,文件保存至: /var/folders/33/xqd2f50x2qz5lyrrx621d81c0000gn/T/gradio/dc8fd32c027c5f2f838fa7f3b0414829e8c5c569/maven学习踩坑之旅_translated.md 46 | -------------------------------------------------------------------------------- /project/langchain_openai_translator/logs/translation.2023-08-29_11-00-52_348942.log: -------------------------------------------------------------------------------- 1 | 2023-08-29 11:00:52.341 | DEBUG | __main__:translation:22 - [input_file] 2 | 3 | 2023-08-29 11:00:52.352 | DEBUG | __main__:translation:23 - [input_file.filename] 4 | cesi.pdf 5 | 2023-08-29 11:00:52.357 | DEBUG | __main__:translation:28 - [input_file_path] 6 | flask_temps/cesi.pdf 7 | 2023-08-29 11:01:48.742 | DEBUG | __main__:translation:22 - [input_file] 8 | 9 | 2023-08-29 11:01:48.744 | DEBUG | __main__:translation:23 - [input_file.filename] 10 | cesi.pdf 11 | 2023-08-29 11:01:48.744 | DEBUG | __main__:translation:28 - [input_file_path] 12 | flask_temps/cesi.pdf 13 | 2023-08-29 11:04:36.100 | DEBUG | __main__:translation:22 - [input_file] 14 | 15 | 2023-08-29 11:04:36.110 | DEBUG | __main__:translation:23 - [input_file.filename] 16 | cesi.pdf 17 | 2023-08-29 11:04:36.111 | DEBUG | __main__:translation:28 - [input_file_path] 18 | flask_temps/cesi.pdf 19 | 2023-08-29 11:04:36.154 | DEBUG | translator.pdf_parser:parse_pdf:46 - [raw_text] 20 | Test Data 21 | This dataset contains two test samples provided by ChatGPT, an AI language model 22 | by OpenAI. These samples include a markdown table and an English text passage, 23 | which can be used to test an English-to-Chinese translation software supporting both 24 | text and table formats. 25 | Text testing 26 | The quick brown fox jumps over the lazy dog. This pangram contains every letter of 27 | the English alphabet at least once. Pangrams are often used to test fonts, keyboards, 28 | and other text-related tools. In addition to English, there are pangrams in many other 29 | languages. Some pangrams are more difficult to construct due to the unique 30 | characteristics of the language. 31 | 2023-08-29 11:19:36.135 | DEBUG | __main__:translation:22 - [input_file] 32 | 33 | 2023-08-29 11:19:36.136 | DEBUG | __main__:translation:23 - [input_file.filename] 34 | cesi.pdf 35 | 2023-08-29 11:19:36.137 | DEBUG | __main__:translation:28 - [input_file_path] 36 | flask_temps/cesi.pdf 37 | 2023-08-29 11:19:36.187 | DEBUG | translator.pdf_parser:parse_pdf:46 - [raw_text] 38 | Test Data 39 | This dataset contains two test samples provided by ChatGPT, an AI language model 40 | by OpenAI. These samples include a markdown table and an English text passage, 41 | which can be used to test an English-to-Chinese translation software supporting both 42 | text and table formats. 43 | Text testing 44 | The quick brown fox jumps over the lazy dog. This pangram contains every letter of 45 | the English alphabet at least once. Pangrams are often used to test fonts, keyboards, 46 | and other text-related tools. In addition to English, there are pangrams in many other 47 | languages. Some pangrams are more difficult to construct due to the unique 48 | characteristics of the language. 49 | 2023-08-29 11:19:37.838 | ERROR | translator.translation_chain:run:45 - An error occurred during translation: Incorrect API key provided: qEzC5U8U************************************BK9b. You can find your API key at https://platform.openai.com/account/api-keys. 50 | 2023-08-29 11:19:37.839 | DEBUG | translator.writer:save_translated_book:18 - markdown 51 | 2023-08-29 11:19:37.839 | INFO | translator.writer:_save_translated_book_markdown:90 - 开始导出: flask_temps/cesi_translated.md 52 | 2023-08-29 11:19:37.839 | INFO | translator.writer:save_translated_book:28 - 翻译完成,文件保存至: flask_temps/cesi_translated.md 53 | 2023-08-29 11:19:37.840 | DEBUG | __main__:translation:43 - /Users/yangshengqin/mygithub/openai-quickstart/langchain/openai-translator/flask_temps/cesi_translated.md 54 | 2023-08-29 11:25:46.185 | DEBUG | __main__:translation:21 - [input_file] 55 | 56 | 2023-08-29 11:25:46.197 | DEBUG | __main__:translation:22 - [input_file.filename] 57 | cesi.pdf 58 | 2023-08-29 11:25:46.198 | DEBUG | __main__:translation:30 - [input_file_path] 59 | flask_temps/cesi.pdf 60 | 2023-08-29 11:25:46.250 | DEBUG | translator.pdf_parser:parse_pdf:46 - [raw_text] 61 | Test Data 62 | This dataset contains two test samples provided by ChatGPT, an AI language model 63 | by OpenAI. These samples include a markdown table and an English text passage, 64 | which can be used to test an English-to-Chinese translation software supporting both 65 | text and table formats. 66 | Text testing 67 | The quick brown fox jumps over the lazy dog. This pangram contains every letter of 68 | the English alphabet at least once. Pangrams are often used to test fonts, keyboards, 69 | and other text-related tools. In addition to English, there are pangrams in many other 70 | languages. Some pangrams are more difficult to construct due to the unique 71 | characteristics of the language. 72 | 2023-08-29 11:25:47.793 | ERROR | translator.translation_chain:run:45 - An error occurred during translation: Incorrect API key provided: qEzC5U8U************************************BK9b. You can find your API key at https://platform.openai.com/account/api-keys. 73 | 2023-08-29 11:25:47.795 | DEBUG | translator.writer:save_translated_book:18 - markdown 74 | 2023-08-29 11:25:47.795 | INFO | translator.writer:_save_translated_book_markdown:90 - 开始导出: flask_temps/cesi_translated.md 75 | 2023-08-29 11:25:47.796 | INFO | translator.writer:save_translated_book:28 - 翻译完成,文件保存至: flask_temps/cesi_translated.md 76 | 2023-08-29 11:25:47.796 | DEBUG | __main__:translation:45 - /Users/yangshengqin/mygithub/openai-quickstart/langchain/openai-translator/flask_temps/cesi_translated.md 77 | 2023-08-29 11:30:54.075 | DEBUG | __main__:translation:21 - [input_file] 78 | 79 | 2023-08-29 11:30:54.076 | DEBUG | __main__:translation:22 - [input_file.filename] 80 | cesi.pdf 81 | 2023-08-29 11:30:54.077 | DEBUG | __main__:translation:29 - [input_file_path] 82 | flask_temps/cesi.pdf 83 | 2023-08-29 13:55:06.502 | DEBUG | __main__:translation:21 - [input_file] 84 | 85 | 2023-08-29 13:55:06.505 | DEBUG | __main__:translation:22 - [input_file.filename] 86 | cesi.pdf 87 | 2023-08-29 13:55:06.505 | DEBUG | __main__:translation:30 - [input_file_path] 88 | flask_temps/cesi.pdf 89 | 2023-08-29 13:55:06.552 | DEBUG | translator.pdf_parser:parse_pdf:46 - [raw_text] 90 | Test Data 91 | This dataset contains two test samples provided by ChatGPT, an AI language model 92 | by OpenAI. These samples include a markdown table and an English text passage, 93 | which can be used to test an English-to-Chinese translation software supporting both 94 | text and table formats. 95 | Text testing 96 | The quick brown fox jumps over the lazy dog. This pangram contains every letter of 97 | the English alphabet at least once. Pangrams are often used to test fonts, keyboards, 98 | and other text-related tools. In addition to English, there are pangrams in many other 99 | languages. Some pangrams are more difficult to construct due to the unique 100 | characteristics of the language. 101 | 2023-08-29 13:56:28.004 | DEBUG | __main__:translation:21 - [input_file] 102 | 103 | 2023-08-29 13:56:28.006 | DEBUG | __main__:translation:22 - [input_file.filename] 104 | cesi.pdf 105 | 2023-08-29 13:56:28.007 | DEBUG | __main__:translation:30 - [input_file_path] 106 | flask_temps/cesi.pdf 107 | 2023-08-29 13:56:28.057 | DEBUG | translator.pdf_parser:parse_pdf:46 - [raw_text] 108 | Test Data 109 | This dataset contains two test samples provided by ChatGPT, an AI language model 110 | by OpenAI. These samples include a markdown table and an English text passage, 111 | which can be used to test an English-to-Chinese translation software supporting both 112 | text and table formats. 113 | Text testing 114 | The quick brown fox jumps over the lazy dog. This pangram contains every letter of 115 | the English alphabet at least once. Pangrams are often used to test fonts, keyboards, 116 | and other text-related tools. In addition to English, there are pangrams in many other 117 | languages. Some pangrams are more difficult to construct due to the unique 118 | characteristics of the language. 119 | 2023-08-29 13:57:34.691 | DEBUG | translator.writer:save_translated_book:18 - markdown 120 | 2023-08-29 13:57:34.691 | INFO | translator.writer:_save_translated_book_markdown:90 - 开始导出: flask_temps/cesi_translated.md 121 | 2023-08-29 13:57:34.691 | INFO | translator.writer:save_translated_book:28 - 翻译完成,文件保存至: flask_temps/cesi_translated.md 122 | 2023-08-29 13:57:34.691 | DEBUG | __main__:translation:45 - /Users/yangshengqin/mygithub/openai-quickstart/langchain/openai-translator/flask_temps/cesi_translated.md 123 | -------------------------------------------------------------------------------- /project/langchain_openai_translator/logs/translation.2023-09-06_18-27-55_738519.log: -------------------------------------------------------------------------------- 1 | 2023-09-06 18:27:55.733 | DEBUG | translator.pdf_parser:parse_pdf:46 - [raw_text] 2 | Test Data 3 | This dataset contains two test samples provided by ChatGPT, an AI language model by OpenAI. 4 | These samples include a markdown table and an English text passage, which can be used to test an 5 | English-to-Chinese translation software supporting both text and table formats. 6 | Text testing 7 | The quick brown fox jumps over the lazy dog. This pangram contains every letter of the English 8 | alphabet at least once. Pangrams are often used to test fonts, keyboards, and other text-related 9 | tools. In addition to English, there are pangrams in many other languages. Some pangrams are more 10 | difficult to construct due to the unique characteristics of the language. 11 | Table Testing 12 | 2023-09-06 18:27:55.738 | DEBUG | translator.pdf_parser:parse_pdf:54 - [table] 13 | [Fruit, Color, Price (USD)] [Apple, Red, 1.20] [Banana, Yellow, 0.50] [Orange, Orange, 0.80] [Strawberry, Red, 2.50] [Blueberry, Blue, 3.00] [Kiwi, Green, 1.00] [Mango, Orange, 1.50] [Grape, Purple, 2.00] 14 | -------------------------------------------------------------------------------- /project/langchain_openai_translator/requirements.txt: -------------------------------------------------------------------------------- 1 | pdfplumber 2 | simplejson 3 | requests 4 | PyYAML 5 | pillow 6 | reportlab 7 | pandas 8 | loguru 9 | openai 10 | langchain 11 | gradio 12 | flask -------------------------------------------------------------------------------- /project/langchain_openai_translator/tests/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShengqinYang/AINote/b2882d3cf5f0ee00dad7d4bde955368c37327ae6/project/langchain_openai_translator/tests/.DS_Store -------------------------------------------------------------------------------- /project/langchain_openai_translator/tests/ThamesNewsCH.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShengqinYang/AINote/b2882d3cf5f0ee00dad7d4bde955368c37327ae6/project/langchain_openai_translator/tests/ThamesNewsCH.pdf -------------------------------------------------------------------------------- /project/langchain_openai_translator/tests/ThamesNewsEN.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShengqinYang/AINote/b2882d3cf5f0ee00dad7d4bde955368c37327ae6/project/langchain_openai_translator/tests/ThamesNewsEN.pdf -------------------------------------------------------------------------------- /project/langchain_openai_translator/tests/The_Old_Man_of_the_Sea.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShengqinYang/AINote/b2882d3cf5f0ee00dad7d4bde955368c37327ae6/project/langchain_openai_translator/tests/The_Old_Man_of_the_Sea.pdf -------------------------------------------------------------------------------- /project/langchain_openai_translator/tests/press_release_translated_novel.md: -------------------------------------------------------------------------------- 1 | 自从泰晤士河的部分地区被宣布为“生物死亡”以来,仅仅过去了半个世纪,因为河水太脏。但是现在,泰晤士河的水质比任何时候都要清洁,企业家们希望在伦敦市中心的泰晤士河中建造一个价值1000万英镑的露天游泳池。 2 | 来自德国的净化专家(德国拥有欧洲最高的水质标准)设计了一个系统,该计划的支持者表示,这个系统将确保游客的安全,无论年龄大小。 3 | 泰晤士河的浴池位于伦敦堤岸的庙阶,周围环绕着芦苇床,用于过滤河水,然后将其泵入82英尺乘32英尺的主游泳池,游泳池下方的甲板上还有一个次级过滤装置。由于下雨时的污水溢出和喜剧演员大卫·沃利姆斯在2011年进行的一次长达140英里的慈善游泳中患上了“泰晤士肚”,人们对该项目提出了健康担忧。但是,德国Polyplan公司的专家提出了一个解决方案。该公司在整个欧洲建造了许多天然游泳池。参与该项目的英国公司Gartenart的蒂姆·埃文斯表示,这个未加热且无氯的水将“和你在山湖中找到的任何水一样干净”。 4 | 这个游泳池将设有更衣室、一条从岸边通向水中的130英尺的斜坡、一个浸泡池和一个儿童戏水区,而一道4英尺高的玻璃栏杆将保护游泳者免受河流交通引起的波浪的影响。伦敦建筑事务所Studio Octopi的克里斯·罗默-李表示,他希望通过众筹筹集30万英镑的初始资金,用于咨询费用和其他费用,众筹是指公众可以为社区计划做出贡献。 5 | 如果获得规划许可,这个游泳池可能会在明年晚些时候开放。 6 | 7 | -------------------------------------------------------------------------------- /project/langchain_openai_translator/tests/test.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShengqinYang/AINote/b2882d3cf5f0ee00dad7d4bde955368c37327ae6/project/langchain_openai_translator/tests/test.pdf -------------------------------------------------------------------------------- /project/langchain_openai_translator/tests/test_translated.md: -------------------------------------------------------------------------------- 1 | 测试数据 2 | 这个数据集包含了由OpenAI的AI语言模型ChatGPT提供的两个测试样本。 3 | 这些样本包括一个Markdown表格和一个英文文本段落,可以用来测试支持文本和表格格式的英译中翻译软件。 4 | 文本测试 5 | 快速的棕色狐狸跳过懒狗。这个句子包含了英语字母表中的每个字母至少一次。句子是经常用来测试字体、键盘和其他与文本相关的工具的。除了英语,其他许多语言也有句子。由于语言的独特特点,有些句子更难构造。 6 | 7 | | 水果 | 颜色 | 价格(美元) | 8 | | --- | --- | --- | 9 | | 苹果 | 红色 | 1.2 | 10 | | 香蕉 | 黄色 | 0.5 | 11 | | 橙子 | 橙色 | 0.8 | 12 | | 草莓 | 红色 | 2.5 | 13 | | 蓝莓 | 蓝色 | 3.0 | 14 | | 猕猴桃 | 绿色 | 1.0 | 15 | | 芒果 | 橙色 | 1.5 | 16 | | 葡萄 | 紫色 | 2.00 | 17 | 18 | --- 19 | 20 | -------------------------------------------------------------------------------- /project/openai_api/4.class_tiktoken.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 3, 6 | "metadata": { 7 | "ExecuteTime": { 8 | "end_time": "2023-07-26T05:53:33.852966Z", 9 | "start_time": "2023-07-26T05:53:33.722175Z" 10 | }, 11 | "collapsed": true, 12 | "jupyter": { 13 | "outputs_hidden": true 14 | } 15 | }, 16 | "outputs": [], 17 | "source": [ 18 | "import tiktoken" 19 | ] 20 | }, 21 | { 22 | "cell_type": "code", 23 | "execution_count": 4, 24 | "metadata": { 25 | "ExecuteTime": { 26 | "end_time": "2023-07-26T05:53:35.870055Z", 27 | "start_time": "2023-07-26T05:53:35.821973Z" 28 | }, 29 | "collapsed": false, 30 | "jupyter": { 31 | "outputs_hidden": false 32 | } 33 | }, 34 | "outputs": [ 35 | { 36 | "data": { 37 | "text/plain": [ 38 | "['gpt2', 'r50k_base', 'p50k_base', 'p50k_edit', 'cl100k_base']" 39 | ] 40 | }, 41 | "execution_count": 4, 42 | "metadata": {}, 43 | "output_type": "execute_result" 44 | } 45 | ], 46 | "source": [ 47 | "datas = tiktoken.list_encoding_names()\n", 48 | "datas" 49 | ] 50 | }, 51 | { 52 | "cell_type": "code", 53 | "execution_count": 5, 54 | "metadata": { 55 | "ExecuteTime": { 56 | "end_time": "2023-07-26T05:53:38.237535Z", 57 | "start_time": "2023-07-26T05:53:38.234636Z" 58 | }, 59 | "collapsed": false, 60 | "jupyter": { 61 | "outputs_hidden": false 62 | } 63 | }, 64 | "outputs": [], 65 | "source": [ 66 | "# 封装一个计算token数的函数\n", 67 | "def token_num(encoding_name, model, string):\n", 68 | " tiktoken.get_encoding(encoding_name)\n", 69 | " encoding = tiktoken.encoding_for_model(model)\n", 70 | " tokens = encoding.encode(string)\n", 71 | " print(f\"句子:{string}, tokens:{tokens}, token 数量:{len(tokens)}\")\n", 72 | " return len(tokens)\n" 73 | ] 74 | }, 75 | { 76 | "cell_type": "code", 77 | "execution_count": 6, 78 | "metadata": { 79 | "ExecuteTime": { 80 | "end_time": "2023-07-26T05:54:32.252888Z", 81 | "start_time": "2023-07-26T05:53:40.477050Z" 82 | }, 83 | "collapsed": false, 84 | "jupyter": { 85 | "outputs_hidden": false 86 | } 87 | }, 88 | "outputs": [ 89 | { 90 | "name": "stdout", 91 | "output_type": "stream", 92 | "text": [ 93 | "句子:今天很棒!, tokens:[37271, 36827, 17599, 230, 77062, 240, 0], token 数量:7\n" 94 | ] 95 | }, 96 | { 97 | "data": { 98 | "text/plain": [ 99 | "7" 100 | ] 101 | }, 102 | "execution_count": 6, 103 | "metadata": {}, 104 | "output_type": "execute_result" 105 | } 106 | ], 107 | "source": [ 108 | "encoding_name = \"cl100k_base\"\n", 109 | "model = \"gpt-3.5-turbo\"\n", 110 | "string = \"今天很棒!\"\n", 111 | "token_num(encoding_name, model, string)\n" 112 | ] 113 | }, 114 | { 115 | "cell_type": "code", 116 | "execution_count": 9, 117 | "metadata": { 118 | "ExecuteTime": { 119 | "end_time": "2023-07-26T07:10:30.679880Z", 120 | "start_time": "2023-07-26T07:10:20.495256Z" 121 | }, 122 | "collapsed": false, 123 | "jupyter": { 124 | "outputs_hidden": false 125 | } 126 | }, 127 | "outputs": [ 128 | { 129 | "name": "stdout", 130 | "output_type": "stream", 131 | "text": [ 132 | "句子:今天很棒!, tokens:[20015, 232, 25465, 36181, 230, 162, 96, 240, 0], token 数量:9\n" 133 | ] 134 | }, 135 | { 136 | "data": { 137 | "text/plain": [ 138 | "9" 139 | ] 140 | }, 141 | "execution_count": 9, 142 | "metadata": {}, 143 | "output_type": "execute_result" 144 | } 145 | ], 146 | "source": [ 147 | "# encoding_name = \"r50k_base\"\n", 148 | "encoding_name = \"gpt2\"\n", 149 | "model = \"text-curie-001\"\n", 150 | "string = \"今天很棒!\"\n", 151 | "token_num(encoding_name, model, string)" 152 | ] 153 | } 154 | ], 155 | "metadata": { 156 | "kernelspec": { 157 | "display_name": "AINote", 158 | "language": "python", 159 | "name": "ainote" 160 | }, 161 | "language_info": { 162 | "codemirror_mode": { 163 | "name": "ipython", 164 | "version": 3 165 | }, 166 | "file_extension": ".py", 167 | "mimetype": "text/x-python", 168 | "name": "python", 169 | "nbconvert_exporter": "python", 170 | "pygments_lexer": "ipython3", 171 | "version": "3.10.0" 172 | } 173 | }, 174 | "nbformat": 4, 175 | "nbformat_minor": 4 176 | } 177 | -------------------------------------------------------------------------------- /project/openai_api/files/img-CWs11MH3BnkwqSRzoUWrtITD.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShengqinYang/AINote/b2882d3cf5f0ee00dad7d4bde955368c37327ae6/project/openai_api/files/img-CWs11MH3BnkwqSRzoUWrtITD.png -------------------------------------------------------------------------------- /project/openai_api/files/img-EWwpOBlQ3ngE9SkxwHBpPCqw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShengqinYang/AINote/b2882d3cf5f0ee00dad7d4bde955368c37327ae6/project/openai_api/files/img-EWwpOBlQ3ngE9SkxwHBpPCqw.png -------------------------------------------------------------------------------- /project/openai_api/files/img-GyOanQxzFuiTrPrdIV72mM76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShengqinYang/AINote/b2882d3cf5f0ee00dad7d4bde955368c37327ae6/project/openai_api/files/img-GyOanQxzFuiTrPrdIV72mM76.png -------------------------------------------------------------------------------- /project/openai_api/files/img-UxONH8mxhhRd9ABKmYnJnQ2d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShengqinYang/AINote/b2882d3cf5f0ee00dad7d4bde955368c37327ae6/project/openai_api/files/img-UxONH8mxhhRd9ABKmYnJnQ2d.png -------------------------------------------------------------------------------- /project/openai_api/files/img-ZJkajHQVUwIEmrU4Ei2iBUCw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShengqinYang/AINote/b2882d3cf5f0ee00dad7d4bde955368c37327ae6/project/openai_api/files/img-ZJkajHQVUwIEmrU4Ei2iBUCw.png -------------------------------------------------------------------------------- /project/openai_api/files/img-iSjbeihvmNnvuSvSfiiRxkKF.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShengqinYang/AINote/b2882d3cf5f0ee00dad7d4bde955368c37327ae6/project/openai_api/files/img-iSjbeihvmNnvuSvSfiiRxkKF.png -------------------------------------------------------------------------------- /project/openai_api/files/img_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShengqinYang/AINote/b2882d3cf5f0ee00dad7d4bde955368c37327ae6/project/openai_api/files/img_1.png -------------------------------------------------------------------------------- /project/openai_api/files/speech.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShengqinYang/AINote/b2882d3cf5f0ee00dad7d4bde955368c37327ae6/project/openai_api/files/speech.mp3 -------------------------------------------------------------------------------- /project/openai_api/files/work_10818_20231031_jxj3wSJ_preview.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShengqinYang/AINote/b2882d3cf5f0ee00dad7d4bde955368c37327ae6/project/openai_api/files/work_10818_20231031_jxj3wSJ_preview.jpg -------------------------------------------------------------------------------- /project/openai_api/files/羊皮卷1.txt: -------------------------------------------------------------------------------- 1 | 第 一 卷 2 | 3 | 今天,我开始新的生活。 4 | 5 | 今天,我爬出满是失败创伤的老茧。 6 | 7 | 今天,我从新来到这个世上,我出生在葡萄园中,园内的葡萄任人享用。 8 | 9 | 今天我要从最高最密的藤上摘下智慧的果实,这葡萄藤是好几代前的智者种下的。 10 | 11 | 今天,我要品尝葡萄的美味,还要吞下每一粒成功的种子,让新生命在我心里萌芽。 12 | 13 | 我选择的道路充满机遇,也有辛酸与绝望。失败的同伴数不胜数,叠在一起,比金字塔还高。 14 | 15 | 然而,我不会像他们一样失败,因为我手中持有航海图,可以领我越过汹涌的大海,抵达梦中的彼岸。 16 | 17 | 失败不再是我奋斗的代价。它和痛苦都将从我的生命中消失。失败和我,就像水火一样,互不相容。我不再像过去一样接受它们。我要在智慧的指引下,走出失败的阴影,步入富足、健康、快乐的乐园,这些都超出了我以往的梦想。 18 | 19 | 我要是能长生不老,就可以学到一切,但我不能永生,所以,在有限的人生里,我必须学会忍耐的艺术,因为大自然的行为一向是从容不迫的。造物主创造树中之王橄榄树需要一百年的时间,而洋葱经过短短的九个星期就会枯老。我不留恋从前那种洋葱式的生活,我要成为万树之王——橄榄树,成为现实生活中最伟大的推销员。 -------------------------------------------------------------------------------- /project/openai_api/files/羊皮卷speech.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShengqinYang/AINote/b2882d3cf5f0ee00dad7d4bde955368c37327ae6/project/openai_api/files/羊皮卷speech.mp3 -------------------------------------------------------------------------------- /project/openai_api/files/英文单人.MP4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShengqinYang/AINote/b2882d3cf5f0ee00dad7d4bde955368c37327ae6/project/openai_api/files/英文单人.MP4 -------------------------------------------------------------------------------- /project/openai_api/files/英文对话.MP4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShengqinYang/AINote/b2882d3cf5f0ee00dad7d4bde955368c37327ae6/project/openai_api/files/英文对话.MP4 -------------------------------------------------------------------------------- /project/python/example_chat_completion.md: -------------------------------------------------------------------------------- 1 | ## 1、example_chat_completion.py 使用说明 2 | 3 | 本程序实现了一个简单的命令行聊天机器人,允许用户与机器人进行交互并记录对话历史。start_chat() 4 | 函数用于开始对话,用户可以输入消息进行交流,直到输入 "q" 结束对话。chat_with_bot(message) 函数用于与聊天机器人进行对话,调用 5 | OpenAI 的 ChatCompletion API 生成机器人的回复。整个程序提供了基本的对话功能,可以根据用户的输入和机器人的回复形成对话历史,为交互提供了简单的聊天体验。 6 | 7 | ### `chat_with_bot(message)`函数说明 8 | 9 | * 该函数用于与聊天机器人进行对话。根据传入的消息 message(以字典形式表示),函数调用了 OpenAI 的 10 | ChatCompletion API 进行对话生成,并返回机器人的回复。 11 | 12 | * 参数:`message`(字典):表示聊天对话的消息列表。每条消息都由 `{"role": "角色", "content": "内容"}` 格式的字典表示。`"角色"` 表示消息的发送者,可以是用户、系统或助手等,"内容" 表示消息的内容。 13 | 14 | * 返回值:机器人的回复,以字典形式表示。字典包含两个键值对:`{"role": "角色", "content": "回复内容"}`。其中 `"角色"` 15 | 表示机器人的角色,`"回复内容"` 表示机器人的回复内容。 16 | 17 | #### 使用方法 18 | 19 | * 构造一个消息列表 `message`,其中包含对话的初始消息,可以是系统消息或用户消息。 20 | 21 | * 调用 `chat_with_bot(message)` 函数,并传入消息列表 `message`。 22 | 23 | * 函数将根据传入的消息列表 `message` 调用 OpenAI 的 ChatCompletion API,并获取机器人的回复。 24 | 25 | * 返回机器人的回复,以字典形式表示。 26 | 27 | 请注意,这是一个示例函数,实际使用时,需要根据 OpenAI ChatCompletion API 的具体接口和返回格式进行调整。同时,确保安全处理用户输入和返回的内容,避免潜在的安全问题。 28 | 29 | ### `start_chat()` 函数说明 30 | 31 | * 运行 `start_chat()` 函数后,您可以开始与聊天机器人进行对话。 32 | 33 | * 首次开始会话时,您需要定义一个角色并提供简单描述。输入完成后,该信息将被添加到对话消息列表中,并显示为系统消息。 34 | 35 | * 后续每次会话时,程序将加载之前的对话内容到 `message` 列表中,以便您可以查看之前的对话历史。 36 | 37 | * 输入任意消息以与机器人进行对话,当您输入 'q' 并回车时,对话将结束。 38 | 39 | * 在对话过程中,您的输入将显示为用户消息,机器人的回复将显示为机器人消息。 40 | 41 | 请注意,这是一个示例函数,chat_with_bot() 函数的实现未在代码中给出,您需要根据实际情况自行定义并实现该函数。同时,确保安全处理用户输入和返回的内容,避免潜在的安全问题。 42 | 43 | ### 使用样例输出 44 | 45 | ![Image](./聊天助手.png) 46 | # 2.example_chat_competion_use_weather_function.py 47 | 本程序实现了一个简单的命令行天气助手机器人,允许用户与机器人进行交互并记录对话历史。start_chat() 48 | #### web url:https://www.apispace.com/ 49 | #### 需要注册登陆该网站并获取apikey,截止:2023-07-28日,该网站每一类接口,新用户有200次免费使用权限 50 | #### 在config.ini中配置自己的apikey 51 | 52 | ![Image](./天气助手.png) 53 | 祝您享受与聊天机器人的交互! 54 | -------------------------------------------------------------------------------- /project/python/example_chat_completion.py: -------------------------------------------------------------------------------- 1 | import os 2 | import openai 3 | import configparser 4 | 5 | conf = configparser.ConfigParser() 6 | current_directory = os.path.dirname(os.path.realpath('__file__')) 7 | config_file_path = os.path.join(current_directory, '..', '..', 'config.ini') 8 | print(config_file_path) 9 | conf.read(config_file_path) 10 | api_key = conf.get("Openai", "api_key") # 在config.ini中配置自己的APIkey 11 | openai.api_key = api_key 12 | os.environ["HTTP_PROXY"] = conf.get("Proxy", "HTTP_PROXY") # 配置自己的代理 13 | os.environ["HTTPS_PROXY"] = conf.get("Proxy", "HTTPS_PROXY") 14 | chat_model = "gpt-3.5-turbo" 15 | text_model = "gpt-3.5-turbo-instruct" # text-davinci-003 2024-01-04已经下线了 16 | 17 | # 请根据自己的需求调整以下参数 18 | model = 'gpt-3.5-turbo' 19 | max_tokens = 500 20 | temperature = 0.2 21 | 22 | 23 | def chat_with_bot(message): 24 | """ 25 | :param message: eg: {"role": "system", "content": "you are a translation assistant"}) 26 | :return: eg: {"role": "assistant", "content": "...."}) 27 | """ 28 | # ChatCompletion 29 | conversation_3 = openai.ChatCompletion.create( 30 | model=model, 31 | messages=message, 32 | # max_tokens=max_tokens, 33 | temperature=temperature, 34 | ) 35 | answer = conversation_3['choices'][0]["message"] 36 | new_message_dict = {"role": answer.role, "content": answer.content} 37 | return new_message_dict 38 | 39 | 40 | def start_chat(): 41 | """ 42 | 第一次开始会话时:需要给一个role 43 | 后面每次会话时将前面的内容加载到message里(后面可以优化,如何控制那些内容需要加载进去) 44 | :return: 45 | """ 46 | message = [] 47 | start = 0 48 | while True: 49 | if not start: 50 | content = input( 51 | "首次开始会话,请定义角色以及简单描述:如:你是我的翻译助手,请帮我将下面的内容翻译成中文,输入q 并回车结束对话。\nprompt system: ") 52 | message.append({"role": "system", "content": content}) 53 | userinput = input("user:") 54 | message.append({"role": "user", "content": userinput}) 55 | else: 56 | content = input("user: ") 57 | message.append({"role": "user", "content": content}) 58 | if content == 'q': 59 | break 60 | # print('message:', message) # 可以看到每次输入的message 61 | res = chat_with_bot(message) 62 | print(f"{res['role']}:{res['content']}") 63 | message.append(res) 64 | start += 1 65 | 66 | 67 | if __name__ == '__main__': 68 | start_chat() 69 | 70 | # 你是专业的著作翻译家,帮我翻译成中文,确保翻译后的句子流畅连贯,并与原文意思保持一致。内容:The quick brown fox jumps over the lazy dog. This pangram contains every letter of the English alphabet at least once. Pangrams are often used to test fonts, keyboards, and other text-related tools. In addition to English, there are pangrams in many other languages. Some pangrams are more difficult to construct due to the unique characteristics of the language. 71 | -------------------------------------------------------------------------------- /project/python/天气助手.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShengqinYang/AINote/b2882d3cf5f0ee00dad7d4bde955368c37327ae6/project/python/天气助手.png -------------------------------------------------------------------------------- /project/python/聊天助手.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShengqinYang/AINote/b2882d3cf5f0ee00dad7d4bde955368c37327ae6/project/python/聊天助手.png -------------------------------------------------------------------------------- /requirments.txt: -------------------------------------------------------------------------------- 1 | accelerate==0.26.1 2 | aiofiles==23.2.1 3 | aiohttp==3.8.5 4 | aioprometheus==23.12.0 5 | aiosignal==1.3.1 6 | altair==5.1.1 7 | annotated-types==0.5.0 8 | anyio==3.7.1 9 | appnope==0.1.3 10 | argon2-cffi==23.1.0 11 | argon2-cffi-bindings==21.2.0 12 | arrow==1.2.3 13 | asttokens==2.4.0 14 | async-lru==2.0.4 15 | async-timeout==4.0.3 16 | attrs==23.1.0 17 | Babel==2.12.1 18 | backcall==0.2.0 19 | bcrypt==4.2.0 20 | beautifulsoup4==4.12.2 21 | bleach==6.0.0 22 | blinker==1.6.2 23 | certifi==2023.7.22 24 | cffi==1.15.1 25 | charset-normalizer==3.2.0 26 | click==8.1.7 27 | cloudpickle==3.0.0 28 | colorama==0.4.6 29 | comm==0.1.4 30 | contourpy==1.1.1 31 | cpm-kernels==1.0.11 32 | cryptography==41.0.4 33 | cycler==0.11.0 34 | dataclasses-json==0.6.0 35 | debugpy==1.8.0 36 | decorator==5.1.1 37 | defusedxml==0.7.1 38 | distro==1.9.0 39 | ecdsa==0.19.0 40 | exceptiongroup==1.1.3 41 | executing==1.2.0 42 | faiss-cpu==1.7.4 43 | fastapi==0.110.3 44 | fastjsonschema==2.18.0 45 | ffmpy==0.3.1 46 | filelock==3.12.4 47 | Flask==2.3.3 48 | fonttools==4.42.1 49 | fqdn==1.5.1 50 | frozenlist==1.4.0 51 | fsspec==2023.9.2 52 | google-search-results==2.4.2 53 | gradio==4.26.0 54 | gradio_client==0.15.1 55 | h11==0.14.0 56 | httpcore==0.18.0 57 | httpx==0.25.0 58 | huggingface-hub==0.24.6 59 | idna==3.4 60 | importlib-resources==6.1.0 61 | ipykernel==6.25.2 62 | ipython==8.15.0 63 | ipython-genutils==0.2.0 64 | ipywidgets==8.1.1 65 | isoduration==20.11.0 66 | itsdangerous==2.1.2 67 | jedi==0.19.0 68 | Jinja2==3.1.2 69 | jiter==0.5.0 70 | joblib==1.3.2 71 | json5==0.9.14 72 | jsonpatch==1.33 73 | jsonpointer==2.4 74 | jsonschema==4.19.1 75 | jsonschema-specifications==2023.7.1 76 | jupyter==1.0.0 77 | jupyter-console==6.6.3 78 | jupyter-events==0.9.0 79 | jupyter-lsp==2.2.0 80 | jupyter_client==8.3.1 81 | jupyter_core==5.3.1 82 | jupyter_server==2.7.3 83 | jupyter_server_terminals==0.4.4 84 | jupyterlab==4.0.6 85 | jupyterlab-pygments==0.2.2 86 | jupyterlab-widgets==3.0.9 87 | jupyterlab_server==2.25.0 88 | kiwisolver==1.4.5 89 | langchain==0.2.14 90 | langchain-community==0.2.12 91 | langchain-core==0.2.34 92 | langchain-experimental==0.0.11 93 | langchain-openai==0.1.22 94 | langchain-text-splitters==0.2.2 95 | langsmith==0.1.104 96 | latex2mathml==3.77.0 97 | loguru==0.7.2 98 | Markdown==3.5.2 99 | markdown-it-py==3.0.0 100 | MarkupSafe==2.1.3 101 | marshmallow==3.20.1 102 | matplotlib==3.8.0 103 | matplotlib-inline==0.1.6 104 | mdtex2html==1.3.0 105 | mdurl==0.1.2 106 | mistune==3.0.1 107 | modelscope==1.17.1 108 | mpmath==1.3.0 109 | multidict==6.0.4 110 | mypy-extensions==1.0.0 111 | nbclient==0.8.0 112 | nbconvert==7.8.0 113 | nbformat==5.9.2 114 | nest-asyncio==1.5.8 115 | networkx==3.2.1 116 | notebook==7.0.4 117 | notebook_shim==0.2.3 118 | numexpr==2.8.7 119 | numpy==1.26.0 120 | openai==1.42.0 121 | orjson==3.10.7 122 | overrides==7.4.0 123 | packaging==24.1 124 | pandas==2.1.1 125 | pandocfilters==1.5.0 126 | parso==0.8.3 127 | passlib==1.7.4 128 | pdfminer.six==20221105 129 | pdfplumber==0.10.2 130 | peft==0.12.0 131 | pexpect==4.8.0 132 | pickleshare==0.7.5 133 | Pillow==10.0.1 134 | platformdirs==3.10.0 135 | plotly==5.17.0 136 | prometheus-client==0.17.1 137 | prompt-toolkit==3.0.39 138 | protobuf==4.25.2 139 | psutil==5.9.5 140 | ptyprocess==0.7.0 141 | pure-eval==0.2.2 142 | pyasn1==0.6.0 143 | pycparser==2.21 144 | pydantic==2.4.0 145 | pydantic_core==2.10.0 146 | pydub==0.25.1 147 | Pygments==2.16.1 148 | pynvml==11.5.3 149 | pyparsing==3.1.1 150 | pypdfium2==4.20.0 151 | python-dateutil==2.8.2 152 | python-jose==3.3.0 153 | python-json-logger==2.0.7 154 | python-multipart==0.0.9 155 | pytz==2023.3.post1 156 | PyYAML==6.0.1 157 | pyzmq==25.1.1 158 | qtconsole==5.4.4 159 | QtPy==2.4.0 160 | quantile-python==1.1 161 | referencing==0.30.2 162 | regex==2023.8.8 163 | reportlab==4.0.5 164 | requests==2.31.0 165 | rfc3339-validator==0.1.4 166 | rfc3986-validator==0.1.1 167 | rich==13.7.1 168 | rpds-py==0.10.3 169 | rsa==4.9 170 | ruff==0.6.2 171 | safetensors==0.4.2 172 | scikit-learn==1.3.1 173 | scipy==1.11.2 174 | semantic-version==2.10.0 175 | Send2Trash==1.8.2 176 | sentencepiece==0.1.99 177 | shellingham==1.5.4 178 | simplejson==3.19.1 179 | six==1.16.0 180 | sniffio==1.3.0 181 | soupsieve==2.5 182 | SQLAlchemy==2.0.21 183 | sse-starlette==2.1.3 184 | stack-data==0.6.2 185 | starlette==0.37.2 186 | sympy==1.12 187 | tabulate==0.9.0 188 | tblib==3.0.0 189 | tenacity==8.2.3 190 | termcolor==2.3.0 191 | terminado==0.17.1 192 | threadpoolctl==3.2.0 193 | tiktoken==0.7.0 194 | timm==1.0.8 195 | tinycss2==1.2.1 196 | tokenizers==0.19.1 197 | tomli==2.0.1 198 | tomlkit==0.12.0 199 | toolz==0.12.0 200 | torch==2.4.0 201 | torchvision==0.19.0 202 | tornado==6.3.3 203 | tqdm==4.66.1 204 | traitlets==5.10.0 205 | transformers==4.44.2 206 | typer==0.11.1 207 | typing-inspect==0.9.0 208 | typing_extensions==4.12.2 209 | tzdata==2023.3 210 | uri-template==1.3.0 211 | urllib3==2.0.5 212 | uvicorn==0.23.2 213 | uvloop==0.20.0 214 | wcwidth==0.2.6 215 | webcolors==1.13 216 | webencodings==0.5.1 217 | websocket-client==1.6.3 218 | websockets==11.0.3 219 | Werkzeug==2.3.7 220 | widgetsnbextension==4.0.9 221 | xinference==0.14.2 222 | xoscar==0.3.3 223 | yarl==1.9.2 -------------------------------------------------------------------------------- /resource/AI-LangChain.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShengqinYang/AINote/b2882d3cf5f0ee00dad7d4bde955368c37327ae6/resource/AI-LangChain.png -------------------------------------------------------------------------------- /resource/AI-LangChain.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShengqinYang/AINote/b2882d3cf5f0ee00dad7d4bde955368c37327ae6/resource/AI-LangChain.xmind -------------------------------------------------------------------------------- /resource/LangChain案例.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShengqinYang/AINote/b2882d3cf5f0ee00dad7d4bde955368c37327ae6/resource/LangChain案例.png -------------------------------------------------------------------------------- /resource/LangChain设计.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShengqinYang/AINote/b2882d3cf5f0ee00dad7d4bde955368c37327ae6/resource/LangChain设计.png -------------------------------------------------------------------------------- /resource/Langchain版Auto-GPT技术方案与架构设计.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShengqinYang/AINote/b2882d3cf5f0ee00dad7d4bde955368c37327ae6/resource/Langchain版Auto-GPT技术方案与架构设计.png -------------------------------------------------------------------------------- /resource/Sales-Consultant业务流程与价值分析.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShengqinYang/AINote/b2882d3cf5f0ee00dad7d4bde955368c37327ae6/resource/Sales-Consultant业务流程与价值分析.png -------------------------------------------------------------------------------- /resource/Sales-Consultant技术方案与架构设计.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShengqinYang/AINote/b2882d3cf5f0ee00dad7d4bde955368c37327ae6/resource/Sales-Consultant技术方案与架构设计.png -------------------------------------------------------------------------------- /resource/homework_openai_translator_v2.0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShengqinYang/AINote/b2882d3cf5f0ee00dad7d4bde955368c37327ae6/resource/homework_openai_translator_v2.0.png -------------------------------------------------------------------------------- /resource/open_ai_models.json: -------------------------------------------------------------------------------- 1 | { 2 | "model_total": 53, 3 | "model_list": [ 4 | { 5 | "name": "gpt-3.5-turbo-0613", 6 | "created": "2023-06-13 00:30:34" 7 | }, 8 | { 9 | "name": "gpt-3.5-turbo-16k-0613", 10 | "created": "2023-05-31 03:17:27" 11 | }, 12 | { 13 | "name": "gpt-3.5-turbo-16k", 14 | "created": "2023-05-11 06:35:02" 15 | }, 16 | { 17 | "name": "gpt-3.5-turbo-0301", 18 | "created": "2023-03-01 13:52:43" 19 | }, 20 | { 21 | "name": "gpt-3.5-turbo", 22 | "created": "2023-03-01 02:56:42" 23 | }, 24 | { 25 | "name": "whisper-1", 26 | "created": "2023-02-28 05:13:04" 27 | }, 28 | { 29 | "name": "text-embedding-ada-002", 30 | "created": "2022-12-17 03:01:39" 31 | }, 32 | { 33 | "name": "text-davinci-003", 34 | "created": "2022-11-28 09:40:35" 35 | }, 36 | { 37 | "name": "ada-code-search-text", 38 | "created": "2022-04-29 03:01:50" 39 | }, 40 | { 41 | "name": "babbage-search-document", 42 | "created": "2022-04-29 03:01:50" 43 | }, 44 | { 45 | "name": "curie-similarity", 46 | "created": "2022-04-29 03:01:50" 47 | }, 48 | { 49 | "name": "babbage-code-search-code", 50 | "created": "2022-04-29 03:01:49" 51 | }, 52 | { 53 | "name": "babbage-code-search-text", 54 | "created": "2022-04-29 03:01:49" 55 | }, 56 | { 57 | "name": "davinci-search-document", 58 | "created": "2022-04-29 03:01:49" 59 | }, 60 | { 61 | "name": "curie-search-query", 62 | "created": "2022-04-29 03:01:49" 63 | }, 64 | { 65 | "name": "text-search-curie-query-001", 66 | "created": "2022-04-29 03:01:49" 67 | }, 68 | { 69 | "name": "text-search-babbage-doc-001", 70 | "created": "2022-04-29 03:01:49" 71 | }, 72 | { 73 | "name": "text-search-curie-doc-001", 74 | "created": "2022-04-29 03:01:49" 75 | }, 76 | { 77 | "name": "babbage-search-query", 78 | "created": "2022-04-29 03:01:49" 79 | }, 80 | { 81 | "name": "text-search-babbage-query-001", 82 | "created": "2022-04-29 03:01:49" 83 | }, 84 | { 85 | "name": "davinci-similarity", 86 | "created": "2022-04-29 03:01:49" 87 | }, 88 | { 89 | "name": "curie-search-document", 90 | "created": "2022-04-29 03:01:48" 91 | }, 92 | { 93 | "name": "code-search-babbage-text-001", 94 | "created": "2022-04-29 03:01:47" 95 | }, 96 | { 97 | "name": "code-search-babbage-code-001", 98 | "created": "2022-04-29 03:01:47" 99 | }, 100 | { 101 | "name": "ada-similarity", 102 | "created": "2022-04-29 03:01:47" 103 | }, 104 | { 105 | "name": "code-search-ada-text-001", 106 | "created": "2022-04-29 03:01:47" 107 | }, 108 | { 109 | "name": "text-search-ada-doc-001", 110 | "created": "2022-04-29 03:01:47" 111 | }, 112 | { 113 | "name": "text-similarity-curie-001", 114 | "created": "2022-04-29 03:01:47" 115 | }, 116 | { 117 | "name": "code-search-ada-code-001", 118 | "created": "2022-04-29 03:01:47" 119 | }, 120 | { 121 | "name": "ada-search-document", 122 | "created": "2022-04-29 03:01:47" 123 | }, 124 | { 125 | "name": "text-similarity-babbage-001", 126 | "created": "2022-04-29 03:01:45" 127 | }, 128 | { 129 | "name": "babbage-similarity", 130 | "created": "2022-04-29 03:01:45" 131 | }, 132 | { 133 | "name": "text-similarity-ada-001", 134 | "created": "2022-04-29 03:01:45" 135 | }, 136 | { 137 | "name": "ada-code-search-code", 138 | "created": "2022-04-29 03:01:45" 139 | }, 140 | { 141 | "name": "text-search-ada-query-001", 142 | "created": "2022-04-29 03:01:45" 143 | }, 144 | { 145 | "name": "ada-search-query", 146 | "created": "2022-04-29 03:01:45" 147 | }, 148 | { 149 | "name": "text-search-davinci-query-001", 150 | "created": "2022-04-29 03:01:45" 151 | }, 152 | { 153 | "name": "davinci-search-query", 154 | "created": "2022-04-29 03:01:45" 155 | }, 156 | { 157 | "name": "text-search-davinci-doc-001", 158 | "created": "2022-04-29 03:01:45" 159 | }, 160 | { 161 | "name": "text-similarity-davinci-001", 162 | "created": "2022-04-29 03:01:45" 163 | }, 164 | { 165 | "name": "code-davinci-edit-001", 166 | "created": "2022-04-14 04:08:04" 167 | }, 168 | { 169 | "name": "text-davinci-002", 170 | "created": "2022-04-14 04:08:04" 171 | }, 172 | { 173 | "name": "text-davinci-edit-001", 174 | "created": "2022-04-13 08:19:39" 175 | }, 176 | { 177 | "name": "text-curie-001", 178 | "created": "2022-04-08 04:40:43" 179 | }, 180 | { 181 | "name": "text-babbage-001", 182 | "created": "2022-04-08 04:40:43" 183 | }, 184 | { 185 | "name": "text-davinci-001", 186 | "created": "2022-04-08 04:40:42" 187 | }, 188 | { 189 | "name": "text-ada-001", 190 | "created": "2022-04-08 04:40:42" 191 | }, 192 | { 193 | "name": "curie-instruct-beta", 194 | "created": "2022-04-08 04:40:42" 195 | }, 196 | { 197 | "name": "davinci-instruct-beta", 198 | "created": "2022-04-08 04:40:42" 199 | }, 200 | { 201 | "name": "davinci", 202 | "created": "2022-04-08 03:31:14" 203 | }, 204 | { 205 | "name": "curie", 206 | "created": "2022-04-08 03:31:14" 207 | }, 208 | { 209 | "name": "babbage", 210 | "created": "2022-04-08 03:07:29" 211 | }, 212 | { 213 | "name": "ada", 214 | "created": "2022-04-08 02:51:31" 215 | } 216 | ] 217 | } 218 | 219 | -------------------------------------------------------------------------------- /resource/prompt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShengqinYang/AINote/b2882d3cf5f0ee00dad7d4bde955368c37327ae6/resource/prompt.png -------------------------------------------------------------------------------- /resource/使用FAISS向量数据库存储销售问答话术.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShengqinYang/AINote/b2882d3cf5f0ee00dad7d4bde955368c37327ae6/resource/使用FAISS向量数据库存储销售问答话术.png -------------------------------------------------------------------------------- /resource/使用Gradio实现聊天机器人的图形化界面.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShengqinYang/AINote/b2882d3cf5f0ee00dad7d4bde955368c37327ae6/resource/使用Gradio实现聊天机器人的图形化界面.png -------------------------------------------------------------------------------- /resource/使用RetrievalQA检索销售话术数据_similarity.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShengqinYang/AINote/b2882d3cf5f0ee00dad7d4bde955368c37327ae6/resource/使用RetrievalQA检索销售话术数据_similarity.png -------------------------------------------------------------------------------- /resource/使用RetrievalQA检索销售话术数据_topk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShengqinYang/AINote/b2882d3cf5f0ee00dad7d4bde955368c37327ae6/resource/使用RetrievalQA检索销售话术数据_topk.png -------------------------------------------------------------------------------- /resource/基于知识库问答的典型用例.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShengqinYang/AINote/b2882d3cf5f0ee00dad7d4bde955368c37327ae6/resource/基于知识库问答的典型用例.png -------------------------------------------------------------------------------- /resource/笔记1-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShengqinYang/AINote/b2882d3cf5f0ee00dad7d4bde955368c37327ae6/resource/笔记1-2.png -------------------------------------------------------------------------------- /resource/笔记2-3-4.1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShengqinYang/AINote/b2882d3cf5f0ee00dad7d4bde955368c37327ae6/resource/笔记2-3-4.1.png -------------------------------------------------------------------------------- /resource/笔记2-3-4.2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShengqinYang/AINote/b2882d3cf5f0ee00dad7d4bde955368c37327ae6/resource/笔记2-3-4.2.png -------------------------------------------------------------------------------- /resource/销售话术.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShengqinYang/AINote/b2882d3cf5f0ee00dad7d4bde955368c37327ae6/resource/销售话术.png --------------------------------------------------------------------------------