gitweixin
  • 首页
  • 小程序代码
    • 资讯读书
    • 工具类
    • O2O
    • 地图定位
    • 社交
    • 行业软件
    • 电商类
    • 互联网类
    • 企业类
    • UI控件
  • 大数据开发
    • Hadoop
    • Spark
    • Hbase
    • Elasticsearch
    • Kafka
    • Flink
    • 数据仓库
    • 数据挖掘
    • flume
    • Kafka
    • Hive
    • shardingsphere
    • solr
  • 开发博客
    • Android
    • php
    • python
    • 运维
    • 技术架构
    • 数据库
  • 程序员网赚
  • bug清单
  • 量化投资
  • 在线查询工具
    • 去行号
    • 在线时间戳转换工具
    • 免费图片批量修改尺寸在线工具
    • SVG转JPG在线工具

分类归档chatgpt

精品微信小程序开发门户,代码全部亲测可用

  • 首页   /  人工智能
  • 分类归档: "chatgpt"
chatgpt 6月 18,2024

腾讯云 AI 代码助手保姆级使用教程

腾讯云 AI 代码助手是一款基于先进的代码大模型开发的智能编码辅助工具,它能够帮助开发者提高编码效率,实现技术沟通、代码补全、自动生成单元测试等功能。

  • 基于腾讯混元代码模型:腾讯表示内部超过 50% 的研发在使用
  • 支持多种语言:支持 Python, JavaScript / TypeScript, Java, C / C++, Go, C#, Rust, Swift, Lua, Kotlin, TSX / JSX, Vue, Proto, PHP 等语言 / 框架
  • 支持主流 IDE:支持 VS Code 和 JetBrains 全家桶
  • 提升研发效率:通过技术对话与代码补全,辅助生成业务代码、注释、单元测试等内容,提高开发效率
  • 加速开发流程:辅助补全、BUG 诊断、生成测试,释放机械性工作,专注代码创作
  • 体验开发无障碍:对话学习、快速理解、规范编写、缩短学习曲线, 开发少走弯路

支持的IDE

  • Visual Studio Code
  • JetBrains IDEs(如 IntelliJ IDEA、PyCharm 等)

下载与安装

从 Visual Studio Code 插件市场安装

  1. 打开 Visual Studio Code。
  2. 点击左侧导航栏上的扩展图标,或使用快捷键 Ctrl+Shift+X(在 macOS 上是 Cmd+Shift+X)。
  3. 在搜索框中输入“腾讯云 AI 代码助手”。
  4. 找到插件后,点击“Install”按钮进行安装。
  5. 安装完成后,重启 Visual Studio Code。

从 JetBrains IDEs 安装

  1. 打开 JetBrains IDE(例如 IntelliJ IDEA)。
  2. 转到 “File” > “Settings”(Windows/Linux)或 “IntelliJ IDEA” > “Preferences”(macOS)。
  3. 在设置窗口中,选择 “Plugins”。
  4. 点击 “Marketplace” 标签,搜索“腾讯云 AI 代码助手”。
  5. 找到插件后,点击 “Install” 按钮进行安装。
  6. 安装完成后,重启 IDE。


腾讯云AI代码助手需要登录,并在腾讯云安全实名认证才可以使用。



二、核心功能介绍及实战演示

1. 代码补全:加速编码流程

功能说明: 基于上下文理解,腾讯云AI代码助手能够自动推荐最可能的代码片段,包括但不限于方法调用、变量声明、循环结构等,显著减少键盘敲击次数。

实例演示:

假设我们正在编写一个Python程序,用于计算两个数的和:

def add_numbers(a, b):
    return a + 

当键入到return a +时,腾讯云AI代码助手会立即提示补全为b,实现如下:

def add_numbers(a, b):
    return a + b
2. 优化代码:提升执行效率与可读性

功能说明: 该功能能够分析现有代码,提出重构建议,如循环优化、变量重命名、冗余代码删除等,确保代码既高效又易于维护。

实例演示:

原始代码存在循环内重复计算问题:

numbers = [1, 2, 3, 4, 5]
sum = 0
for num in numbers:
    sum += num * num
print(sum)

腾讯云AI代码助手建议优化为:

numbers = [1, 2, 3, 4, 5]
squared_sum = sum(x*x for x in numbers)
print(squared_sum)

通过列表推导式直接计算平方和,减少了计算步骤,提高了代码效率。

3. 补全注释:自动化文档生成

功能说明: 自动根据函数或模块的逻辑生成详细的注释说明,帮助团队成员理解代码逻辑,促进知识共享。

实例演示:

对于函数add_numbers,只需在函数定义下方添加注释起始符号""",AI助手即能自动生成注释:

def add_numbers(a, b):
    """
    Calculate the sum of two numbers.

    Args:
        a (int): The first number.
        b (int): The second number.

    Returns:
        int: The sum of `a` and `b`.
    """
    return a + b
Python1def add_numbers(a, b):
2    """
3    Calculate the sum of two numbers.
4
5    Args:
6        a (int): The first number.
7        b (int): The second number.
8
9    Returns:
10        int: The sum of `a` and `b`.
11    """
12    return a + b
4. 解释代码:新手友好,快速上手

功能说明: 鼠标选择代码行上时,右键选择腾讯云AI助手的解释代码,就能提供当前行代码的功能解释,特别适合新人学习和理解代码逻辑。

5. 生成单元测试:自动化测试框架构建

功能说明: 根据现有代码结构,自动生成对应的单元测试案例,确保代码变更时功能的稳定性。

实例演示:

对于上面的add_numbers函数,AI助手能生成如下单元测试代码:

import unittest
from my_module import add_numbers

class TestAddNumbers(unittest.TestCase):
    def test_add_positive_numbers(self):
        self.assertEqual(add_numbers(2, 3), 5)

    def test_add_negative_numbers(self):
        self.assertEqual(add_numbers(-1, -1), -2)

if __name__ == '__main__':
    unittest.main()
Python1import unittest
2from my_module import add_numbers
3
4class TestAddNumbers(unittest.TestCase):
5    def test_add_positive_numbers(self):
6        self.assertEqual(add_numbers(2, 3), 5)
7
8    def test_add_negative_numbers(self):
9        self.assertEqual(add_numbers(-1, -1), -2)
10
11if __name__ == '__main__':
12    unittest.main()
6. 定位代码缺陷:提前发现潜在错误

功能说明: 实时分析代码,标记潜在的语法错误、逻辑漏洞或不符合最佳实践的地方,防患于未然。

实例演示:

考虑下面的错误代码片段:

if x > y:
    result = divide(x, y)
else:
    print("y should be greater than x.")
Python1if x > y:
2    result = divide(x, y)
3else:
4    print("y should be greater than x.")

如果divide函数未定义,腾讯云AI代码助手将高亮显示divide(x, y),并提示“未定义的名称‘divide’”。

作者 east
提示词, 运维 4月 25,2024

利用kimi等大模型进行运维参数解析和调优

在运维时,经常遇到很多参数,有些参数不知道意义,知道意义的也有些不知道合理参考值是多少。利用kimi等大模型来当老司机,轻松解决运维难题。

例如在运维hive参数时,有些不知道作用,提示次如下

你的角色是运维专家,逐个解析每个配置的作用,并看是否合理:【运维参数】

为了获取某个参数的合理值,还可以进一步追问:

作者 east
chatgpt, 大模型 10月 12,2023

NLP民工的乐园: 最全最新的大模型(ChatGPT)中文NLP资源库

引用自:
fighting41love/funNLP

The Most Powerful NLP-Weapon Arsenal

NLP民工的乐园: 几乎最全的中文NLP资源库

在入门到熟悉NLP的过程中,用到了很多github上的包,遂整理了一下,分享在这里。

很多包非常有趣,值得收藏,满足大家的收集癖! 如果觉得有用,请分享并star⭐,谢谢!

长期不定时更新,欢迎watch和fork!❤️❤️❤️

🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥                  
* 类ChatGPT的模型评测对比
* 类ChatGPT的资料
* 类ChatGPT的开源框架
* LLM的训练_推理_低资源_高效训练
* 提示工程
* 类ChatGPT的文档问答
* 类ChatGPT的行业应用
* 类ChatGPT的课程资料
* LLM的安全问题
* 多模态LLM
* LLM的数据集
🍆 🍒 🍐 🍊                  🌻 🍓 🍈 🍅 🍍                    
* 语料库
* 词库及词法工具
* 预训练语言模型
* 抽取
* 知识图谱
* 文本生成
* 文本摘要
* 智能问答
* 文本纠错
* 文档处理
* 表格处理
* 文本匹配
* 文本数据增强
* 文本检索
* 阅读理解
* 情感分析
* 常用正则表达式
* 语音处理
* 常用正则表达式
* 事件抽取
* 机器翻译
* 数字转换
* 指代消解
* 文本聚类
* 文本分类
* 知识推理
* 可解释NLP
* 文本对抗攻击
* 文本可视化
* 文本标注工具
* 综合工具
* 有趣搞笑工具
* 课程报告面试等
* 比赛
* 金融NLP
* 医疗NLP
* 法律NLP
* 文本生成图像
* 其他

类ChatGPT的模型评测对比

资源名(Name)描述(Description)链接
ChatALL:可以同时与多个AI聊天机器人(含清华、讯飞的产品)可以同时与多个AI聊天机器人(如ChatGPT、Bing Chat、Bard、Alpaca、Vincuna、Claude、ChatGLM、MOSS、iFlytek Spark、ERNIE等)进行对话的工具。它可以并行发送提示给不同的AI机器人,帮助用户找到最好的回答github-ChatALL
Chatbot Arena实际场景用Elo rating对 LLM 进行基准测试 – 介绍了 Chatbot Arena,一种针对大型语言模型 (LLM) 的基准平台,采用匿名、随机的方式进行对抗评测,评测方式基于国际象棋等竞技游戏中广泛使用的 Elo rating system。发布了9个流行的开源 LLM 模型的 Elo rating 并推出排行榜。平台采用 FastChat 多模型服务系统,在多个语言下提供交互式界面,数据来源于用户投票。总结了 Chatbot Arena 的优点并计划提供更好的采样算法、排名和服务系统截止2023年5月3日
类ChatGPT模型评测总结大型语言模型(LLM)受到广泛关注,这些强大的模型能够理解复杂的信息,并对各种问题提供类人的回应。其中GPT-3和GPT-4表现最好,Flan-t5和Lit-LLaMA表现也不错。但要注意,模型商用可能需要付费和数据共享blog
大型语言模型(LLMs)大盘点blog
大模型评测方面的最新研究长文本建模一直是ChaGPT令人惊艳的能力之一,我们以【篇章翻译】为实验场景,对大模型的篇章建模能力进行全面、细粒度的测试。paper
中文大模型评测工具&排行榜C-Eval是一个全面的中文评估套件,适用于基础模型。它包含13948个多项选择题,涵盖52个不同的学科和四个难度级别,具体如下所示。请访问我们的网站或查阅我们的论文获取更多详细信息。githubpaper
OpenCompass 大模型评测OpenCompass 上海人工智能实验室开发的一款开源、高效、全面的评测大模型体系及开放平台,提供完整开源可复现的评测框架,支持大语言模型、多模态模型各类模型的一站式评测。利用分布式技术,即使面对千亿参数模型也能在数小时内完成评测。基于多个不同维度的高认可度数据集开放多样化的评测方式,包括零样本评测、小样本评测和思维链评测,全方位量化模型各个维度能力。github website

类ChatGPT的资料

资源名(Name)描述(Description)链接
Open LLMs:可供商业使用的开放大型语言模型(LLM)A list of open LLMs available for commercial usegithub
LLM Zoo: 大型语言模型的数据、模型和基准集市LLM Zoo: democratizing ChatGPT – a project that provides data, models, and evaluation benchmark for large language modelsgithub
大型语言模型(LLM)资料合集相关论文列表,包括指导、推理、决策、持续改进和自我提升等方面的研究工作LLM资料合集
DecryptPrompt总结Prompt&LLM论文,开源数据&模型,AIGC应用github
SmartGPT旨在为大型语言模型(尤其是GPT-3.5和GPT-4)提供完成复杂任务的能力,通过将它们分解成更小的问题,并使用互联网和其他外部来源收集信息。特点包括模块化设计,易于配置,以及对插件的高度支持。SmartGPT的运作基于”Autos”的概念,包括”Runner”和”Assistant”两种类型,都配有处理计划、推理和任务执行的LLM代理。此外,SmartGPT还具有内存管理系统,以及可以定义各种命令的插件系统github-SmartGPT
OpenGPT用于创建基于指令的数据集并训练对话领域专家大型语言模型(LLMs)的框架。已经成功应用于训练健康护理对话模型NHS-LLM,利用来自英国国家卫生服务体系(NHS)网站的数据,生成了大量的问答对和独特对话github-OpenGPT
PaLM 2技术报告Google最新发布PaLM 2,一种新的语言模型,具有更好的多语言和推理能力,同时比其前身PaLM更节省计算资源。PaLM 2综合了多项研究进展,包括计算最优的模型和数据规模、更多样化和多语言的数据集、以及更有效的模型架构和目标函数。PaLM 2在多种任务和能力上达到了最先进的性能,包括语言水平考试、分类和问答、推理、编程、翻译和自然语言生成等。PaLM 2还展示了强大的多语言能力,能够处理数百种语言,并在不同语言之间进行翻译和解释。PaLM 2还考虑了负责任的使用问题,包括推理时控制毒性、减少记忆化、评估潜在的伤害和偏见等PaLM 2 Technical Report
DB-GPT于vicuna-13b和FastChat的开源实验项目,采用了langchain和llama-index技术进行上下文学习和问答。项目完全本地化部署,保证数据的隐私安全,能直接连接到私有数据库处理私有数据。其功能包括SQL生成、SQL诊断、数据库知识问答等github-DB-GPT
Transformers相关文献资源大列表包含了各种各样的Transformer模型,例如BERT、GPT、Transformer-XL等,这些模型已经在许多自然语言处理任务中得到了广泛应用。此外,该列表还提供了这些模型的相关论文和代码链接,为自然语言处理领域的研究人员和开发者提供了很好的参考资源github
GPT-4终极指南一份关于如何使用GPT3和GPT4的指南,其中包括100多个资源,可以帮助学习如何用它来提高生活效率。包括如何学习ChatGPT基础知识、如何学习ChatGPT高级知识、如何在语言学习中使用GPT-3、如何在教学中使用GPT-3、如何使用GPT-4等,还提供了如何升级到ChatGPT+计划以使用GPT-4以及如何免费使用GPT-4的方法等内容。同时,还提供了如何在业务、生产力、受益、金钱等方面使用ChatGPT的指南link
基于LoRA的LLM参数高效微调link
复杂推理:大语言模型的北极星能力在 GPT-4 发布博客中,作者写道:“在一次随意的谈话中,GPT-3.5 和 GPT-4 之间的区别可能是微妙的。当任务的复杂程度达到足够的阈值时,差异就会显现出来。”这意味着复杂任务很可能是大型和小型语言模型的关键差异因素。在这篇文章中,我们将仔细分析讨论如何让大语言模型拥有强大的复杂推理能力。blog
大型语言模型的涌现能力是否是海市蜃楼?大语言模型的涌现能力一直是被大家视作很神奇的现象,似乎是一种大力出奇迹,但这篇论文认为这可能只是一种错觉。paper
大语言模型的概率总结非常详尽的LLM科学解释和总结paper
LLaMA 模型简史LLaMA是Meta发布的语言模型,采用Transformer架构,有多个版本,最大为65B参数。与GPT类似,可用于进一步微调,适用于多种任务。与GPT不同的是,LLaMA是开源的,可以在本地运行。现有的LLaMA模型包括:Alpaca、Vicuna、Koala、GPT4-x-Alpaca和WizardLM。每个模型都有不同的训练数据和性能表现blog
大型语言模型的复杂推理讨论了如何训练具有强大复杂推理能力的语言模型,并探讨了如何有效地提示模型以充分释放其潜力;针对语言模型和编程的训练相似性,提出了三阶段的训练:持续训练、监督微调和强化学习;介绍了评估大型语言模型推理能力的一套任务集合;讨论了如何进行提示工程,通过提供各种学习机会使模型获得更好的学习效果,最终实现智能化link
大语言模型进化树paper
李宏毅:穷人如何低资源复刻自己的ChatGPTblog
训练ChatGPT的必备资源:语料、模型和代码库完全指南资源链接论文地址
GitHub宝藏库,里面整理了GPT相关的各种开源项目github
ChatGPT中文指南gitlab
探讨了ChatGPT在自然语言处理中的应用、优势、限制以及未来发展方向强调了在使用该技术时的伦理道德考量和提示工程技术。paper
大型语言模型相关文献资源列表github
大型语言模型文献综述–中文版github
ChatGPT 相关资源大列表github
Pre-Training to Learn in Contextpaper
Langchain架构图image
LLM开发人员都应该知道的数字github
大语言模型如何构建强大的复杂推理能力blog
LLMs九层妖塔分享打怪(ChatGLM、Chinese-LLaMA-Alpaca、MiniGPT-4、FastChat、LLaMA、gpt4all等)实战与经验github

类ChatGPT的开源框架

资源名(Name)描述(Description)链接
LLM-As-Chatbot这个项目把市面上有的LLM全部做成了Chatbot,直接可以在google colab运行,不需要自己搭建,非常适用于想体验LLM的朋友们。我刚试了,真的超简单。有些LLM需要的显存比较多,所以最好是要有colab pro订阅。github
OpenBuddy一款强大的开源多语言聊天机器人模型,目标是全球用户,重点是对话AI和流畅的多语言支持,包括英文、中文等多种语言。基于Facebook的LLAMA模型,进行了微调,包括扩展词汇表、增加常用字符和增强的token embeddings。通过这些改进和多轮对话数据集,OpenBuddy提供了一个强大的模型,能回答问题并在各种语言之间进行翻译任务。OpenBuddy的使命是提供一个免费、开放且可离线使用的AI模型,该模型可以在用户的设备上运行,无论他们的语言或文化背景如何。目前,OpenBuddy-13B的演示版本可以在Discord服务器上找到。其关键功能包括多语言对话AI(包括中文、英文、日文、韩文、法文等)、增强的词汇表和对常见CJK字符的支持,以及两种模型版本:7B和13Bgithub-OpenBuddy
Panda: 海外中文开源大语言模型基于 Llama-7B, -13B, -33B, -65B 进行中文领域上的持续预训练,使用了接近15M条数据,并针对推理能力在中文benchmark上进行了评测github-PandaLM
Dromedary:一个开源的自对齐语言模型,只需少量人工监督即可进行训练github-Dromedary
LaMini-LM 蒸馏的小型、高效的语言模型集合从 ChatGPT 蒸馏的小型、高效的语言模型集合,在2.58 M 指令大规模数据集上进行训练github
LLaMA-Adapter V2上海人工智能实验室 LLaMA-Adapter V2,仅注入14M参数,1小时时间即可完成训练,对比较果确实很惊艳,且具有多模态功能(对图像进行解释和问答)github
HuggingChatHugging Face 推出第一个 ChatGPT 开源替代品:HuggingChat。基于 Open Assistant 大模型搭建,支持中文对话与编写代码,但暂不支持中文回复。应用已上线,无需代理,打开即可访问link
Open-Chinese-LLaMA基于 LLaMA-7B 经过 中文数据集增量预训练 产生的 中文大语言模型基座github
OpenLLaMALLaMA模型的开源复现,在RedPajama数据集上训练,使用了与LLaMA相同的预处理步骤和超参数,模型结构,上下文长度,训练步骤,学习率调度和优化器。OpenLLaMA的PyTorch和Jax权重可以在Huggingface Hub上获得。OpenLLaMA在各种任务中展现出与LLaMA和GPT-J相似的表现,部分任务表现优异github
replit-code-v1-3bBY-SA 4.0授权发布,这意味着允许商业使用link
MOSSMOSS是一个支持中英双语和多种插件的开源对话语言模型,moss-moon系列模型具有160亿参数,在FP16精度下可在单张A100/A800或两张3090显卡运行,在INT4/8精度下可在单张3090显卡运行。MOSS基座语言模型在约七千亿中英文以及代码单词上预训练得到,后续经过对话指令微调、插件增强学习和人类偏好训练具备多轮对话能力及使用多种插件的能力。github
RedPajama1.2 万亿tokens数据集link
chinese_llama_alpaca_lora 抽取框架github
Scaling Transformer to 1M tokens and beyond with RMT该论文提出一种名为 RMT 的新技术,或许可将 Transform 的 Token 上限扩展至 100 万,甚至更多。github
Open Assistant包含大量AI生成的、人工标注的语料库和包括基于LLaMA和基于Pythia的多种模型可选。发布的数据集包括超过161K较高质量的,多达35种语言的人工助手型交互对话语料库data model
ChatGLM Efficient Tuning基于 PEFT 的高效 ChatGLM 微调github
Dolly介绍news
Baize:一种对自聊天数据进行参数高效调优的开源聊天模型Baize是一个开源的聊天模型,可以进行多轮对话。它是通过使用ChatGPT自我对话生成高质量的多轮聊天语料库,并使用参数高效调整来增强LLaMA(一个开源的大型语言模型)而创建的。Baize模型在具有最小潜在风险的情况下表现出良好的多轮对话性能。它可以在单个GPU上运行,使更广泛的研究人员可以使用它。Baize模型和数据仅用于研究目的。论文地址源码地址
GPTrillion–未找到开源代码包含1.5万亿(1.5T)参数的大模型GPTrillion开源了,号称是目前世界上最大的开源LLMgoogle_doc
Cerebras-GPT-13B(可商用)hugging_face
Chinese-ChatLLaMA中文ChatLLaMA对话模型;预训练/指令微调数据集,基于 TencentPretrain 多模态预训练框架构建,支持简繁体中文、英文、日文等多语言github
Lit-LLaMA基于Apache 2.0许可证完全开源的LLaMA独立实现,建立在nanoGPT之上,旨在解决原始LLaMA代码采用GPL许可证的限制,以实现更广泛的学术和商业应用github
MosaicMLMPT-7B-StoryWriter,65K tokens,可以把《了不起的盖茨比》都一次性扔进去。huggingface
Langchain大型语言模型(LLMs)正在成为一项具有变革性的技术,使开发者能够构建以前无法实现的应用程序。然而,仅仅使用这些独立的LLMs通常不足以创建一个真正强大的应用程序 – 真正的力量来自于能够将它们与其他计算或知识来源相结合。github
Guidance引导能够比传统的提示或链接更有效地控制现代语言模型,并且更高效。引导程序允许您将生成、提示和逻辑控制交错到单一连续流中,与语言模型实际处理文本的方式相匹配。像”Chain of Thought”及其许多变体(例如ART、Auto-CoT等)这样的简单输出结构已被证明能改善语言模型的性能。更强大的语言模型(如GPT-4)的出现使得更丰富的结构成为可能,而引导则使得构建这种结构变得更加容易和经济。github
WizardLM赋予大型预训练语言模型遵循复杂指令的能力,使用完整进化指令(约300k)训练的WizardLM-7B模型github

LLM的训练_推理_低资源_高效训练

资源名(Name)描述(Description)链接
QLoRA–Guanaco一种高效的微调方法,可以在单个48GB的GPU上微调一个拥有65B参数的模型,同时保持完整的16位微调任务性能,并通过QLoRA将梯度反向传播通过一个冻结的、4位量化的预训练语言模型到低秩适配器(LoRA)github
Chinese-Guanaco一个中文低资源的量化训练/部署方案github
DeepSpeed Chat: 一键式RLHF训练github
LLMTune: 在消费级GPU上微调大型65B+LLM可以在普通消费级GPU上进行4位微调,例如最大的65B LLAMA模型。LLMTune还实现了LoRA算法和GPTQ算法来压缩和量化LLM,并通过数据并行处理大型模型。此外,LLMTune提供了命令行界面和Python库的使用方式github
基于ChatGLM-6B+LoRA在指令数据集上进行微调基于deepspeed支持多卡微调,速度相比单卡提升8-9倍具体设置可见 微调3 基于DeepSpeed进行Lora微调github
微软发布RLHF训练工具DeepSpeed Chatgithub
LlamaChat:Mac上基于LLaMa的聊天机器人github
ChatGPT/GPT4开源“平替”们github
训练大型机器学习模型的实用建议和技巧帮助您训练大型模型(>1B 参数)、避免不稳定性、保存开始失败的实验而不从 0 重新开始link
Instruction Tuning with GPT-4paper
xturing一个Python软件包,用于高效、快速、简单地微调LLM模型,支持LLaMA、GPT-J、GPT-2等多种模型,可使用单GPU和多GPU训练,使用LoRA等高效微调技术可将硬件成本降低高达90%,并在短时间内完成模型训练github
GPT4All一个允许在Macbook本地运行GPT的开源项目。基于LLaMa-7B大语言模型打造,包括数据、代码和demo都是开源的,对话风格偏向AI助理github
用Alpaca-LoRA微调ChatGPT类模型link
LMFlow可扩展、方便有效的工具箱,用于微调大型机器学习模型github
闻达:大型语言模型调用平台目前支持chatGLM-6B、chatRWKV、chatYuan和chatGLM-6B模型下的chatPDF(自建知识库查找)’github
Micro Agent小型自主智能体开源项目,由LLM(OpenAI GPT-4)提供动力,可以为你编写软件,只需设置一个“目的”,让它自己工作github
Llama-X开源的学术研究项目,通过社区共同努力,逐步将LLaMA的性能提高到SOTA LLM水平,节省重复工作,共同创造更多、更快的增量github
Chinese-LLaMA-Alpaca中文LLaMA&Alpaca大语言模型+本地部署 (Chinese LLaMA & Alpaca LLMs) – 开源了经过中文文本数据预训练的中文LLaMA大模型;开源了进一步经过指令精调的中文Alpaca大模型;快速地使用笔记本电脑(个人PC)本地部署和体验量化版大模型github
Efficient Alpaca基于LLaMA实现的开源项目,旨在通过微调 LLaMA-7B模型在资源消耗更少、推理速度更快、更适合研究者使用方面提高Stanford Alpaca的性能github
ChatGLM-6B-Slim裁减掉20K图片Token的ChatGLM-6B,完全一样的性能,占用更小的显存github
Chinese-Vicuna一个中文低资源的llama+lora方案github
Alpaca-LoRA用LoRA在消费级硬件上复现斯坦福Alpaca的结果github
LLM Accelerator让基础大模型更聪明的LLM Accelerator来了!基础大模型正在诸多应用中发挥着日益重要的作用。大多数大语言模型的训练都是采取自回归的方式进行生成,虽然自回归模型生成的文本质量有所保证,但却导致了高昂的推理成本和长时间的延迟。由于大模型的参数量巨大、推理成本高,因此如何在大规模部署大模型的过程中降低成本、减小延迟是一个关键课题。针对此问题,微软亚洲研究院的研究员们提出了一种使用参考文本无损加速大语言模型推理的方法 LLM Accelerator,在大模型典型的应用场景中可以取得两到三倍的加速。blog
大语言模型(LLM)微调技术笔记github
PyLLMs简洁的 Python 库,用于连接各种 LLM(OpenAI、Anthropic、Google、AI21、Cohere、Aleph Alpha、HuggingfaceHub),内置模型性能基准。非常适合快速原型设计和评估不同模型,具有以下特点:通过少量代码连接顶级 LLM;响应元数据包括处理的Token、成本和延迟,对各个模型进行标准化;支持多模型:同时从不同模型获取补全;LLM 基准:评估模型的质量、速度和成本github
用混合精度加速大型语言模型通过使用低精度浮点数运算,可以将训练和推断速度提升多达3倍,同时不影响模型准确性blog
新的LLM训练方法 Federate杜克大学和微软一起发布了一个新的LLM训练方法 Federated GPT,这个训练方法是将原本中心化的训练方法分散到不同的边缘设备里面(edge device),然后训练完成后,再上传到中心去将各子模型合并。github

提示工程

资源名(Name)描述(Description)链接
OpenBuprompt-engineering-note提示工程笔记(课程总结)》介绍了面向开发者的 ChatGPT Prompt Engineering Learning Notes 课程,该课程提供了语言模型的工作原理和提示工程实践,并展示了如何将语言模型 API 应用于各种任务的应用程序中。课程包括总结、推断、转换、扩展和打造聊天机器人等方面的内容,并讲述了如何设计好的提示和构建自定义聊天机器人。github-OpenBuprompt
提示工程指南link
AIGC提示工程学习站 Learn PromptChatGPT/Midjourney/Runwaylink
Prompts 精选 – ChatGPT 使用指南ChatGPT 使用指南,提升 ChatGPT 可玩性和可用性github
非官方的ChatGPT资源聚合列表,旨在汇总使用ChatGPT旨在汇总使用ChatGPT的应用、Web应用、浏览器扩展、CLI工具、机器人、集成、软件包、文章等资源github
Snack Prompt:ChatGPT Prompt提示分享社区link
ChatGPT提问技巧如何向 ChatGPT 提问以获得高质量答案:提示技巧工程完全指南github
rompt-Engineering-Guide-Chinese – 提示工程师指南源自英文版,但增加了AIGC的prompt部分github
OpenPrompt一个开放的共享Prompt社区,大家一起推荐好用的promptgithub
GPT-Prompts教你如何用GPT生成Promptsgithub

类ChatGPT的文档问答

资源名(Name)描述(Description)链接
privateGPT基于GPT4All-J的私有化部署文档问答平台,无需联网,能100%保证用户的隐私不泄露。提供了一个API,用户可以使用自己的文档进行交互式问答和生成文本。此外,平台支持自定义训练数据和模型参数,以满足个性化需求github-privateGPT
Auto-evaluator文档问答的自动评估 ;、github
PDF GP一个基于 GPT 实现的开源 PDF 文档聊天方案,主要实现以下功能:跟 PDF 文档进行一对一对话;自动切割内容,并使用强大的深度平均网络编码器来生成嵌入;对 PDF 内容执行语义搜索,并将最相关的嵌入传递给 Open AI;自定义逻辑,生成更精确的响应信息,速度要比 OpenAI 的快。github
Redis-LLM-Document-Chat用LlamaIndex、Redis和OpenAI与PDF文档进行交互,包含一个Jupyter笔记本,演示了如何使用Redis作为向量数据库来存储和检索文档向量,还展示了如何使用LlamaIndex在文档中执行语义搜索,以及如何利用OpenAI提供类似聊天机器人的体验github
doc-chatbotGPT-4 + Pinecone + LangChain + MongoDB实现的文档聊天机器人,可多文件、多话题和多窗口聊天,聊天历史由MongoDB保存github
document.ai基于向量数据库与GPT3.5的通用本地知识库方案(A universal local knowledge base solution based on vector database and GPT3.5)github
DocsGPTDocsGPT是一种尖端的开源解决方案,可以简化在项目文档中查找信息的过程。通过集成强大的GPT模型,开发人员可以轻松地提出关于项目的问题并获得准确的答案。github
ChatGPT Retrieval PluginChatGPT检索插件存储库提供了一种灵活的解决方案,可以使用自然语言查询对个人或组织文档进行语义搜索和检索。github
LamaIndexlamaIndex(GPT索引)是您的LLM应用程序的数据框架。github
chatWebChatWeb可以爬取任意网页或PDF,DOCX,TXT文件并提取正文,可以生成嵌入式概要,可以根据正文内容回答你的问题。 基于gpt3.5的chatAPI和embeddingAPI,以及向量数据库实现。github

类ChatGPT的行业应用

资源名(Name)描述(Description)链接
新闻报道进行情感分析用ChatGPT通过对上市公司的新闻报道进行情感分析,在15个月时间内在股票市场(交易期权)产生了500%的回报(在历史数据中测试得出的结果)——探讨了ChatGPT在利用新闻标题的情感分析来预测股市回报方面的潜力。发现ChatGPT的情感分析能力超过了传统的方法,并且与股市回报呈正相关。提出ChatGPT在金融经济领域有很大的价值,并对未来的研究和应用提出了一些启示和建议paper
编程语言生成模型 StarCoderBigCode是 ServiceNow Inc. 和 Hugging Face Inc. 合作成立的。StarCoder 有多个版本。核心版本 StarCoderBase 具有 155 亿个参数,支持80多种编程语言,8192个token的上下文。视频为其vscode插件效果github
CodeGen2: Lessons for Training LLMs on Programming and Natural Languagescode generationpaper
MedicalGPT-zh:中文医疗通用语言模型中文医疗通用语言模型,基于28个科室的医疗共识与临床指南文本,提高模型的医疗领域知识与对话能力github
MagicSlides不少人梦寐以求的AI自作PPT,免费版每月能做3个PPT,支持2500字输入link
SalesGPT使用LLM实现上下文感知的销售助手,可自动化销售拓展代表的活动,如外呼销售电话github
华驼(HuaTuo): 基于中文医学知识的LLaMA微调模型github
ai-code-translator帮助你把代码从一种语言翻译成另一种语言,这事对ChatGPT来说简直太擅长了,尤其是GPT-4,翻译质量相当高,而且tokens长度也可以更长。github
ChatGenTitle使用百万arXiv论文信息在LLaMA模型上进行微调的论文题目生成模型github
Regex.ai一款所见即所得的,基于 AI 的正则表达式自动生成工具,只需要选择出数据,它就能帮你写正则表达式,并提供多种提取数据的方式video
ChatDoctor一个基于医学领域知识微调LLaMA的医学聊天模型,其中医学数据包含大约700种疾病的数据、以及大约5000段医生和病人的对话记录paper
CodeGPT提高编程能力的关键在于数据。CodeGPT是通过GPT生成的用于GPT的代码对话数据集。现在公开了32K条中文数据,让模型更擅长编程github
LaWGPT一系列基于中文法律知识的开源大语言模型github
LangChain-ChatGLM-Webui受langchain-ChatGLM启发, 利用LangChain和ChatGLM-6B系列模型制作的Webui, 提供基于本地知识的大模型应用.目前支持上传 txt、docx、md、pdf等文本格式文件, 提供包括ChatGLM-6B系列、Belle系列等模型文件以及GanymedeNil/text2vec-large-chinese、nghuyong/ernie-3.0-base-zh、nghuyong/ernie-3.0-nano-zh等Embedding模型.github

类ChatGPT的课程资料

资源名(Name)描述(Description)链接
Databricks(Dolly模型的作者)在edX发布了两个免费课程程,其中第二个是关于LLM是如何构建的。link
大语言模型技术分享系列东北大学自然语言处理实验室video
GPT-4是如何工作的?如何利用GPT-4打造智能程序?哈佛大学CS50公开课video
提示工程最佳实践:Andrew Ng 提示工程新课摘要+LangChain经验总结medium_blog
微调LLM模型如果你对微调LLM模型感兴趣,一定要关注这个油管博主,他把几乎世面上所有的LLM模型都公开了微调的方法。油管博主 Sam Witteveen
Transformer的架构解读通俗易懂的介绍youtube1youtube2 youtube3
Transformer multi head机制的视频如果想要真正理解整个Transform的每一个细节,包括里面的数学原理,可以看一下这个视频,真的是剖析地非常详细youtube
Introduction to Large Language Models大语言模型介绍介绍了大型语言模型(Large Language Models,LLMs)的概念、使用场景、提示调整以及Google的Gen AI开发工具。

LLM的安全问题

资源名(Name)描述(Description)链接
LLM模型安全研究link
Chatbot Injections & Exploit收集了一些Chatbot注入和漏洞的例子,以帮助人们了解Chatbot的潜在漏洞和脆弱性。注入和攻击的方式包括命令注入、字符编码、社交工程、表情符号、Unicode等。仓库提供了一些示例,其中一些包括可用于攻击Chatbot的表情符号列表github
GPTSecurity一个涵盖了前沿学术研究和实践经验分享的社区,集成了生成预训练 Transformer(GPT)、人工智能生成内容(AIGC)以及大型语言模型(LLM)等安全领域应用的知识。在这里,您可以找到关于GPT/AIGC/LLM最新的研究论文、博客文章、实用的工具和预设指令(Prompts)。github

多模态LLM

资源名(Name)描述(Description)链接
DeepFloyd IF高度逼真且具有语言理解能力的最新开源文本到图像模型,由一个冻结文本编码器和三个连续的像素扩散模块组成,是一个高效的模型,性超越了当前最先进的模型,在COCO数据集上实现了零样本的FID得分为6.66github
Multi-modal GPT用多模态GPT训练一个能同时接收视觉和语言指令的聊天机器人。基于OpenFlamingo多模态模型,使用各种开放数据集创建各种视觉指导数据,联合训练视觉和语言指导,有效提高模型性能github
AudioGPTUnderstanding and Generating Speech, Music, Sound, and Talking Head’ by AIGC-Audiogithub
text2image-prompt-generator基于GPT-2用25万条Midjourney的promps训练出来的小模型,可以生成高质量的Midjourney promptlink data
汇总6个Midjourney以外的免费以文生图服务:Bing Image Creator Playground AI DreamStudio Pixlr Leonardo AI Craiyon
BARK一个非常强大的TTS(文字转语音)项目,这个项目的特点是,它可以在文字中加入提示词,比如“大笑”。这个提示词会变成笑的声音,然后合成到语音里去。它也可以混合“男声”,“女声”,这样再做就可以不用再做拼接操作了github
whisper在语音转文字(STT,也称ASR)方面,whisper是我用过的最好的,最快的库。没想到,这么快的模型,还能70x的优化空间。我准备部署这个模型,并开放给大家使用,可以用来转录大的语音文件,和进行翻译。这个模型是多语言的,而且能自动识别是什么语言,真的非常强大github
OFA-Chinese:中文多模态统一预训练模型transformers结构的中文OFA模型github
文生图开源模型试炼场可根据输入文字同时用stable-diffusion 1.5、stable-diffusion 2.1、DALL-E、kandinsky-2等模型生成图像,方便测试比较link
LLMScoreLLMScore是一种全新的框架,能够提供具有多粒度组合性的评估分数。它使用大语言模型(LLM)来评估文本到图像生成模型。首先,将图像转化为图像级别和对象级别的视觉描述,然后将评估指令输入到LLM中,以衡量合成图像与文本的对齐程度,并最终生成一个评分和解释。我们的大量分析显示,LLMScore在众多数据集上与人类判断的相关性最高,明显优于常用的文本-图像匹配度量指标CLIP和BLIP。papergithub
VisualGLM-6BVisualGLM-6B 是一个开源的,支持图像、中文和英文的多模态对话语言模型,语言模型基于 ChatGLM-6B,具有 62 亿参数;图像部分通过训练 BLIP2-Qformer 构建起视觉模型与语言模型的桥梁,整体模型共78亿参数。github

LLM的数据集

资源名(Name)描述(Description)链接
歧义数据集能否正确的消除歧义是衡量大语言模型的一个重要指标。不过一直没有一个标准化的衡量方法,这篇论文提出了一个包含1,645个具有不同种类歧义的数据集及对应的评估方法。github paper
thu指令训练数据设计了一套流程来自动产生多样化高质量的多轮指令对话数据UltraChat,并进行了细致的人工后处理。现已将英文数据全部开源,共计150余万条,是开源社区数量最多的高质量指令数据之一github
多模态数据集MMC45.8亿图片,1亿文档,400亿tokengithub
EleutherAI 数据800g的文本语料给你整合好了免费下载,不知道trian出来的model质量如何,打算试试:pile data paper
UltraChat大规模、信息丰富、多样化的多轮对话数据github
ConvFinQA金融数据问答github
The botbots dataset一个包含对话内容的数据集,对话内容来自于两个ChatGPT实例(gpt-3.5-turbo),CLT命令和对话提示来自GPT-4,覆盖多种情境和任务,生成成本约为35美元,可用于研究和训练更小的对话模型(如Alpaca)github
alpaca_chinese_dataset – 人工精调的中文对话数据集github
CodeGPT-data提高编程能力的关键在于数据。CodeGPT是通过GPT生成的用于GPT的代码对话数据集。现在公开了32K条中文数据,让模型更擅长编程github

语料库

资源名(Name)描述(Description)链接
人名语料库wainshine/Chinese-Names-Corpus
Chinese-Word-Vectors各种中文词向量github repo
中文聊天语料该库搜集了包含豆瓣多轮, PTT八卦语料, 青云语料, 电视剧对白语料, 贴吧论坛回帖语料,微博语料,小黄鸡语料link
中文谣言数据该数据文件中,每一行为一条json格式的谣言数据github
中文问答数据集链接 提取码 2dva
微信公众号语料3G语料,包含部分网络抓取的微信公众号的文章,已经去除HTML,只包含了纯文本。每行一篇,是JSON格式,name是微信公众号名字,account是微信公众号ID,title是题目,content是正文github
中文自然语言处理 语料、数据集github
任务型对话英文数据集【最全任务型对话数据集】主要介绍了一份任务型对话数据集大全,这份数据集大全涵盖了到目前在任务型对话领域的所有常用数据集的主要信息。此外,为了帮助研究者更好的把握领域进展的脉络,我们以Leaderboard的形式给出了几个数据集上的State-of-the-art实验结果。github
语音识别语料生成工具从具有音频/字幕的在线视频创建自动语音识别(ASR)语料库github
LitBankNLP数据集支持自然语言处理和计算人文学科任务的100部带标记英文小说语料github
中文ULMFiT情感分析 文本分类 语料及模型github
省市区镇行政区划数据带拼音标注github
教育行业新闻 自动文摘 语料库github
中文自然语言处理数据集github
维基大规模平行文本语料85种语言、1620种语言对、135M对照句github
古诗词库github repo
更全的古诗词库
低内存加载维基百科数据用新版nlp库加载17GB+英文维基语料只占用9MB内存遍历速度2-3 Gbit/sgithub
对联数据700,000 couplets, 超过70万对对联github
《配色辞典》数据集github
42GB的JD客服对话数据(CSDD)github
70万对联数据link
用户名黑名单列表github
依存句法分析语料4万句高质量标注数据Homepage
人民日报语料处理工具集github
虚假新闻数据集 fake news corpusgithub
诗歌质量评价/细粒度情感诗歌语料库github
中文自然语言处理相关的开放任务数据集以及当前最佳结果github
中文缩写数据集github
中文任务基准测评代表性的数据集-基准(预训练)模型-语料库-baseline-工具包-排行榜github
中文谣言数据库github
CLUEDatasetSearch中英文NLP数据集搜索所有中文NLP数据集,附常用英文NLP数据集github
多文档摘要数据集github
让人人都变得“彬彬有礼”礼貌迁移任务在保留意义的同时将非礼貌语句转换为礼貌语句,提供包含139M + 实例的数据集paper and code
粤语/英语会话双语语料库github
中文NLP数据集列表github
类人名/地名/组织机构名的命名体识别数据集github
中文语言理解测评基准包括代表性的数据集&基准模型&语料库&排行榜github
OpenCLaP多领域开源中文预训练语言模型仓库民事文书、刑事文书、百度百科github
中文全词覆盖BERT及两份阅读理解数据DRCD数据集:由中国台湾台达研究院发布,其形式与SQuAD相同,是基于繁体中文的抽取式阅读理解数据集。
CMRC 2018数据集:哈工大讯飞联合实验室发布的中文机器阅读理解数据。根据给定问题,系统需要从篇章中抽取出片段作为答案,形式与SQuAD相同。
github
Dakshina数据集十二种南亚语言的拉丁/本地文字平行数据集合github
OPUS-100以英文为中心的多语(100种)平行语料github
中文阅读理解数据集github
中文自然语言处理向量合集github
中文语言理解测评基准包括代表性的数据集、基准(预训练)模型、语料库、排行榜github
NLP数据集/基准任务大列表github
LitBankNLP数据集支持自然语言处理和计算人文学科任务的100部带标记英文小说语料github
70万对联数据github
文言文(古文)-现代文平行语料短篇章中包括了《论语》、《孟子》、《左传》等篇幅较短的古籍,已和《资治通鉴》合并github
COLDDateset,中文冒犯性语言检测数据集涵盖了种族、性别和地区等话题内容,数据待论文发表后放出paper
GAOKAO-bench:以中国高考题目作为数据集以中国高考题目作为数据集,评估大语言模型的语言理解能力和逻辑推理能力的测评框架,包含1781道选择题、218道填空题和812道解答题github
zero to nlp – 中文nlp应用数据、模型、训练、推理github

词库及词法工具

资源名(Name)描述(Description)链接
textfilter中英文敏感词过滤observerss/textfilter
人名抽取功能中文(现代、古代)名字、日文名字、中文的姓和名、称呼(大姨妈、小姨妈等)、英文->中文名字(李约翰)、成语词典cocoNLP
中文缩写库全国人大: 全国 人民 代表大会; 中国: 中华人民共和国;女网赛: 女子/n 网球/n 比赛/vngithub
汉语拆字词典漢字 拆法 (一) 拆法 (二) 拆法 (三) 拆 手 斥 扌 斥 才 斥kfcd/chaizi
词汇情感值山泉水:0.400704566541
充沛: 0.37006739587
rainarch/SentiBridge
中文词库、停用词、敏感词dongxiexidian/Chinese
python-pinyin汉字转拼音mozillazg/python-pinyin
zhtools中文繁简体互转skydark/nstools
英文模拟中文发音引擎say wo i ni #说:我爱你tinyfool/ChineseWithEnglish
chinese_dictionary同义词库、反义词库、否定词库guotong1988/chinese_dictionary
wordninja无空格英文串分割、抽取单词wordninja
汽车品牌、汽车零件相关词汇data
THU整理的词库IT词库、财经词库、成语词库、地名词库、历史名人词库、诗词词库、医学词库、饮食词库、法律词库、汽车词库、动物词库link
罪名法务名词及分类模型包含856项罪名知识图谱, 基于280万罪名训练库的罪名预测,基于20W法务问答对的13类问题分类与法律资讯问答功能github
分词语料库+代码百度网盘链接 – 提取码 pea6
基于Bi-LSTM + CRF的中文分词+词性标注keras实现link
基于Universal Transformer + CRF 的中文分词和词性标注link
快速神经网络分词包java version
chinese-xinhua中华新华字典数据库及api,包括常用歇后语、成语、词语和汉字github
SpaCy 中文模型包含Parser, NER, 语法树等功能。有一些英文package使用spacy的英文模型的,如果要适配中文,可能需要使用spacy中文模型。github
中文字符数据github
Synonyms中文近义词工具包github
HarvestText领域自适应文本挖掘工具(新词发现-情感分析-实体链接等)github
word2word方便易用的多语言词-词对集62种语言/3,564个多语言对github
多音字词典数据及代码github
汉字、词语、成语查询接口github
103976个英语单词库包(sql版,csv版,Excel版)github
英文脏话大列表github
词语拼音数据github
186种语言的数字叫法库github
世界各国大规模人名库github
汉字字符特征提取器 (featurizer)提取汉字的特征(发音特征、字形特征)用做深度学习的特征github
char_featurizer – 汉字字符特征提取工具github
中日韩分词库mecab的Python接口库github
g2pC基于上下文的汉语读音自动标记模块github
ssc, Sound Shape Code音形码 – 基于“音形码”的中文字符串相似度计算方法version 1
version 2
blog/introduction
基于百科知识库的中文词语多词义/义项获取与特定句子词语语义消歧github
Tokenizer快速、可定制的文本词条化库github
Tokenizers注重性能与多功能性的最先进分词器github
通过同义词替换实现文本“变脸”github
token2index与PyTorch/Tensorflow兼容的强大轻量词条索引库github
繁简体转换github
粤语NLP工具github
领域词典库涵盖68个领域、共计916万词的专业词典知识库github

预训练语言模型&大模型

资源名(Name)描述(Description)链接
BMList大模型大列表github
bert论文中文翻译link
bert原作者的slideslink
文本分类实践github
bert tutorial文本分类教程github
bert pytorch实现github
bert pytorch实现github
BERT生成句向量,BERT做文本分类、文本相似度计算github
bert、ELMO的图解github
BERT Pre-trained models and downstream applicationsgithub
语言/知识表示工具BERT & ERNIEgithub
Kashgari中使用gpt-2语言模型github
Facebook LAMA用于分析预训练语言模型中包含的事实和常识知识的探针。语言模型分析,提供Transformer-XL/BERT/ELMo/GPT预训练语言模型的统一访问接口github
中文的GPT2训练代码github
XLMFacebook的跨语言预训练语言模型github
海量中文预训练ALBERT模型github
Transformers 20支持TensorFlow 20 和 PyTorch 的自然语言处理预训练语言模型(BERT, GPT-2, RoBERTa, XLM, DistilBert, XLNet…) 8种架构/33种预训练模型/102种语言github
8篇论文梳理BERT相关模型进展与反思github
法文RoBERTa预训练语言模型用138GB语料训练的法文RoBERTa预训练语言模型link
中文预训练 ELECTREA 模型基于对抗学习 pretrain Chinese Modelgithub
albert-chinese-ner用预训练语言模型ALBERT做中文NERgithub
开源预训练语言模型合集github
中文ELECTRA预训练模型github
用Transformers(BERT, XLNet, Bart, Electra, Roberta, XLM-Roberta)预测下一个词(模型比较)github
TensorFlow Hub40+种语言的新语言模型(包括中文)link
UER基于不同语料、编码器、目标任务的中文预训练模型仓库(包括BERT、GPT、ELMO等)github
开源预训练语言模型合集github
多语言句向量包github
Language Model as a Service (LMaaS)语言模型即服务github
开源语言模型GPT-NeoX-20B200亿参数,是目前最大的可公开访问的预训练通用自回归语言模型github
中文科学文献数据集(CSL)包含 396,209 篇中文核心期刊论文元信息 (标题、摘要、关键词、学科、门类)。CSL 数据集可以作为预训练语料,也可以构建许多NLP任务,例如文本摘要(标题预测)、 关键词生成和文本分类等。github
大模型开发神器github

抽取

资源名(Name)描述(Description)链接
时间抽取已集成到 python package cocoNLP中,欢迎试用java version
python version
神经网络关系抽取 pytorch暂不支持中文github
基于bert的命名实体识别 pytorch暂不支持中文github
关键词(Keyphrase)抽取包 pkegithub
BLINK最先进的实体链接库github
BERT/CRF实现的命名实体识别github
支持批并行的LatticeLSTM中文命名实体识别github
构建医疗实体识别的模型包含词典和语料标注,基于pythongithub
基于TensorFlow和BERT的管道式实体及关系抽取– Entity and Relation Extraction Based on TensorFlow and BERT 基于TensorFlow和BERT的管道式实体及关系抽取,2019语言与智能技术竞赛信息抽取任务解决方案。Schema based Knowledge Extraction, SKE 2019github
中文命名实体识别NeuroNER vs BertNERgithub
基于BERT的中文命名实体识别github
中文关键短语抽取工具github
bert用于中文命名实体识别 tensorflow版本github
bert-Kashgari基于 keras 的封装分类标注框架 Kashgari,几分钟即可搭建一个分类或者序列标注模型github
cocoNLP人名、地址、邮箱、手机号、手机归属地 等信息的抽取,rake短语抽取算法。github
Microsoft多语言数字/单位/如日期时间识别包github
百度开源的基准信息抽取系统github
中文地址分词(地址元素识别与抽取),通过序列标注进行NERgithub
基于依存句法的开放域文本知识三元组抽取和知识库构建github
基于预训练模型的中文关键词抽取方法github
chinese_keyphrase_extractor (CKPE)A tool for chinese keyphrase extraction 一个快速从自然语言文本中提取和识别关键短语的工具github
简单的简历解析器,用来从简历中提取关键信息github
BERT-NER-Pytorch三种不同模式的BERT中文NER实验github

知识图谱

资源名(Name)描述(Description)链接
清华大学XLORE中英文跨语言百科知识图谱百度、中文维基、英文维基link
文档图谱自动生成github
基于医疗领域知识图谱的问答系统github
该repo参考了github
中文人物关系知识图谱项目github
AmpliGraph 知识图谱表示学习(Python)库知识图谱概念链接预测github
中文知识图谱资料、数据及工具github
基于百度百科的中文知识图谱抽取三元组信息,构建中文知识图谱github
Zincbase 知识图谱构建工具包github
基于知识图谱的问答系统github
知识图谱深度学习相关资料整理github
东南大学《知识图谱》研究生课程(资料)github
知识图谱车音工作项目github
《海贼王》知识图谱github
132个知识图谱的数据集涵盖常识、城市、金融、农业、地理、气象、社交、物联网、医疗、娱乐、生活、商业、出行、科教link
大规模、结构化、中英文双语的新冠知识图谱(COKG-19)link
基于依存句法与语义角色标注的事件三元组抽取github
抽象知识图谱目前规模50万,支持名词性实体、状态性描述、事件性动作进行抽象github
大规模中文知识图谱数据14亿实体github
Jiagu自然语言处理工具以BiLSTM等模型为基础,提供知识图谱关系抽取 中文分词 词性标注 命名实体识别 情感分析 新词发现 关键词 文本摘要 文本聚类等功能github
medical_NER – 中文医学知识图谱命名实体识别github
知识图谱相关学习资料/数据集/工具资源大列表github
LibKGE面向可复现研究的知识图谱嵌入库github
基于mongodb存储的军事领域知识图谱问答项目包括飞行器、太空装备等8大类,100余小类,共计5800项的军事武器知识库,该项目不使用图数据库进行存储,通过jieba进行问句解析,问句实体项识别,基于查询模板完成多类问题的查询,主要是提供一种工业界的问答思想demo。github
京东商品知识图谱github
基于远监督的中文关系抽取github
基于医药知识图谱的智能问答系统github
BLINK最先进的实体链接库github
一个小型的证券知识图谱/知识库github
dstlr非结构化文本可扩展知识图谱构建平台github
百度百科人物词条属性抽取用基于BERT的微调和特征提取方法来进行知识图谱github
新冠肺炎相关数据新冠及其他类型肺炎中文医疗对话数据集;清华大学等机构的开放数据源(COVID-19)github
github
DGL-KE 图嵌入表示学习算法github
因果关系图谱method data
基于多领域文本数据集的因果事件对link

文本生成

资源名(Name)描述(Description)链接
TexarToolkit for Text Generation and Beyondgithub
Ehud Reiter教授的博客link 北大万小军教授强力推荐,该博客对NLG技术、评价与应用进行了深入的探讨与反思。
文本生成相关资源大列表github
开放域对话生成及在微软小冰中的实践自然语言生成让机器掌握自动创作的本领link
文本生成控制github
自然语言生成相关资源大列表github
用BLEURT评价自然语言生成link
自动对联数据及机器人代码 link
70万对联数据
自动生成评论用Transformer编解码模型实现的根据Hacker News文章标题生成评论github
自然语言生成SQL语句(英文)github
自然语言生成资源大全github
中文生成任务基准测评github
基于GPT2的特定主题文本生成/文本增广github
编码、标记和实现一种可控高效的文本生成方法github
TextFooler针对文本分类/推理的对抗文本生成模块github
SimBERT基于UniLM思想、融检索与生成于一体的BERT模型github
新词生成及造句不存在的词用GPT-2变体从头生成新词及其定义、例句github
由文本自动生成多项选择题github
合成数据生成基准github

文本摘要

资源名(Name)描述(Description)链接
中文文本摘要/关键词提取github
基于命名实体识别的简历自动摘要github
文本自动摘要库TextTeaser仅支持英文github
基于BERT等最新语言模型的抽取式摘要提取github
Python利用深度学习进行文本摘要的综合指南link
(Colab)抽象文本摘要实现集锦(教程github

智能问答

资源名(Name)描述(Description)链接
中文聊天机器人根据自己的语料训练出自己想要的聊天机器人,可以用于智能客服、在线问答、智能聊天等场景github
有趣的情趣robot qingyunqingyun 训练出来的中文聊天机器人github
开放了对话机器人、知识图谱、语义理解、自然语言处理工具及数据github
qa对的机器人Amodel-for-Retrivalchatbot – 客服机器人,Chinese Retreival chatbot(中文检索式机器人)git
ConvLab开源多域端到端对话系统平台github
基于最新版本rasa搭建的对话系统github
基于金融-司法领域(兼有闲聊性质)的聊天机器人github
端到端的封闭域对话系统github
MiningZhiDaoQACorpus580万百度知道问答数据挖掘项目,百度知道问答语料库,包括超过580万的问题,每个问题带有问题标签。基于该问答语料库,可支持多种应用,如逻辑挖掘github
用于中文闲聊的GPT2模型GPT2-chitchatgithub
基于检索聊天机器人多轮响应选择相关资源列表(Leaderboards、Datasets、Papers)github
微软对话机器人框架github
chatbot-list行业内关于智能客服、聊天机器人的应用和架构、算法分享和介绍github
Chinese medical dialogue data 中文医疗对话数据集github
一个大规模医疗对话数据集包含110万医学咨询,400万条医患对话github
大规模跨领域中文任务导向多轮对话数据集及模型CrossWOZpaper & data
开源对话式信息搜索平台github
情境互动多模态对话挑战2020(DSTC9 2020)github
用Quora问题对训练的T5问题意译(Paraphrase)github
Google发布Taskmaster-2自然语言任务对话数据集github
Haystack灵活、强大的可扩展问答(QA)框架github
端到端的封闭域对话系统github
Amazon发布基于知识的人-人开放领域对话数据集github
基于百度webqa与dureader数据集训练的Albert Large QA模型github
CommonsenseQA面向常识的英文QA挑战link
MedQuAD(英文)医学问答数据集github
基于Albert、Electra,用维基百科文本作为上下文的问答引擎github
基于14W歌曲知识库的问答尝试功能包括歌词接龙,已知歌词找歌曲以及歌曲歌手歌词三角关系的问答github

文本纠错

资源名(Name)描述(Description)链接
中文文本纠错模块代码github
英文拼写检查库github
python拼写检查库github
GitHub Typo Corpus大规模GitHub多语言拼写错误/语法错误数据集github
BertPunc基于BERT的最先进标点修复模型github
中文写作校对工具github
文本纠错文献列表Chinese Spell Checking (CSC) and Grammatical Error Correction (GEC)github
文本智能校对大赛冠军方案已落地应用,来自苏州大学、达摩院团队link

多模态

资源名(Name)描述(Description)链接
中文多模态数据集「悟空」华为诺亚方舟实验室开源大型,包含1亿图文对github
中文图文表征预训练模型Chinese-CLIP中文版本CLIP预训练模型,开源多个模型规模,几行代码搞定中文图文表征提取 & 图文检索github

语音处理

资源名(Name)描述(Description)链接
ASR 语音数据集 + 基于深度学习的中文语音识别系统github
清华大学THCHS30中文语音数据集data_thchs30tgz-OpenSLR国内镜像
data_thchs30tgz
test-noisetgz-OpenSLR国内镜像test-noisetgz
resourcetgz-OpenSLR国内镜像
resourcetgz
Free ST Chinese Mandarin Corpus
Free ST Chinese Mandarin Corpus
AIShell-1 开源版数据集-OpenSLR国内镜像
AIShell-1 开源版数据集
Primewords Chinese Corpus Set 1-OpenSLR国内镜像
Primewords Chinese Corpus Set 1
笑声检测器github
Common Voice语音识别数据集新版包括来自42,000名贡献者超过1,400小时的语音样本,涵githublink
speech-aligner从“人声语音”及其“语言文本”,产生音素级别时间对齐标注的工具github
ASR语音大辞典/词典github
语音情感分析github
masr中文语音识别,提供预训练模型,高识别率github
面向语音识别的中文文本规范化github
语音质量评价指标(MOSNet, BSSEval, STOI, PESQ, SRMR)github
面向语音识别的中文/英文发音辞典github
CoVoSTFacebook发布的多语种语音-文本翻译语料库包括11种语言(法语、德语、荷兰语、俄语、西班牙语、意大利语、土耳其语、波斯语、瑞典语、蒙古语和中文)的语音、文字转录及英文译文github
Parakeet基于PaddlePaddle的文本-语音合成github
(Java)准确的语音自然语言检测库github
CoVoSTFacebook发布的多语种语音-文本翻译语料库github
TensorFlow 2 实现的文本语音合成github
Python音频特征提取包github
ViSQOL音频质量感知客观、完整参考指标,分音频、语音两种模式github
zhrtvc好用的中文语音克隆兼中文语音合成系统github
aukit好用的语音处理工具箱,包含语音降噪、音频格式转换、特征频谱生成等模块github
phkit好用的音素处理工具箱,包含中文音素、英文音素、文本转拼音、文本正则化等模块github
zhvoice中文语音语料,语音更加清晰自然,包含8个开源数据集,3200个说话人,900小时语音,1300万字github
audio面向语音行为检测、二值化、说话人识别、自动语音识别、情感识别等任务的音频标注工具github
深度学习情感文本语音合成github
Python音频数据增广库github
基于大规模音频数据集Audioset的音频增强github
语声迁移github

文档处理

资源名(Name)描述(Description)链接
LayoutLM-v3文档理解模型github
PyLaia面向手写文档分析的深度学习工具包github
单文档非监督的关键词抽取github
DocSearch免费文档搜索引擎github
fdfgen能够自动创建pdf文档,并填写信息link
pdfx自动抽取出引用参考文献,并下载对应的pdf文件link
invoice2data发票pdf信息抽取invoice2data
pdf文档信息抽取github
PDFMinerPDFMiner能获取页面中文本的准确位置,以及字体或行等其他信息。它还有一个PDF转换器,可以将PDF文件转换成其他文本格式(如HTML)。还有一个可扩展的解析器PDF,可以用于文本分析以外的其他用途。link
PyPDF2PyPDF 2是一个python PDF库,能够分割、合并、裁剪和转换PDF文件的页面。它还可以向PDF文件中添加自定义数据、查看选项和密码。它可以从PDF检索文本和元数据,还可以将整个文件合并在一起。link
PyPDF2PyPDF 2是一个python PDF库,能够分割、合并、裁剪和转换PDF文件的页面。它还可以向PDF文件中添加自定义数据、查看选项和密码。它可以从PDF检索文本和元数据,还可以将整个文件合并在一起。link
ReportLabReportLab能快速创建PDF 文档。经过时间证明的、超好用的开源项目,用于创建复杂的、数据驱动的PDF文档和自定义矢量图形。它是免费的,开源的,用Python编写的。该软件包每月下载5万多次,是标准Linux发行版的一部分,嵌入到许多产品中,并被选中为Wikipedia的打印/导出功能提供动力。link
SIMPdfPython写的简单PDF文件文字编辑器github
pdf-diffPDF文件diff工具 可显示两个pdf文档的差别github

表格处理

资源名(Name)描述(Description)链接
用unet实现对文档表格的自动检测,表格重建github
pdftabextract用于OCR识别后的表格信息解析,很强大link
tabula-py直接将pdf中的表格信息转换为pandas的dataframe,有java和python两种版本代码
camelotpdf表格解析link
pdfplumberpdf表格解析
PubLayNet能够划分段落、识别表格、图片link
从论文中提取表格数据github
用BERT在表格中寻找答案github
表格问答的系列文章简介
模型
完结篇
使用GAN生成表格数据(仅支持英文)github
carefree-learn(PyTorch)表格数据集自动化机器学习(AutoML)包github
封闭域微调表格检测github
PDF表格数据提取工具github
TaBERT理解表格数据查询的新模型paper
表格处理Awesome-Table-Recognitiongithub

文本匹配

资源名(Name)描述(Description)链接
句子、QA相似度匹配MatchZoo文本相似度匹配算法的集合,包含多个深度学习的方法,值得尝试。github
中文问题句子相似度计算比赛及方案汇总github
similarity相似度计算工具包java编写,用于词语、短语、句子、词法分析、情感分析、语义分析等相关的相似度计算github
中文词语相似度计算方法综合了同义词词林扩展版与知网(Hownet)的词语相似度计算方法,词汇覆盖更多、结果更准确。gihtub
Python字符串相似性算法库github
基于Siamese bilstm模型的相似句子判定模型,提供训练数据集和测试数据集提供了10万个训练样本github

文本数据增强

资源名(Name)描述(Description)链接
中文NLP数据增强(EDA)工具github
英文NLP数据增强工具github
一键中文数据增强工具github
数据增强在机器翻译及其他nlp任务中的应用及效果link
NLP数据增广资源集github

常用正则表达式

资源名(Name)描述(Description)链接
抽取email的正则表达式已集成到 python package cocoNLP中,欢迎试用
抽取phone_number已集成到 python package cocoNLP中,欢迎试用
抽取身份证号的正则表达式IDCards_pattern = r’^([1-9]\d{5}[12]\d{3}(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])\d{3}[0-9xX])
IDs = re.findall(IDCards_pattern, text, flags=0)
IP地址正则表达式(25[0-5]| 2[0-4]\d| [0-1]\d{2}| [1-9]?\d).(25[0-5]| 2[0-4]\d| [0-1]\d{2}| [1-9]?\d).(25[0-5]| 2[0-4]\d| [0-1]\d{2}| [1-9]?\d).(25[0-5]| 2[0-4]\d| [0-1]\d{2}| [1-9]?\d)
腾讯QQ号正则表达式[1-9]([0-9]{5,11})
国内固话号码正则表达式[0-9-()()]{7,18}
用户名正则表达式[A-Za-z0-9_-\u4e00-\u9fa5]+
国内电话号码正则匹配(三大运营商+虚拟等)github
正则表达式教程github

文本检索

资源名(Name)描述(Description)链接
高效模糊搜索工具github
面向各语种/任务的BERT模型大列表/搜索引擎link
Deepmatch针对推荐、广告和搜索的深度匹配模型库github
wwsearch是企业微信后台自研的全文检索引擎github
aili – the fastest in-memory index in the East 东半球最快并发索引github
高效的字符串匹配工具 RapidFuzza fast string matching library for Python and C++, which is using the string similarity calculations from FuzzyWuzzygithub

阅读理解

资源名(Name)描述(Description)链接
高效模糊搜索工具github
面向各语种/任务的BERT模型大列表/搜索引擎link
Deepmatch针对推荐、广告和搜索的深度匹配模型库github
allennlp阅读理解支持多种数据和模github

情感分析

资源名(Name)描述(Description)链接
方面情感分析包github
awesome-nlp-sentiment-analysis情感分析、情绪原因识别、评价对象和评价词抽取github
情感分析技术让智能客服更懂人类情感github

事件抽取

资源名(Name)描述(Description)链接
中文事件抽取github
NLP事件提取文献资源列表github
PyTorch实现的BERT事件抽取(ACE 2005 corpus)github
新闻事件线索抽取github

机器翻译

资源名(Name)描述(Description)链接
无道词典有道词典的命令行版本,支持英汉互查和在线查询github
NLLB支持200+种语言任意互译的语言模型NLLBlink
Easy-Translate在本地翻译大文本文件的脚本,基于Facebook/Meta AI的 M2M100模型和NLLB200模型,支持200+种语言github

数字转换

资源名(Name)描述(Description)链接
最好的汉字数字(中文数字)-阿拉伯数字转换工具github
快速转化「中文数字」和「阿拉伯数字」github
将自然语言数字串解析转换为整数和浮点数github

指代消解

资源名(Name)描述(Description)链接
中文指代消解数据github
baidu ink code a0qq

文本聚类

资源名(Name)描述(Description)链接
TextCluster短文本聚类预处理模块 Short text clustergithub

文本分类

资源名(Name)描述(Description)链接
NeuralNLP-NeuralClassifier腾讯开源深度学习文本分类工具github

知识推理

资源名(Name)描述(Description)链接
GraphbrainAI开源软件库和科研工具,目的是促进自动意义提取和文本理解以及知识的探索和推断github
(哈佛)讲因果推理的免费书pdf

可解释自然语言处理

资源名(Name)描述(Description)链接
文本机器学习模型最先进解释器库github

文本攻击

资源名(Name)描述(Description)链接
TextAttack自然语言处理模型对抗性攻击框架github
OpenBackdoor: 文本后门攻防工具包OpenBackdoor基于Python和PyTorch开发,可用于复现、评估和开发文本后门攻防的相关算法github

文本可视化

资源名(Name)描述(Description)链接
Scattertext 文本可视化(python)github
whatlies词向量交互可视化spacy工具
PySS3面向可解释AI的SS3文本分类器机器可视化工具github
用记事本渲染3D图像github
attnvisGPT2、BERT等transformer语言模型注意力交互可视化github
Texthero文本数据高效处理包包括预处理、关键词提取、命名实体识别、向量空间分析、文本可视化等github

文本标注工具

资源名(Name)描述(Description)链接
NLP标注平台综述github
brat rapid annotation tool 序列标注工具link
Poplar网页版自然语言标注工具github
LIDA轻量交互式对话标注工具github
doccano基于网页的开源协同多语言文本标注工具github
Datasaurai 在线数据标注工作流管理工具link

语言检测

资源名(Name)描述(Description)链接
langid97种语言检测https://github.com/saffsd/langid.py
langdetect语言检测https://code.google.com/archive/p/language-detection/

综合工具

资源名(Name)描述(Description)链接
jiebajieba
hanlphanlp
nlp4han中文自然语言处理工具集(断句/分词/词性标注/组块/句法分析/语义分析/NER/N元语法/HMM/代词消解/情感分析/拼写检github
仇恨言论检测进展link
基于Pytorch的Bert应用包括命名实体识别、情感分析、文本分类以及文本相似度等github
nlp4han中文自然语言处理工具集断句/分词/词性标注/组块/句法分析/语义分析/NER/N元语法/HMM/代词消解/情感分析/拼写检查github
一些关于自然语言的基本模型github
用BERT进行序列标记和文本分类的模板代码github
jieba_fast 加速版的jiebagithub
StanfordNLP纯Python版自然语言处理包link
Python口语自然语言处理工具集(英文)github
PreNLP自然语言预处理库github
nlp相关的一些论文及代码包括主题模型、词向量(Word Embedding)、命名实体识别(NER)、文本分类(Text Classificatin)、文本生成(Text Generation)、文本相似性(Text Similarity)计算等,涉及到各种与nlp相关的算法,基于keras和tensorflowgithub
Python文本挖掘/NLP实战示例github
Forte灵活强大的自然语言处理pipeline工具集github
stanza斯坦福团队NLP工具可处理六十多种语言github
Fancy-NLP用于建设商品画像的文本知识挖掘工具github
全面简便的中文 NLP 工具包github
工业界常用基于DSSM向量化召回pipeline复现github
Texthero文本数据高效处理包包括预处理、关键词提取、命名实体识别、向量空间分析、文本可视化等github
nlpgnn图神经网络自然语言处理工具箱github
Macadam以Tensorflow(Keras)和bert4keras为基础,专注于文本分类、序列标注和关系抽取的自然语言处理工具包github
LineFlow面向所有深度学习框架的NLP数据高效加载器github
Arabica:Python文本数据探索性分析工具包github
Python 压力测试工具:SMSBoomgithub

有趣搞笑工具

资源名(Name)描述(Description)链接
汪峰歌词生成器phunterlau/wangfeng-rnn
女友 情感波动分析github
NLP太难了系列github
变量命名神器github link
图片文字去除,可用于漫画翻译github
CoupletAI – 对联生成基于CNN+Bi-LSTM+Attention 的自动对对联系统github
用神经网络符号推理求解复杂数学方程github
基于14W歌曲知识库的问答机器人功能包括歌词接龙,已知歌词找歌曲以及歌曲歌手歌词三角关系的问答github
COPE – 格律诗编辑程序github
Paper2GUI一款面向普通人的AI桌面APP工具箱,免安装即开即用,已支持18+AI模型,内容涵盖语音合成、视频补帧、视频超分、目标检测、图片风格化、OCR识别等领域github
礼貌程度估算器(使用新浪微博数据训练)github paper
草蟒(Python 中文版)入门指南中文编程语言homepage gitee

课程报告面试等

资源名(Name)描述(Description)链接
自然语言处理报告link
知识图谱报告link
数据挖掘报告link
自动驾驶报告link
机器翻译报告link
区块链报告link
机器人报告link
计算机图形学报告link
3D打印报告link
人脸识别报告link
人工智能芯片报告link
cs224n深度学习自然语言处理课程link 课程中模型的pytorch实现 link
面向深度学习研究人员的自然语言处理实例教程github
《Natural Language Processing》by Jacob Eisensteingithub
ML-NLP机器学习(Machine Learning)、NLP面试中常考到的知识点和代码实现github
NLP任务示例项目代码集github
2019年NLP亮点回顾download
nlp-recipes微软出品–自然语言处理最佳实践和范例github
面向深度学习研究人员的自然语言处理实例教程github
Transfer Learning in Natural Language Processing (NLP)youtube
《机器学习系统》图书link github

比赛

资源名(Name)描述(Description)链接
NLPer-ArsenalNLP竞赛,含当前赛事信息、过往竞赛方案等,持续更新中github
复盘所有NLP比赛的TOP方案github
2019年百度的三元组抽取比赛,“科学空间队”源码(第7名)github

金融自然语言处理

资源名(Name)描述(Description)链接
BDCI2019金融负面信息判定github
开源的金融投资数据提取工具github
金融领域自然语言处理研究资源大列表github
基于金融-司法领域(兼有闲聊性质)的聊天机器人github
小型金融知识图谱构流程示范github

医疗自然语言处理

资源名(Name)描述(Description)链接
中文医学NLP公开资源整理github
spaCy 医学文本挖掘与信息提取github
构建医疗实体识别的模型包含词典和语料标注,基于pythongithub
基于医疗领域知识图谱的问答系统github 该repo参考了github
Chinese medical dialogue data 中文医疗对话数据集github
一个大规模医疗对话数据集包含110万医学咨询,400万条医患对话github
新冠肺炎相关数据新冠及其他类型肺炎中文医疗对话数据集;清华大学等机构的开放数据源(COVID-19)github
github

法律自然语言处理

资源名(Name)描述(Description)链接
Blackstone面向非结构化法律文本的spaCy pipeline和NLP模型github
法务智能文献资源列表github
基于金融-司法领域(兼有闲聊性质)的聊天机器人github
罪名法务名词及分类模型包含856项罪名知识图谱, 基于280万罪名训练库的罪名预测,基于20W法务问答对的13类问题分类与法律资讯问答功能github
法律NLP相关资源大列表github

文本生成图像

资源名(Name)描述(Description)链接
Dalle-mini根据文本提示生成图片的迷你版DALL·Egithub

其他

资源名(Name)描述(Description)链接
phone中国手机归属地查询ls0f/phone
phone国际手机、电话归属地查询AfterShip/phone
ngender根据名字判断性别observerss/ngender
中文对比英文自然语言处理NLP的区别综述link
各大公司内部里大牛分享的技术文档 PDF 或者 PPTgithub
comparxiv 用于比较arXiv上两提交版本差异的命令pypi
CHAMELEON深度学习新闻推荐系统元架构github
简历自动筛选系统github
Python实现的多种文本可读性评价指标github
作者 east
chatgpt 9月 11,2023

清华开源ChatGPT自动编程ChatDev项目phase.py代码解读

首先,在__init__方法中,初始化了Phase类的一些属性,包括:

  • assistant_role_name:接收对话的角色名称
  • user_role_name:开始对话的角色名称
  • phase_prompt:本阶段的提示内容
  • role_prompts:所有角色的提示内容
  • phase_name:本阶段的名称
  • model_type:模型类型
  • log_filepath:日志文件路径

然后,在chatting方法中,定义了处理对话并生成阶段总结的逻辑。该方法的参数包括:

  • chat_env:全局对话环境,用于员工检测(可以忽略)
  • task_prompt:建立软件的用户查询提示
  • assistant_role_name:接收对话的角色名称
  • user_role_name:开始对话的角色名称
  • phase_prompt:本阶段的提示内容
  • phase_name:本阶段的名称
  • assistant_role_prompt:助手角色的提示内容
  • user_role_prompt:用户角色的提示内容
  • task_type:任务类型
  • need_reflect:是否需要进行自我反思
  • with_task_specify:是否具有任务说明
  • model_type:模型类型
  • placeholders:用于生成阶段提示的占位符
  • chat_turn_limit:每次对话的最大轮数

在该方法中,首先检查必要的参数,并初始化角色扮演的会话role_play_session。

接下来,开始对话,并处理多轮对话。通过调用role_play_session.step方法进行助手和用户之间的交互,并记录对话细节。

然后,根据对话的结果判断是否生成了阶段总结。如果助手或用户的回复消息具有特殊的”<INFO>”标记,则将该回复作为阶段总结。否则,将助手最后的回复消息作为阶段总结。

解析self_reflection方法的作用和注释:

  • 这个方法用于执行角色扮演会话的自省阶段。
  • 参数列表:
    • task_prompt:构建软件的用户查询提示
    • role_play_session:需要自省的角色扮演会话
    • phase_name:需要自省的聊天阶段的名称
    • chat_env:全局聊天环境
  • 返回值:
    • reflected_content:字符串,自省结果
  • 方法内部逻辑:
    • 首先,通过比较用户和助手存储的消息数量,确定要用于自省的消息列表。
    • 然后,将消息列表中的每条消息格式化为 “角色名: 内容” 的形式,并使用换行符连接起来。
    • 根据不同的聊天阶段名称,设置相应的问题。
    • 调用 self.chatting 方法执行聊天,得到自省结果。
    • 最后,根据阶段名称返回相应的结果,如果是 “recruiting” 阶段,则根据结果回答 “Yes” 或 “No”。

接下来是两个抽象方法 update_phase_env 和 update_chat_env,这两个方法在这里只是简单的定义了函数体,需要在自定义的聊天阶段中实现具体逻辑。

最后是 execute 方法:

  • 这个方法用于执行聊天阶段。
  • 参数列表:
    • chat_env:全局聊天环境
    • chat_turn_limit:每个聊天中的轮次限制
    • need_reflect:是否需要自省的标志
  • 返回值:
    • chat_env:使用本阶段执行结果更新的全局聊天环境
  • 方法内部逻辑:
    • 调用 update_phase_env 方法更新阶段环境。
    • 调用 self.chatting 方法执行聊天,并将结果保存到 self.seminar_conclusion。
    • 调用 update_chat_env 方法更新全局聊天环境。
    • 返回更新后的全局聊天环境。

首先是DemandAnalysis类:

  • 这个类继承自 Phase 类,并实现了 update_phase_env 和 update_chat_env 两个抽象方法。
  • 在 update_chat_env 方法中,如果 self.seminar_conclusion 非空,则从中提取出 <INFO> 标记后的内容,并将其转换为小写形式并去除句号和空格。然后将该内容保存到 chat_env 的环境字典中的 modality 键对应的值中。
  • 最后,返回更新后的 chat_env。

接下来是LanguageChoose类:

  • 这个类同样继承自 Phase 类,并实现了 update_phase_env 和 update_chat_env 两个抽象方法。
  • 在 update_phase_env 方法中,使用 chat_env 的环境字典中的一些值更新 self.phase_env 字典。
  • 在 update_chat_env 方法中,首先判断 self.seminar_conclusion 是否非空,且其中是否包含 <INFO> 标记。
    • 如果是,则从 self.seminar_conclusion 中提取出 <INFO> 标记后的内容,并将其转换为小写形式并去除句号和空格。然后将该内容保存到 chat_env 的环境字典中的 language 键对应的值中。
    • 如果不是,则判断 self.seminar_conclusion 是否非空,如果是,则直接将其保存到 chat_env 的环境字典中的 language 键对应的值中。
    • 如果都不满足上述条件,则将 language 设置为 “Python”。
  • 最后,返回更新后的 chat_env。

然后是Coding类和ArtDesign类,它们的实现逻辑与上述两个类类似,都继承自 Phase 类,并分别实现了 update_phase_env 和 update_chat_env 两个抽象方法。这里略过具体内容的解释,可根据注释进行理解。

这些阶段类都用于更新聊天环境的阶段信息,从用户和助手的对话中提取有关任务、语言选择、代码和艺术设计等方面的信息,并将其保存到聊天环境的环境字典中。

  • ArtIntegration阶段类:该类用于将chat_env中的环境信息更新到phase_env中,主要更新了任务、语言、代码以及图像等信息。
  • CodeComplete阶段类:该类也是将chat_env中的环境信息更新到phase_env中,更新了任务、模态、观点、语言、代码以及未实现的文件等信息。其中,还检查是否有未实现的文件,如果有且尝试次数未超过最大次数,则记录下该文件名,并更新计数器。
  • CodeReviewComment阶段类:同样将chat_env中的环境信息更新到phase_env中,更新了任务、模态、观点、语言、代码以及图像等信息。
  • CodeReviewModification阶段类:将chat_env中的环境信息更新到phase_env中,更新了任务、模态、观点、语言、代码以及评论等信息。如果评论中包含代码块标识”“`”,则更新chat_env中的代码,并重新生成代码。
  • CodeReviewHuman阶段类:该阶段需要人工介入,通过输入提供反馈意见。将chat_env中的环境信息更新到phase_env中,更新了任务、模态、观点、语言、代码以及评论等信息。

这部分代码是ChatDev开源项目中的一些阶段(Phase)类。每个阶段类都是一个用于处理对话环境(chat_env)的特定阶段,它们分别为TestErrorSummary、TestModification、EnvironmentDoc和Manual。

首先,让我们逐个解析每个阶段类的作用和注释:

  1. TestErrorSummary:
    • 作用:处理软件测试中的错误摘要阶段,生成测试报告,并根据报告中的错误信息执行相应的修复操作。
    • 添加注释:
      • update_phase_env():更新阶段环境,将测试报告、任务提示、模态、构想、编程语言和源代码等信息存储在阶段环境中。
      • update_chat_env():更新对话环境,将错误摘要和测试报告存储在对话环境的环境字典中。
      • execute():执行阶段任务,更新阶段环境和对话环境,并返回更新后的对话环境。
  2. TestModification:
    • 作用:处理软件修改阶段,根据讨论的结果,更新源代码,并生成新的代码版本。
    • 添加注释:
      • update_phase_env():更新阶段环境,将任务提示、模态、构想、编程语言、测试报告、错误摘要和源代码等信息存储在阶段环境中。
      • update_chat_env():更新对话环境,根据讨论结果更新源代码,并重新生成代码。
  3. EnvironmentDoc:
    • 作用:处理环境文档阶段,更新项目的需求文档,并根据讨论结果生成新的文档版本。
    • 添加注释:
      • update_phase_env():更新阶段环境,将任务提示、模态、构想、编程语言和源代码等信息存储在阶段环境中。
      • update_chat_env():更新对话环境,根据讨论结果更新需求文档,并重新生成文档。
  4. Manual:
    • 作用:处理操作手册阶段,更新项目的操作手册,并根据讨论结果生成新的手册版本。
    • 添加注释:
      • update_phase_env():更新阶段环境,将任务提示、模态、构想、编程语言、源代码和需求文档等信息存储在阶段环境中。
      • update_chat_env():更新对话环境,根据讨论结果更新操作手册,并重新生成手册。

每个阶段类都实现了update_phase_env()和update_chat_env()方法来更新阶段环境和对话环境。同时,它们还实现了execute()方法来执行特定的阶段任务并返回更新后的对话环境。

源代码如下:

import os
import re
from abc import ABC, abstractmethod

from camel.agents import RolePlaying
from camel.messages import ChatMessage
from camel.typing import TaskType, ModelType
from chatdev.chat_env import ChatEnv
from chatdev.statistics import get_info
from chatdev.utils import log_and_print_online, log_arguments


class Phase(ABC):

    def __init__(self,
                 assistant_role_name,
                 user_role_name,
                 phase_prompt,
                 role_prompts,
                 phase_name,
                 model_type,
                 log_filepath):
        """

        Args:
            assistant_role_name: who receives chat in a phase
            user_role_name: who starts the chat in a phase
            phase_prompt: prompt of this phase
            role_prompts: prompts of all roles
            phase_name: name of this phase
        """
        self.seminar_conclusion = None
        self.assistant_role_name = assistant_role_name
        self.user_role_name = user_role_name
        self.phase_prompt = phase_prompt
        self.phase_env = dict()
        self.phase_name = phase_name
        self.assistant_role_prompt = role_prompts[assistant_role_name]
        self.user_role_prompt = role_prompts[user_role_name]
        self.ceo_prompt = role_prompts["Chief Executive Officer"]
        self.counselor_prompt = role_prompts["Counselor"]
        self.timeout_seconds = 1.0
        self.max_retries = 3
        self.reflection_prompt = """Here is a conversation between two roles: {conversations} {question}"""
        self.model_type = model_type
        self.log_filepath = log_filepath

    @log_arguments
    def chatting(
            self,
            chat_env,
            task_prompt: str,
            assistant_role_name: str,
            user_role_name: str,
            phase_prompt: str,
            phase_name: str,
            assistant_role_prompt: str,
            user_role_prompt: str,
            task_type=TaskType.CHATDEV,
            need_reflect=False,
            with_task_specify=False,
            model_type=ModelType.GPT_3_5_TURBO,
            placeholders=None,
            chat_turn_limit=10
    ) -> str:
        """

        Args:
            chat_env: global chatchain environment TODO: only for employee detection, can be deleted
            task_prompt: user query prompt for building the software
            assistant_role_name: who receives the chat
            user_role_name: who starts the chat
            phase_prompt: prompt of the phase
            phase_name: name of the phase
            assistant_role_prompt: prompt of assistant role
            user_role_prompt: prompt of user role
            task_type: task type
            need_reflect: flag for checking reflection
            with_task_specify: with task specify
            model_type: model type
            placeholders: placeholders for phase environment to generate phase prompt
            chat_turn_limit: turn limits in each chat

        Returns:

        """

        if placeholders is None:
            placeholders = {}
        assert 1 <= chat_turn_limit <= 100

        if not chat_env.exist_employee(assistant_role_name):
            raise ValueError(f"{assistant_role_name} not recruited in ChatEnv.")
        if not chat_env.exist_employee(user_role_name):
            raise ValueError(f"{user_role_name} not recruited in ChatEnv.")

        # init role play
        role_play_session = RolePlaying(
            assistant_role_name=assistant_role_name,
            user_role_name=user_role_name,
            assistant_role_prompt=assistant_role_prompt,
            user_role_prompt=user_role_prompt,
            task_prompt=task_prompt,
            task_type=task_type,
            with_task_specify=with_task_specify,
            model_type=model_type,
        )

        # log_and_print_online("System", role_play_session.assistant_sys_msg)
        # log_and_print_online("System", role_play_session.user_sys_msg)

        # start the chat
        _, input_user_msg = role_play_session.init_chat(None, placeholders, phase_prompt)
        seminar_conclusion = None

        # handle chats
        # the purpose of the chatting in one phase is to get a seminar conclusion
        # there are two types of conclusion
        # 1. with "<INFO>" mark
        # 1.1 get seminar conclusion flag (ChatAgent.info) from assistant or user role, which means there exist special "<INFO>" mark in the conversation
        # 1.2 add "<INFO>" to the reflected content of the chat (which may be terminated chat without "<INFO>" mark)
        # 2. without "<INFO>" mark, which means the chat is terminated or normally ended without generating a marked conclusion, and there is no need to reflect
        for i in range(chat_turn_limit):
            # start the chat, we represent the user and send msg to assistant
            # 1. so the input_user_msg should be assistant_role_prompt + phase_prompt
            # 2. then input_user_msg send to LLM and get assistant_response
            # 3. now we represent the assistant and send msg to user, so the input_assistant_msg is user_role_prompt + assistant_response
            # 4. then input_assistant_msg send to LLM and get user_response
            # all above are done in role_play_session.step, which contains two interactions with LLM
            # the first interaction is logged in role_play_session.init_chat
            assistant_response, user_response = role_play_session.step(input_user_msg, chat_turn_limit == 1)

            conversation_meta = "**" + assistant_role_name + "<->" + user_role_name + " on : " + str(
                phase_name) + ", turn " + str(i) + "**\n\n"

            # TODO: max_tokens_exceeded errors here
            if isinstance(assistant_response.msg, ChatMessage):
                # we log the second interaction here
                log_and_print_online(role_play_session.assistant_agent.role_name,
                                     conversation_meta + "[" + role_play_session.user_agent.system_message.content + "]\n\n" + assistant_response.msg.content)
                if role_play_session.assistant_agent.info:
                    seminar_conclusion = assistant_response.msg.content
                    break
                if assistant_response.terminated:
                    break

            if isinstance(user_response.msg, ChatMessage):
                # here is the result of the second interaction, which may be used to start the next chat turn
                log_and_print_online(role_play_session.user_agent.role_name,
                                     conversation_meta + "[" + role_play_session.assistant_agent.system_message.content + "]\n\n" + user_response.msg.content)
                if role_play_session.user_agent.info:
                    seminar_conclusion = user_response.msg.content
                    break
                if user_response.terminated:
                    break

            # continue the chat
            if chat_turn_limit > 1 and isinstance(user_response.msg, ChatMessage):
                input_user_msg = user_response.msg
            else:
                break

        # conduct self reflection
        if need_reflect:
            if seminar_conclusion in [None, ""]:
                seminar_conclusion = "<INFO> " + self.self_reflection(task_prompt, role_play_session, phase_name,
                                                                      chat_env)
            if "recruiting" in phase_name:
                if "Yes".lower() not in seminar_conclusion.lower() and "No".lower() not in seminar_conclusion.lower():
                    seminar_conclusion = "<INFO> " + self.self_reflection(task_prompt, role_play_session,
                                                                          phase_name,
                                                                          chat_env)
            elif seminar_conclusion in [None, ""]:
                seminar_conclusion = "<INFO> " + self.self_reflection(task_prompt, role_play_session, phase_name,
                                                                      chat_env)
        else:
            seminar_conclusion = assistant_response.msg.content

        log_and_print_online("**[Seminar Conclusion]**:\n\n {}".format(seminar_conclusion))
        seminar_conclusion = seminar_conclusion.split("<INFO>")[-1]
        return seminar_conclusion

    def self_reflection(self,
                        task_prompt: str,
                        role_play_session: RolePlaying,
                        phase_name: str,
                        chat_env: ChatEnv) -> str:
        """

        Args:
            task_prompt: user query prompt for building the software
            role_play_session: role play session from the chat phase which needs reflection
            phase_name: name of the chat phase which needs reflection
            chat_env: global chatchain environment

        Returns:
            reflected_content: str, reflected results

        """
        messages = role_play_session.assistant_agent.stored_messages if len(
            role_play_session.assistant_agent.stored_messages) >= len(
            role_play_session.user_agent.stored_messages) else role_play_session.user_agent.stored_messages
        messages = ["{}: {}".format(message.role_name, message.content.replace("\n\n", "\n")) for message in messages]
        messages = "\n\n".join(messages)

        if "recruiting" in phase_name:
            question = """Answer their final discussed conclusion (Yes or No) in the discussion without any other words, e.g., "Yes" """
        elif phase_name == "DemandAnalysis":
            question = """Answer their final product modality in the discussion without any other words, e.g., "PowerPoint" """
        # elif phase_name in [PhaseType.BRAINSTORMING]:
        #     question = """Conclude three most creative and imaginative brainstorm ideas from the whole discussion, in the format: "1) *; 2) *; 3) *; where '*' represents a suggestion." """
        elif phase_name == "LanguageChoose":
            question = """Conclude the programming language being discussed for software development, in the format: "*" where '*' represents a programming language." """
        elif phase_name == "EnvironmentDoc":
            question = """According to the codes and file format listed above, write a requirements.txt file to specify the dependencies or packages required for the project to run properly." """
        else:
            raise ValueError(f"Reflection of phase {phase_name}: Not Assigned.")

        # Reflections actually is a special phase between CEO and counselor
        # They read the whole chatting history of this phase and give refined conclusion of this phase
        reflected_content = \
            self.chatting(chat_env=chat_env,
                          task_prompt=task_prompt,
                          assistant_role_name="Chief Executive Officer",
                          user_role_name="Counselor",
                          phase_prompt=self.reflection_prompt,
                          phase_name="Reflection",
                          assistant_role_prompt=self.ceo_prompt,
                          user_role_prompt=self.counselor_prompt,
                          placeholders={"conversations": messages, "question": question},
                          need_reflect=False,
                          chat_turn_limit=1,
                          model_type=self.model_type)

        if "recruiting" in phase_name:
            if "Yes".lower() in reflected_content.lower():
                return "Yes"
            return "No"
        else:
            return reflected_content

    @abstractmethod
    def update_phase_env(self, chat_env):
        """
        update self.phase_env (if needed) using chat_env, then the chatting will use self.phase_env to follow the context and fill placeholders in phase prompt
        must be implemented in customized phase
        the usual format is just like:
        ```
            self.phase_env.update({key:chat_env[key]})
        ```
        Args:
            chat_env: global chat chain environment

        Returns: None

        """
        pass

    @abstractmethod
    def update_chat_env(self, chat_env) -> ChatEnv:
        """
        update chan_env based on the results of self.execute, which is self.seminar_conclusion
        must be implemented in customized phase
        the usual format is just like:
        ```
            chat_env.xxx = some_func_for_postprocess(self.seminar_conclusion)
        ```
        Args:
            chat_env:global chat chain environment

        Returns:
            chat_env: updated global chat chain environment

        """
        pass

    def execute(self, chat_env, chat_turn_limit, need_reflect) -> ChatEnv:
        """
        execute the chatting in this phase
        1. receive information from environment: update the phase environment from global environment
        2. execute the chatting
        3. change the environment: update the global environment using the conclusion
        Args:
            chat_env: global chat chain environment
            chat_turn_limit: turn limit in each chat
            need_reflect: flag for reflection

        Returns:
            chat_env: updated global chat chain environment using the conclusion from this phase execution

        """
        self.update_phase_env(chat_env)
        self.seminar_conclusion = \
            self.chatting(chat_env=chat_env,
                          task_prompt=chat_env.env_dict['task_prompt'],
                          need_reflect=need_reflect,
                          assistant_role_name=self.assistant_role_name,
                          user_role_name=self.user_role_name,
                          phase_prompt=self.phase_prompt,
                          phase_name=self.phase_name,
                          assistant_role_prompt=self.assistant_role_prompt,
                          user_role_prompt=self.user_role_prompt,
                          chat_turn_limit=chat_turn_limit,
                          placeholders=self.phase_env,
                          model_type=self.model_type)
        chat_env = self.update_chat_env(chat_env)
        return chat_env


class DemandAnalysis(Phase):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)

    def update_phase_env(self, chat_env):
        pass

    def update_chat_env(self, chat_env) -> ChatEnv:
        if len(self.seminar_conclusion) > 0:
            chat_env.env_dict['modality'] = self.seminar_conclusion.split("<INFO>")[-1].lower().replace(".", "").strip()
        return chat_env


class LanguageChoose(Phase):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)

    def update_phase_env(self, chat_env):
        self.phase_env.update({"task": chat_env.env_dict['task_prompt'],
                               "modality": chat_env.env_dict['modality'],
                               "ideas": chat_env.env_dict['ideas']})

    def update_chat_env(self, chat_env) -> ChatEnv:
        if len(self.seminar_conclusion) > 0 and "<INFO>" in self.seminar_conclusion:
            chat_env.env_dict['language'] = self.seminar_conclusion.split("<INFO>")[-1].lower().replace(".", "").strip()
        elif len(self.seminar_conclusion) > 0:
            chat_env.env_dict['language'] = self.seminar_conclusion
        else:
            chat_env.env_dict['language'] = "Python"
        return chat_env


class Coding(Phase):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)

    def update_phase_env(self, chat_env):
        gui = "" if not chat_env.config.gui_design \
            else "The software should be equipped with graphical user interface (GUI) so that user can visually and graphically use it; so you must choose a GUI framework (e.g., in Python, you can implement GUI via tkinter, Pygame, Flexx, PyGUI, etc,)."
        self.phase_env.update({"task": chat_env.env_dict['task_prompt'],
                               "modality": chat_env.env_dict['modality'],
                               "ideas": chat_env.env_dict['ideas'],
                               "language": chat_env.env_dict['language'],
                               "gui": gui})

    def update_chat_env(self, chat_env) -> ChatEnv:
        chat_env.update_codes(self.seminar_conclusion)
        if len(chat_env.codes.codebooks.keys()) == 0:
            raise ValueError("No Valid Codes.")
        chat_env.rewrite_codes()
        log_and_print_online("**[Software Info]**:\n\n {}".format(get_info(chat_env.env_dict['directory'],self.log_filepath)))
        return chat_env


class ArtDesign(Phase):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)

    def update_phase_env(self, chat_env):
        self.phase_env = {"task": chat_env.env_dict['task_prompt'],
                          "language": chat_env.env_dict['language'],
                          "codes": chat_env.get_codes()}

    def update_chat_env(self, chat_env) -> ChatEnv:
        chat_env.proposed_images = chat_env.get_proposed_images_from_message(self.seminar_conclusion)
        log_and_print_online("**[Software Info]**:\n\n {}".format(get_info(chat_env.env_dict['directory'],self.log_filepath)))
        return chat_env


class ArtIntegration(Phase):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)

    def update_phase_env(self, chat_env):
        self.phase_env = {"task": chat_env.env_dict['task_prompt'],
                          "language": chat_env.env_dict['language'],
                          "codes": chat_env.get_codes(),
                          "images": "\n".join(
                              ["{}: {}".format(filename, chat_env.proposed_images[filename]) for
                               filename in sorted(list(chat_env.proposed_images.keys()))])}

    def update_chat_env(self, chat_env) -> ChatEnv:
        chat_env.update_codes(self.seminar_conclusion)
        chat_env.rewrite_codes()
        # chat_env.generate_images_from_codes()
        log_and_print_online("**[Software Info]**:\n\n {}".format(get_info(chat_env.env_dict['directory'],self.log_filepath)))
        return chat_env


class CodeComplete(Phase):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)

    def update_phase_env(self, chat_env):
        self.phase_env.update({"task": chat_env.env_dict['task_prompt'],
                               "modality": chat_env.env_dict['modality'],
                               "ideas": chat_env.env_dict['ideas'],
                               "language": chat_env.env_dict['language'],
                               "codes": chat_env.get_codes(),
                               "unimplemented_file": ""})
        unimplemented_file = ""
        for filename in self.phase_env['pyfiles']:
            code_content = open(os.path.join(chat_env.env_dict['directory'], filename)).read()
            lines = [line.strip() for line in code_content.split("\n") if line.strip() == "pass"]
            if len(lines) > 0 and self.phase_env['num_tried'][filename] < self.phase_env['max_num_implement']:
                unimplemented_file = filename
                break
        self.phase_env['num_tried'][unimplemented_file] += 1
        self.phase_env['unimplemented_file'] = unimplemented_file

    def update_chat_env(self, chat_env) -> ChatEnv:
        chat_env.update_codes(self.seminar_conclusion)
        if len(chat_env.codes.codebooks.keys()) == 0:
            raise ValueError("No Valid Codes.")
        chat_env.rewrite_codes()
        log_and_print_online("**[Software Info]**:\n\n {}".format(get_info(chat_env.env_dict['directory'],self.log_filepath)))
        return chat_env


class CodeReviewComment(Phase):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)

    def update_phase_env(self, chat_env):
        self.phase_env.update(
            {"task": chat_env.env_dict['task_prompt'],
             "modality": chat_env.env_dict['modality'],
             "ideas": chat_env.env_dict['ideas'],
             "language": chat_env.env_dict['language'],
             "codes": chat_env.get_codes(),
             "images": ", ".join(chat_env.incorporated_images)})

    def update_chat_env(self, chat_env) -> ChatEnv:
        chat_env.env_dict['review_comments'] = self.seminar_conclusion
        return chat_env


class CodeReviewModification(Phase):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)

    def update_phase_env(self, chat_env):
        self.phase_env.update({"task": chat_env.env_dict['task_prompt'],
                               "modality": chat_env.env_dict['modality'],
                               "ideas": chat_env.env_dict['ideas'],
                               "language": chat_env.env_dict['language'],
                               "codes": chat_env.get_codes(),
                               "comments": chat_env.env_dict['review_comments']})

    def update_chat_env(self, chat_env) -> ChatEnv:
        if "```".lower() in self.seminar_conclusion.lower():
            chat_env.update_codes(self.seminar_conclusion)
            chat_env.rewrite_codes()
            log_and_print_online("**[Software Info]**:\n\n {}".format(get_info(chat_env.env_dict['directory'],self.log_filepath)))
        self.phase_env['modification_conclusion'] = self.seminar_conclusion
        return chat_env


class CodeReviewHuman(Phase):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)

    def update_phase_env(self, chat_env):
        print(
            f"You can participate in the development of the software {chat_env.env_dict['task_prompt']}. Please input your feedback. (\"End\" to quit the involvement.)")
        provided_comments = input()
        self.phase_env.update({"task": chat_env.env_dict['task_prompt'],
                               "modality": chat_env.env_dict['modality'],
                               "ideas": chat_env.env_dict['ideas'],
                               "language": chat_env.env_dict['language'],
                               "codes": chat_env.get_codes(),
                               "comments": provided_comments})

    def update_chat_env(self, chat_env) -> ChatEnv:
        if "```".lower() in self.seminar_conclusion.lower():
            chat_env.update_codes(self.seminar_conclusion)
            chat_env.rewrite_codes()
            log_and_print_online("**[Software Info]**:\n\n {}".format(get_info(chat_env.env_dict['directory'],self.log_filepath)))
        return chat_env


class TestErrorSummary(Phase):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)

    def update_phase_env(self, chat_env):
        chat_env.generate_images_from_codes()
        (exist_bugs_flag, test_reports) = chat_env.exist_bugs()
        self.phase_env.update({"task": chat_env.env_dict['task_prompt'],
                               "modality": chat_env.env_dict['modality'],
                               "ideas": chat_env.env_dict['ideas'],
                               "language": chat_env.env_dict['language'],
                               "codes": chat_env.get_codes(),
                               "test_reports": test_reports,
                               "exist_bugs_flag": exist_bugs_flag})
        log_and_print_online("**[Test Reports]**:\n\n{}".format(test_reports))

    def update_chat_env(self, chat_env) -> ChatEnv:
        chat_env.env_dict['error_summary'] = self.seminar_conclusion
        chat_env.env_dict['test_reports'] = self.phase_env['test_reports']

        return chat_env

    def execute(self, chat_env, chat_turn_limit, need_reflect) -> ChatEnv:
        self.update_phase_env(chat_env)
        if "ModuleNotFoundError" in self.phase_env['test_reports']:
            chat_env.fix_module_not_found_error(self.phase_env['test_reports'])
            log_and_print_online(
                f"Software Test Engineer found ModuleNotFoundError:\n{self.phase_env['test_reports']}\n")
            pip_install_content = ""
            for match in re.finditer(r"No module named '(\S+)'", self.phase_env['test_reports'], re.DOTALL):
                module = match.group(1)
                pip_install_content += "{}\n```{}\n{}\n```\n".format("cmd", "bash", f"pip install {module}")
                log_and_print_online(f"Programmer resolve ModuleNotFoundError by:\n{pip_install_content}\n")
            self.seminar_conclusion = "nothing need to do"
        else:
            self.seminar_conclusion = \
                self.chatting(chat_env=chat_env,
                              task_prompt=chat_env.env_dict['task_prompt'],
                              need_reflect=need_reflect,
                              assistant_role_name=self.assistant_role_name,
                              user_role_name=self.user_role_name,
                              phase_prompt=self.phase_prompt,
                              phase_name=self.phase_name,
                              assistant_role_prompt=self.assistant_role_prompt,
                              user_role_prompt=self.user_role_prompt,
                              chat_turn_limit=chat_turn_limit,
                              placeholders=self.phase_env)
        chat_env = self.update_chat_env(chat_env)
        return chat_env


class TestModification(Phase):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)

    def update_phase_env(self, chat_env):
        self.phase_env.update({"task": chat_env.env_dict['task_prompt'],
                               "modality": chat_env.env_dict['modality'],
                               "ideas": chat_env.env_dict['ideas'],
                               "language": chat_env.env_dict['language'],
                               "test_reports": chat_env.env_dict['test_reports'],
                               "error_summary": chat_env.env_dict['error_summary'],
                               "codes": chat_env.get_codes()
                               })

    def update_chat_env(self, chat_env) -> ChatEnv:
        if "```".lower() in self.seminar_conclusion.lower():
            chat_env.update_codes(self.seminar_conclusion)
            chat_env.rewrite_codes()
            log_and_print_online("**[Software Info]**:\n\n {}".format(get_info(chat_env.env_dict['directory'],self.log_filepath)))
        return chat_env


class EnvironmentDoc(Phase):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)

    def update_phase_env(self, chat_env):
        self.phase_env.update({"task": chat_env.env_dict['task_prompt'],
                               "modality": chat_env.env_dict['modality'],
                               "ideas": chat_env.env_dict['ideas'],
                               "language": chat_env.env_dict['language'],
                               "codes": chat_env.get_codes()})

    def update_chat_env(self, chat_env) -> ChatEnv:
        chat_env._update_requirements(self.seminar_conclusion)
        chat_env.rewrite_requirements()
        log_and_print_online("**[Software Info]**:\n\n {}".format(get_info(chat_env.env_dict['directory'],self.log_filepath)))
        return chat_env


class Manual(Phase):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)

    def update_phase_env(self, chat_env):
        self.phase_env.update({"task": chat_env.env_dict['task_prompt'],
                               "modality": chat_env.env_dict['modality'],
                               "ideas": chat_env.env_dict['ideas'],
                               "language": chat_env.env_dict['language'],
                               "codes": chat_env.get_codes(),
                               "requirements": chat_env.get_requirements()})

    def update_chat_env(self, chat_env) -> ChatEnv:
        chat_env._update_manuals(self.seminar_conclusion)
        chat_env.rewrite_manuals()
        return chat_env
作者 east
chatgpt, python 9月 11,2023

清华开源ChatGPT自动编程ChatDev项目chat_chain.py解读

  • ChatChain类是一个用于实现软件开发的多智能体协作系统,它可以根据用户的自然语言描述来创建定制的软件。
  • __init__()方法是类的构造函数,它接受以下几个参数:
    • config_path: 一个字符串,表示ChatChainConfig.json文件的路径,这个文件包含了ChatChain的基本配置信息,例如智能体链、招聘条件、是否清理结构、是否进行头脑风暴等。
    • config_phase_path: 一个字符串,表示PhaseConfig.json文件的路径,这个文件包含了软件开发的各个阶段的配置信息,例如阶段名称、阶段目标、阶段角色、阶段限制等。
    • config_role_path: 一个字符串,表示RoleConfig.json文件的路径,这个文件包含了软件开发的各个角色的配置信息,例如角色名称、角色描述、角色提示等。
    • task_prompt: 一个字符串,表示用户输入的软件想法,例如“我想要一个五子棋游戏”。
    • project_name: 一个字符串,表示用户输入的软件名称,例如“Gomoku”。
    • org_name: 一个字符串,表示用户所属的组织名称,例如“OpenBMB”。
    • model_type: 一个枚举类型,表示使用的大型语言模型(LLM)的类型,例如ModelType.GPT_3_5_TURBO。
  • __init__()方法首先将这些参数保存在类的属性中,然后使用open()函数和json模块来打开和解析这些配置文件,并将配置信息保存在类的属性中。接着它根据配置信息初始化了ChatChain的智能体链和招聘条件,并设置了默认的最大对话轮数为10。然后它根据配置信息创建了一个ChatEnvConfig对象和一个ChatEnv对象,用于管理软件开发的环境和资源。接下来它将用户输入的软件想法保存在类的属性中,并根据配置信息决定是否对其进行自我改进(这个过程在类的preprocess()方法中实现)。然后它根据配置信息创建了一个字典对象self.role_prompts,用于存储各个角色的提示信息。最后它调用类的get_logfilepath()方法来获取日志文件的路径,并将其保存在类的属性中。
  • check_bool()函数是一个辅助函数,用于将字符串转换为布尔值。它接受一个参数s,表示一个字符串。它将s转换为小写,并判断是否等于”true”。如果是,则返回True,否则返回False。
  • get_logfilepath()方法用于获取日志文件的路径,并返回一个元组(start_time, log_filepath),其中start_time表示开始时间,log_filepath表示日志文件路径。这个方法首先使用datetime模块来获取当前时间,并将其格式化为”%Y-%m-%d %H:%M:%S”形式,并赋值给start_time变量。然后它使用os模块来获取当前工作目录,并将其与”logs”和start_time拼接起来,得到log_filepath变量。最后它返回(start_time, log_filepath)元组。
  • make_recruitment()方法用于招聘合适的智能体,并将他们加入到ChatEnv对象中。它遍历配置信息中定义的招聘条件(self.recruitments属性),对于每个条件(即智能体名称),它调用ChatEnv对象的recruit()方法,将智能体名称作为参数传递,表示招聘该智能体。
  • execute_step()方法用于执行单个软件开发阶段,它接受一个参数phase_item,表示配置信息中定义的单个阶段信息。它首先获取阶段的名称、类型等信息,并根据不同的类型来执行不同的操作。如果阶段类型是”SimplePhase”,则表示这是一个简单的阶段,它会从self.phases属性中获取相应的SimplePhase对象,并调用其execute()方法,将ChatEnv对象、最大对话轮数、是否需要反思等参数传递给该方法,并将返回的新的ChatEnv对象赋值给self.chat_env属性。如果阶段类型是”ComposedPhase”,则表示这是一个复合的阶段,它会从self.compose_phase_module模块中获取相应的ComposedPhase类,并创建一个ComposedPhase对象,将阶段名称、循环次数、组成部分、配置信息、模型类型、日志文件路径等参数传递给其构造函数,并将该对象赋值给compose_phase_instance变量。然后它调用compose_phase_instance对象的execute()方法,将ChatEnv对象作为参数传递,并将返回的新的ChatEnv对象赋值给self.chat_env属性。如果阶段类型是其他类型,则抛出一个异常,表示未实现该类型。
  • execute_chain()方法用于执行整个软件开发过程,它遍历配置信息中定义的智能体链(self.chain属性),对于每个阶段信息,它调用execute_step()方法来执行该阶段。
  • get_logfilepath()方法用于获取日志文件的路径,并返回一个元组(start_time, log_filepath),其中start_time表示开始时间,log_filepath表示日志文件路径。这个方法首先使用datetime模块来获取当前时间,并将其格式化为”%Y-%m-%d %H:%M:%S”形式,并赋值给start_time变量。然后它使用os模块来获取当前工作目录,并将其与”logs”和start_time拼接起来,得到log_filepath变量。最后它返回(start_time, log_filepath)元组。
  • pre_processing()方法用于进行预处理,例如删除无用的文件和记录一些全局的配置信息。它不接受任何参数,也不返回任何值。它首先判断ChatEnv对象的配置信息中是否需要清理结构(self.chat_env.config.clear_structure属性),如果是,则使用os模块来遍历WareHouse目录中的所有文件,并删除除了.py和.log以外的文件,并打印出删除的文件路径。然后它获取软件保存的目录(由项目名称、组织名称和开始时间拼接而成),并调用ChatEnv对象的set_directory()方法,将该目录作为参数传递,表示设置该目录为软件目录。接着它使用shutil模块的copy()函数来将配置文件复制到软件目录中,并使用open()函数和write()方法来将用户输入的软件想法写入到软件目录中的一个.prompt文件中。然后它创建一个字符串preprocess_msg,并赋值为”[Preprocessing]\n\n”,表示开始预处理。接着它创建一个ChatGPTConfig对象,并将其赋值给chat_gpt_config变量,表示LLM的配置信息。然后它在preprocess_msg字符串后面追加一些信息,例如开始时间、配置文件路径、软件想法、项目名称、日志文件路径、ChatDevConfig对象、ChatGPTConfig对象等,并使用log_and_print_online()函数来将preprocess_msg字符串记录到日志文件中,并打印出来。最后它判断配置信息中是否需要进行自我改进(self.config[‘self_improve’]属性),如果是,则调用self.self_task_improve()方法,将用户输入的软件想法作为参数传递,并将返回的更完善的想法赋值给self.chat_env.env_dict[‘task_prompt’]属性。如果不是,则直接将用户输入的软件想法赋值给self.chat_env.env_dict[‘task_prompt’]属性。
  • post_processing()方法用于进行后处理,例如总结产出和移动日志文件到软件目录中。它不接受任何参数,也不返回任何值。它首先调用ChatEnv对象的write_meta()方法,用于写入元数据信息到软件目录中。然后它使用os模块来获取当前工作目录,并将其赋值给filepath变量。接着它使用os模块来获取当前工作目录的父目录,并将其赋值给root变量。然后它创建一个字符串post_info,并赋值为”[Post Info]\n\n”,表示开始后处理。接着它使用datetime模块来获取当前时间,并将其格式化为”%Y%m%d%H%M%S”形式,并赋值给now_time变量。然后它使用datetime模块和strptime()函数来将开始时间和当前时间转换为datetime对象,并分别赋值给datetime1和datetime2变量。接着它使用total_seconds()方法来计算两个datetime对象之间的差异,并将其赋值给duration变量,表示软件开发所花费的时间。然后它在post_info字符串后面追加”Software Info: {}“.format(get_info(self.chat_env.env_dict[‘directory’], self.log_filepath) + “\n\n🕑duration={:.2f}s\n\n”.format(duration)),表示显示软件的信息和开发时间。接着它在post_info字符串后面追加”ChatDev Starts ({})”.format(self.start_time) + “\n\n”,表示显示开始时间。最后它在post_info字符串后面追加”ChatDev Ends ({})”.format(now_time) + “\n\n”,表示显示结束时间。
  • 这段代码定义了一个self_task_improve()方法,用于对用户输入的软件想法进行自我改进,让LLM更好地理解这些想法。它接受一个参数task_prompt,表示用户输入的软件想法。它返回一个字符串revised_task_prompt,表示经过改进的软件想法。
  • 这个方法首先创建一个字符串self_task_improve_prompt,并赋值为一段提示信息,表示要求用户将一个简短的软件设计需求重写为一个详细的提示,让LLM能够根据这个提示来更好地制作这个软件。这个提示信息中包含了用户输入的软件想法(task_prompt参数),以及一些注意事项,例如提示的长度、格式等。然后它创建一个RolePlaying对象role_play_session,并将其赋值给role_play_session变量,表示一个角色扮演的会话。它将以下几个参数传递给RolePlaying类的构造函数:
    • assistant_role_name: 一个字符串,表示助理的角色名称,为”Prompt Engineer”。
    • assistant_role_prompt: 一个字符串,表示助理的角色描述,为”You are an professional prompt engineer that can improve user input prompt to make LLM better understand these prompts.”。
    • user_role_prompt: 一个字符串,表示用户的角色描述,为”You are an user that want to use LLM to build software.”。
    • user_role_name: 一个字符串,表示用户的角色名称,为”User”。
    • task_type: 一个枚举类型,表示任务类型,为TaskType.CHATDEV。
    • task_prompt: 一个字符串,表示任务描述,为”Do prompt engineering on user query”。
    • with_task_specify: 一个布尔值,表示是否需要指定任务类型,为False。
    • model_type: 一个枚举类型,表示使用的LLM的类型,为self.model_type属性。
  • 接着它调用role_play_session对象的init_chat()方法,将None、None和self_task_improve_prompt作为参数传递,并将返回的两个值赋值给_和input_user_msg变量。这个方法用于初始化角色扮演的会话,并返回助理和用户的第一轮对话。其中input_user_msg变量表示用户输入的重写后的软件想法。然后它调用role_play_session对象的step()方法,将input_user_msg和True作为参数传递,并将返回的两个值赋值给assistant_response和user_response变量。这个方法用于进行角色扮演的一步对话,并返回助理和用户的回复。其中assistant_response变量表示助理回复的内容。接着它使用split()方法和strip()方法来从助理回复中提取出改进后的软件想法,并将其赋值给revised_task_prompt变量。然后它调用log_and_print_online()函数来记录并打印助理回复的内容。最后它调用log_and_print_online()函数来记录并打印原始和改进后的软件想法,并返回revised_task_prompt变量。

chat_chain.py的源代码如下:

import importlib
import json
import os
import shutil
from datetime import datetime
import logging
import time

from camel.agents import RolePlaying
from camel.configs import ChatGPTConfig
from camel.typing import TaskType, ModelType
from chatdev.chat_env import ChatEnv, ChatEnvConfig
from chatdev.statistics import get_info
from chatdev.utils import log_and_print_online, now


def check_bool(s):
    return s.lower() == "true"


class ChatChain:

    def __init__(self,
                 config_path: str = None,
                 config_phase_path: str = None,
                 config_role_path: str = None,
                 task_prompt: str = None,
                 project_name: str = None,
                 org_name: str = None,
                 model_type: ModelType = ModelType.GPT_3_5_TURBO) -> None:
        """

        Args:
            config_path: path to the ChatChainConfig.json
            config_phase_path: path to the PhaseConfig.json
            config_role_path: path to the RoleConfig.json
            task_prompt: the user input prompt for software
            project_name: the user input name for software
            org_name: the organization name of the human user
        """

        # load config file
        self.config_path = config_path
        self.config_phase_path = config_phase_path
        self.config_role_path = config_role_path
        self.project_name = project_name
        self.org_name = org_name
        self.model_type = model_type

        with open(self.config_path, 'r', encoding="utf8") as file:
            self.config = json.load(file)
        with open(self.config_phase_path, 'r', encoding="utf8") as file:
            self.config_phase = json.load(file)
        with open(self.config_role_path, 'r', encoding="utf8") as file:
            self.config_role = json.load(file)

        # init chatchain config and recruitments
        self.chain = self.config["chain"]
        self.recruitments = self.config["recruitments"]

        # init default max chat turn
        self.chat_turn_limit_default = 10

        # init ChatEnv
        self.chat_env_config = ChatEnvConfig(clear_structure=check_bool(self.config["clear_structure"]),
                                             brainstorming=check_bool(self.config["brainstorming"]),
                                             gui_design=check_bool(self.config["gui_design"]),
                                             git_management=check_bool(self.config["git_management"]))
        self.chat_env = ChatEnv(self.chat_env_config)

        # the user input prompt will be self-improved (if set "self_improve": "True" in ChatChainConfig.json)
        # the self-improvement is done in self.preprocess
        self.task_prompt_raw = task_prompt
        self.task_prompt = ""

        # init role prompts
        self.role_prompts = dict()
        for role in self.config_role:
            self.role_prompts[role] = "\n".join(self.config_role[role])

        # init log
        self.start_time, self.log_filepath = self.get_logfilepath()

        # init SimplePhase instances
        # import all used phases in PhaseConfig.json from chatdev.phase
        # note that in PhaseConfig.json there only exist SimplePhases
        # ComposedPhases are defined in ChatChainConfig.json and will be imported in self.execute_step
        self.compose_phase_module = importlib.import_module("chatdev.composed_phase")
        self.phase_module = importlib.import_module("chatdev.phase")
        self.phases = dict()
        for phase in self.config_phase:
            assistant_role_name = self.config_phase[phase]['assistant_role_name']
            user_role_name = self.config_phase[phase]['user_role_name']
            phase_prompt = "\n\n".join(self.config_phase[phase]['phase_prompt'])
            phase_class = getattr(self.phase_module, phase)
            phase_instance = phase_class(assistant_role_name=assistant_role_name,
                                         user_role_name=user_role_name,
                                         phase_prompt=phase_prompt,
                                         role_prompts=self.role_prompts,
                                         phase_name=phase,
                                         model_type=self.model_type,
                                         log_filepath=self.log_filepath)
            self.phases[phase] = phase_instance



    def make_recruitment(self):
        """
        recruit all employees
        Returns: None

        """
        for employee in self.recruitments:
            self.chat_env.recruit(agent_name=employee)

    def execute_step(self, phase_item: dict):
        """
        execute single phase in the chain
        Args:
            phase_item: single phase configuration in the ChatChainConfig.json

        Returns:

        """

        phase = phase_item['phase']
        phase_type = phase_item['phaseType']
        # For SimplePhase, just look it up from self.phases and conduct the "Phase.execute" method
        if phase_type == "SimplePhase":
            max_turn_step = phase_item['max_turn_step']
            need_reflect = check_bool(phase_item['need_reflect'])
            if phase in self.phases:
                self.chat_env = self.phases[phase].execute(self.chat_env,
                                                           self.chat_turn_limit_default if max_turn_step <= 0 else max_turn_step,
                                                           need_reflect)
            else:
                raise RuntimeError(f"Phase '{phase}' is not yet implemented in chatdev.phase")
        # For ComposedPhase, we create instance here then conduct the "ComposedPhase.execute" method
        elif phase_type == "ComposedPhase":
            cycle_num = phase_item['cycleNum']
            composition = phase_item['Composition']
            compose_phase_class = getattr(self.compose_phase_module, phase)
            if not compose_phase_class:
                raise RuntimeError(f"Phase '{phase}' is not yet implemented in chatdev.compose_phase")
            compose_phase_instance = compose_phase_class(phase_name=phase,
                                                         cycle_num=cycle_num,
                                                         composition=composition,
                                                         config_phase=self.config_phase,
                                                         config_role=self.config_role,
                                                         model_type=self.model_type,
                                                         log_filepath=self.log_filepath)
            self.chat_env = compose_phase_instance.execute(self.chat_env)
        else:
            raise RuntimeError(f"PhaseType '{phase_type}' is not yet implemented.")

    def execute_chain(self):
        """
        execute the whole chain based on ChatChainConfig.json
        Returns: None

        """
        for phase_item in self.chain:
            self.execute_step(phase_item)

    def get_logfilepath(self):
        """
        get the log path (under the software path)
        Returns:
            start_time: time for starting making the software
            log_filepath: path to the log

        """
        start_time = now()
        filepath = os.path.dirname(__file__)
        # root = "/".join(filepath.split("/")[:-1])
        root = os.path.dirname(filepath)
        # directory = root + "/WareHouse/"
        directory = os.path.join(root, "WareHouse")
        log_filepath = os.path.join(directory, "{}.log".format("_".join([self.project_name, self.org_name,start_time])))
        return start_time, log_filepath

    def pre_processing(self):
        """
        remove useless files and log some global config settings
        Returns: None

        """
        if self.chat_env.config.clear_structure:
            filepath = os.path.dirname(__file__)
            # root = "/".join(filepath.split("/")[:-1])
            root = os.path.dirname(filepath)
            # directory = root + "/WareHouse"
            directory = os.path.join(root, "WareHouse")
            for filename in os.listdir(directory):
                file_path = os.path.join(directory, filename)
                # logs with error trials are left in WareHouse/
                if os.path.isfile(file_path) and not filename.endswith(".py") and not filename.endswith(".log"):
                    os.remove(file_path)
                    print("{} Removed.".format(file_path))

        software_path = os.path.join(directory, "_".join([self.project_name, self.org_name, self.start_time]))
        self.chat_env.set_directory(software_path)

        # copy config files to software path
        shutil.copy(self.config_path, software_path)
        shutil.copy(self.config_phase_path, software_path)
        shutil.copy(self.config_role_path, software_path)

        # write task prompt to software path
        with open(os.path.join(software_path, self.project_name + ".prompt"), "w") as f:
            f.write(self.task_prompt_raw)

        preprocess_msg = "**[Preprocessing]**\n\n"
        chat_gpt_config = ChatGPTConfig()

        preprocess_msg += "**ChatDev Starts** ({})\n\n".format(self.start_time)
        preprocess_msg += "**Timestamp**: {}\n\n".format(self.start_time)
        preprocess_msg += "**config_path**: {}\n\n".format(self.config_path)
        preprocess_msg += "**config_phase_path**: {}\n\n".format(self.config_phase_path)
        preprocess_msg += "**config_role_path**: {}\n\n".format(self.config_role_path)
        preprocess_msg += "**task_prompt**: {}\n\n".format(self.task_prompt_raw)
        preprocess_msg += "**project_name**: {}\n\n".format(self.project_name)
        preprocess_msg += "**Log File**: {}\n\n".format(self.log_filepath)
        preprocess_msg += "**ChatDevConfig**:\n {}\n\n".format(self.chat_env.config.__str__())
        preprocess_msg += "**ChatGPTConfig**:\n {}\n\n".format(chat_gpt_config)
        log_and_print_online(preprocess_msg)

        # init task prompt
        if check_bool(self.config['self_improve']):
            self.chat_env.env_dict['task_prompt'] = self.self_task_improve(self.task_prompt_raw)
        else:
            self.chat_env.env_dict['task_prompt'] = self.task_prompt_raw

    def post_processing(self):
        """
        summarize the production and move log files to the software directory
        Returns: None

        """

        self.chat_env.write_meta()
        filepath = os.path.dirname(__file__)
        # root = "/".join(filepath.split("/")[:-1])
        root = os.path.dirname(filepath)

        post_info = "**[Post Info]**\n\n"
        now_time = now()
        time_format = "%Y%m%d%H%M%S"
        datetime1 = datetime.strptime(self.start_time, time_format)
        datetime2 = datetime.strptime(now_time, time_format)
        duration = (datetime2 - datetime1).total_seconds()

        post_info += "Software Info: {}".format(
            get_info(self.chat_env.env_dict['directory'], self.log_filepath) + "\n\n🕑**duration**={:.2f}s\n\n".format(duration))

        post_info += "ChatDev Starts ({})".format(self.start_time) + "\n\n"
        post_info += "ChatDev Ends ({})".format(now_time) + "\n\n"

        if self.chat_env.config.clear_structure:
            directory = self.chat_env.env_dict['directory']
            for filename in os.listdir(directory):
                file_path = os.path.join(directory, filename)
                if os.path.isdir(file_path) and file_path.endswith("__pycache__"):
                    shutil.rmtree(file_path, ignore_errors=True)
                    post_info += "{} Removed.".format(file_path) + "\n\n"

        log_and_print_online(post_info)

        logging.shutdown()
        time.sleep(1)

        shutil.move(self.log_filepath,
                    os.path.join(root + "/WareHouse", "_".join([self.project_name, self.org_name, self.start_time]),
                                 os.path.basename(self.log_filepath)))

    # @staticmethod
    def self_task_improve(self, task_prompt):
        """
        ask agent to improve the user query prompt
        Args:
            task_prompt: original user query prompt

        Returns:
            revised_task_prompt: revised prompt from the prompt engineer agent

        """
        self_task_improve_prompt = """I will give you a short description of a software design requirement, 
please rewrite it into a detailed prompt that can make large language model know how to make this software better based this prompt,
the prompt should ensure LLMs build a software that can be run correctly, which is the most import part you need to consider.
remember that the revised prompt should not contain more than 200 words, 
here is the short description:\"{}\". 
If the revised prompt is revised_version_of_the_description, 
then you should return a message in a format like \"<INFO> revised_version_of_the_description\", do not return messages in other formats.""".format(
            task_prompt)
        role_play_session = RolePlaying(
            assistant_role_name="Prompt Engineer",
            assistant_role_prompt="You are an professional prompt engineer that can improve user input prompt to make LLM better understand these prompts.",
            user_role_prompt="You are an user that want to use LLM to build software.",
            user_role_name="User",
            task_type=TaskType.CHATDEV,
            task_prompt="Do prompt engineering on user query",
            with_task_specify=False,
            model_type=self.model_type,
        )

        # log_and_print_online("System", role_play_session.assistant_sys_msg)
        # log_and_print_online("System", role_play_session.user_sys_msg)

        _, input_user_msg = role_play_session.init_chat(None, None, self_task_improve_prompt)
        assistant_response, user_response = role_play_session.step(input_user_msg, True)
        revised_task_prompt = assistant_response.msg.content.split("<INFO>")[-1].lower().strip()
        log_and_print_online(role_play_session.assistant_agent.role_name, assistant_response.msg.content)
        log_and_print_online(
            "**[Task Prompt Self Improvement]**\n**Original Task Prompt**: {}\n**Improved Task Prompt**: {}".format(
                task_prompt, revised_task_prompt))
        return revised_task_prompt
作者 east
chatgpt 9月 11,2023

清华开源ChatGPT自动编程ChatDev项目结构和关键代码解析

这个项目的详细解析如下:

  • 项目概述:ChatDev是一个使用自然语言描述的想法来创建定制软件的项目,它通过多智能体协作的方式来实现软件开发的各个阶段,包括设计、编码、测试和文档1。ChatDev的目标是提供一个易于使用、高度可定制和可扩展的框架,基于大型语言模型(LLM),作为研究集体智能的理想场景1。
  • 项目作用:ChatDev可以让用户通过简单的自然语言描述来构建自己想要的软件,无需编程知识或技能。用户只需要提供一个简单的想法,例如“我想要一个五子棋游戏”,就可以让ChatDev的智能体们协同工作,生成一个完整的五子棋软件,包括界面、逻辑、功能和文档1。用户可以在过程中与智能体们进行交互,提供反馈或修改需求,从而得到更满意的结果1。
  • 项目结构:ChatDev的项目结构如下:
    • CompanyConfig:这个文件夹包含了ChatDev的公司配置文件,定义了公司的名称、使命、愿景、价值观、组织结构、角色分配等信息1。用户可以根据自己的喜好修改这些配置文件,从而定制自己的虚拟软件公司1。
    • WareHouse:这个文件夹包含了ChatDev生成的软件仓库,每个仓库对应一个用户提出的想法1。每个仓库中包含了软件的源代码、测试代码、文档等文件,以及一个README.md文件,记录了软件的基本信息和开发过程1。
    • chatdev:这个文件夹包含了ChatDev的核心代码,实现了智能体之间的通信和协作机制,以及各个阶段的任务分配和执行逻辑1。这个文件夹中还包含了一些辅助函数和工具类,用于处理自然语言、生成代码、测试软件等功能1。
    • misc:这个文件夹包含了一些杂项文件,例如五子棋游戏的图形资源1。
    • online_log:这个文件夹包含了ChatDev在线日志模式和回放模式所需的文件1。在线日志模式可以让用户实时查看智能体之间的对话和交互过程,回放模式可以让用户回顾已经完成的软件开发过程1。
    • .gitignore:这个文件用于指定哪些文件或文件夹不需要被Git跟踪1。
    • README.md:这个文件是项目的主要介绍文件,包含了项目的概述、新闻、功能、快速入门、使用方法、常见问题等信息1。
    • requirements.txt:这个文件用于指定项目所需的Python依赖包1。
    • run.py:这个文件是项目的主要运行文件,用于启动ChatDev并接收用户输入1。
    • wiki.md:这个文件是项目的详细文档文件,包含了项目背景、原理、架构、配置、使用示例等信息1。
  • 项目关键代码详细解析:
    • run.py:这个文件是项目运行时最先执行的代码,它首先导入了chatdev模块中定义的Company类,并创建了一个Company对象company。然后它调用company.init()方法来初始化公司配置,并打印出公司名称和使命。接下来它调用company.start()方法来启动公司的运行,这个方法会创建一个新的线程来执行company.run()方法,这个方法是公司运行的主循环。然后它调用company.input()方法来接收用户输入,并将用户输入传递给company.handle_input()方法,这个方法会根据用户输入的内容来执行相应的操作,例如创建新的软件项目、查看已有的软件项目、切换在线日志模式或回放模式等。最后它调用company.stop()方法来停止公司的运行,并释放资源。
    • chatdev/company.py:这个文件定义了Company类,这个类是ChatDev的核心类,代表了一个虚拟的软件公司。Company类有以下几个主要属性和方法:
      • __init__():这个方法是Company类的构造函数,它接受一个参数config,表示公司配置文件的路径。它首先调用load_config()方法来加载配置文件,并将配置信息保存在self.config属性中。然后它创建了一个空列表self.projects,用于存储公司创建的软件项目。接着它创建了一个空字典self.agents,用于存储公司拥有的智能体。最后它创建了一个空队列self.queue,用于存储智能体之间的消息。
      • load_config():这个方法用于加载配置文件,并返回一个字典对象,包含了配置信息。它首先使用json模块打开配置文件,并将其解析为一个Python对象。然后它检查配置信息是否合法,例如是否包含了必要的字段,是否符合预期的格式等。如果配置信息合法,它就返回这个对象,否则它就抛出一个异常。
      • init():这个方法用于初始化公司,根据配置信息创建智能体并分配角色。它首先遍历配置信息中的agents字段,对于每个智能体,它根据其类型和名称创建一个Agent对象,并将其添加到self.agents字典中,以名称为键,对象为值。然后它遍历配置信息中的roles字段,对于每个角色,它根据其名称和成员列表创建一个Role对象,并将其添加到self.agents字典中,以名称为键,对象为值。最后它遍历配置信息中的relations字段,对于每个关系,它根据其类型和成员列表创建一个Relation对象,并将其添加到self.agents字典中,以类型为键,对象为值。
      • start():这个方法用于启动公司的运行,它创建了一个新的线程来执行self.run()方法,并将其保存在self.thread属性中。
      • stop():这个方法用于停止公司的运行,它向self.queue队列中发送一个特殊的消息”STOP”,表示终止信号,并等待self.thread线程结束。
      • run():这个方法是公司运行的主循环,它不断地从self.queue队列中获取消息,并根据消息内容进行处理。如果消息是”STOP”,表示终止信号,它就退出循环并结束线程。如果消息是一个元组(msg, sender, receiver),表示智能体之间的通信消息,它就调用handle_message()方法来处理这个消息。如果消息是其他类型,表示异常情况,它就打印出错误信息并忽略这个消息。
      • handle_message():这个方法用于处理智能体之间的通信消息,它接受三个参数msg, sender, receiver,分别表示消息内容
作者 east
mysql, 大数据开发, 提示词 9月 7,2023

java批量生成海量测试数据及用ChatGPT提示语一键生成的方法

在做大数据开发时,为了测试性能等,需要上千万,甚至TB或PB级别的,在测试环境可能没有那么多数据,这时可以考虑进行造测试数据。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.Random;

public class TestDataGenerator {
    public static void main(String[] args) {
        String url = "jdbc:mysql://localhost:3306/your_database";
        String username = "your_username";
        String password = "your_password";
        int batchSize = 1000; // 每批次插入的数据量
        int totalRecords = 1000000; // 总共要生成的数据量

        try {
            Connection connection = DriverManager.getConnection(url, username, password);
            connection.setAutoCommit(false);

            String insertQuery = "INSERT INTO test (id, callid, type, ...其他列...) VALUES (?, ?, ?, ...其他值...)";
            PreparedStatement preparedStatement = connection.prepareStatement(insertQuery);

            Random random = new Random();

            for (int i = 1; i <= totalRecords; i++) {
                // 设置每个字段的值,根据表结构设置对应的数据生成逻辑
                preparedStatement.setLong(1, i);
                preparedStatement.setString(2, "CallSheet" + i);
                preparedStatement.setString(3, "Type" + (random.nextInt(5) + 1));
                // 设置其他字段的值...

                preparedStatement.addBatch();

                if (i % batchSize == 0) {
                    preparedStatement.executeBatch();
                    connection.commit();
                }
            }

            preparedStatement.executeBatch();
            connection.commit();

            preparedStatement.close();
            connection.close();

            System.out.println("测试数据生成完成!");
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

请将上述示例中的数据库连接信息和插入逻辑根据您的数据库设置和表结构进行相应的修改。此程序将会在数据库中插入海量测试数据。

更方便的方法是在ChatGPT等大模型,输入下面提示语:

根据下面的表结构,生成100万的测试数据,给出详细的java实现代码或存储过程代码:【表结构】

亲测在New Bing是可以生成可以运行的代码。

作者 east
chatgpt 5月 24,2023

90% 的亚太地区企业计划在未来 12 个月内部署人工智能:报告

预计到 2023 年底,人工智能 (AI) 将成为亚太地区的主流,该地区超过 88% 的企业已经在使用或计划在未来 12 个月内使用人工智能或机器学习 (ML) 应用程序。一份由联想和 AMD 联合委托的 IDC 报告。
“AI 应用程序使 CIO 能够分析大量信息并创建实时洞察力,以推动客户参与和客户体验,管理快速扩展的地理分散基础架构的日益复杂性以实现更高水平的弹性和敏捷性,并确保他们的 IT 运营免受勒索软件和恶意软件攻击发生率不断上升的背景下,”IDC 报告表示,该报告基于对亚太地区 900 多名首席信息官和 IT 决策者的研究。
该研究指出,预计企业将采用 AI/ML 的前三大业务流程包括 IT 运营、网络安全以及客户支持和服务。
联想 ISG 印度董事总经理 Amit Luthra 表示:“组织正在寻求 AI/ML 来简化 IT 运营,直到今天,有些组织还需要时间才能将虚拟机分配给客户。” Luthra 指出,鉴于在当前的业务环境中,一些工作负载在公共云中,而在混合云中则有一些工作负载,因此很难定义操作并确定谁负责哪些数据。 “因此,人工智能通过提供适当的见解来帮助做出明智的决定。”
报告指出,人工智能可以在确保网络安全弹性方面发挥重要作用。垂直行业中不同规模的组织根据他们的要求使用 AI 来简化安全性。 “在不依赖(最少或零接触点)人类的情况下识别、预测、响应和了解潜在威胁将是 AI 可以带来的最好的东西,当你拥有一个完整的基于 AI 的安全框架时,就会发生这种情况, ”卢瑟拉说。 “网络安全不是一种产品。根据对框架的理解程度,可以使用各种人工智能工具来构建成功的网络弹性。”
人工智能在提供卓越的客户服务方面一直发挥着重要作用。多年来,各个垂直行业的组织一直在依靠人工智能来提升客户体验。根据行业的不同,人工智能工具在不同组织中的使用程度也不同。 “例如,在汽车行业,人工智能被用于通过提供互联汽车的功能和增强的娱乐系统来确保客户体验,因为汽车的销量在很大程度上取决于此。同样在另一方面,汽车制造商在车间使用 AI 来确保将零件报废率降到最低。同样,银行业使用人工智能通过实时报告事件而不是事后报告来打击洗钱活动。与此同时,医疗保健行业正在使用 AI 来提供预防性医疗保健,”Luthra 说。
报告称,制造、零售、物流、运输和能源等垂直行业的企业越来越注重提供卓越的客户体验,以推动数字经济取得成功,而这正是人工智能可以发挥重要作用的地方。
随着 ChatGPT 和 Google Bard 等高级人工智能工具的出现,企业正在考虑不同的用例,将此类高级聊天机器人集成到他们的技术堆栈中。然而,Luthra 指出,“一些人工智能工具已经被用于各个领域。现在,随着 ChatGPT 和 Google Bard 的下一级自动搜索的出现,它将进一步推进。我们必须看看它是如何演变的。”
然而,正如报告指出的那样,打算真正利用 AI 应用程序的组织将需要进行文化转型。随着 CIO 成为当今董事会讨论的一部分,这可能不再那么困难了。 “首席信息官们希望回头在他们经营的行业中创造差异化。技术与业务保持一致并使用 AI 作为推动因素的组织能够实现这一愿景,”Luthra 说。

作者 east
chatgpt 5月 20,2023

解决New Bing跳转国内

New Bing为了不让中国大陆使用真是无所不用其极。

访问www.bing.com时总是重定向到cn.bing.com 。刚开始用Mod Header等插件, ,点击 FILTER,选择 Request URL filter  ,
填写下面三个内容(分别是:X-Forwarded-For、8.8.8.8、.*://www.bing.com/.*)并确保都勾选。

后来方法失效了,即使不让跳转,还是会重定向 cn.bing.com过多次导致访问失败。

又升级了方法,用美国vps,通过socket5来访问。用了一段时间之后,用这个美国vps访问,又 跳向国内。不知new bing是用什么算法判定:可能用这个ip的注册账号是中国地区,有时Edge Cookie没清干净,用new bing是使用中文,Edgi用这个ip时Edge语言是中文。

好在有备用美国vps ip,用socket5访问暂时没有跳转到国内。

作者 east
chatgpt 5月 6,2023

当机器人来的时候

像每个人和他们的兄弟一样,我一直在玩 ChatGPT 并向它提出生活中必不可少的问题。它自信地告诉我一些事情,其中​​一些事情非常有见地。然而,错误的人和聊天机器人经常自信地陈述事情。
我看到最近在 Mastodon 上发布的 Google Answer。在这个“答案”中,谷歌建议在海洋中处理用过的汽车电池有好处,包括为电鳗充电和为墨西哥湾流提供动力。 Bing 然后选择了这个答案,还提出了非法处理电池对环境的好处。我想知道 Google 是否意识到您可以使用机油为草坪施肥。 (作者注:请不要将电池扔进海里或用机油给草坪施肥。)
据推测,搜索此内容的人正在寻找这个笑话,但它提出了一个有趣的问题。随着越来越多的人使用 ChatGPT 并在网络上发布他们的结果,越来越多的 AI 问答系统选择他们自己和其他人生成的响应并对其进行训练——会发生什么?
对于一个他们不知道答案的问题,我做了任何人都会做的事情。我问 ChatGPT,“当人们发布 ChatGPT 的输出并且它根据自己的响应进行训练时会发生什么?”
机器人回复:
如果人们发布 ChatGPT 的输出并使用它根据自己的响应进一步训练模型,这被称为自我训练或自我监督学习。在这种情况下,模型将继续从自己的输出中学习,并可能随着时间的推移提高其性能。
但是,在使用自我训练时需要考虑一些潜在的风险。一个风险是模型可能会过度拟合其自身的输出,这意味着它变得过于专业化地回应它之前遇到的问题和陈述的类型。这可能会导致模型在新数据或未见过的数据上表现不佳。
另一个风险是,如果在自我训练期间没有得到适当的监控和监督,模型可能会开始产生无意义或不适当的反应。这可能是由于模型在其自身输出中发现了模式或偏差,并随着时间的推移而放大了它们。
因此,在自我训练像 ChatGPT 这样的语言模型时要谨慎,并仔细监控其性能和输出以确保它继续生成高质量的响应,这一点很重要。
这指出了一些非常可怕的社会后果,因为人们似乎相信 ChatGPT 并认为它神奇地正确(以及情感)。我想知道会有什么社会后果?我问,“人们依赖 ChatGPT 会产生什么社会影响,它开始产生无意义的结果,因为它是根据自己的信息进行训练的?”
机器人说:
如果人们过度依赖像 ChatGPT 这样的语言模型,并且它开始产生无意义的结果,因为它是根据自己的信息进行训练的,这可能会产生一些负面的社会影响。
首先,当 ChatGPT 对他们的问题或陈述提供荒谬或不恰当的回答时,人们可能会感到沮丧或困惑。这可能会导致沟通中断和对技术失去信任。
其次,如果人们依赖 ChatGPT 来提供重要信息或做出重要决策,那么模型产生无意义结果的后果可能会很严重。例如,如果基于 ChatGPT 的聊天机器人用于提供医疗建议或诊断健康状况,依赖无意义的响应可能会导致严重的健康风险。
第三,如果使用 ChatGPT 为社交媒体或其他在线平台生成内容,可能会导致错误信息或假新闻的传播。这可能会产生严重的社会和政治后果,因为虚假信息可能被用来操纵公众舆论或破坏民主进程。
一般来说,谨慎使用 ChatGPT 等语言模型并仔细监控其性能以确保它们继续产生准确和适当的响应非常重要。同样重要的是要认识到这些模型的局限性,而不是依赖它们来替代人类的智慧和专业知识。
哦,所以我们应该负责任地使用技术。我想知道 ChatGPT 认为我们应该怎么做?我问道,“鉴于人类几乎从未负责任地使用过新技术,这种情况下可能出现的结果是什么?”
它回答说:
虽然过去人类确实经常难以负责任地使用新技术,但重要的是要认识到每项新技术都是独一无二的,并且可能会带来一系列风险和挑战。因此,很难确定地预测涉及像 ChatGPT 这样的语言模型的场景的结果。
也就是说,可以采取一些措施来尽量减少这项技术的潜在负面影响。例如,ChatGPT 等语言模型的开发人员和用户可以努力识别和解决在技术开发和部署过程中可能出现的任何偏见或道德问题。这可能包括实施保护措施以防止错误信息或不当内容的传播,并确保模型是根据多样化和有代表性的数据进行训练的。
此外,政府和监管机构可以发挥作用,确保以负责任的方式使用 ChatGPT 等语言模型,并采取适当的保护措施来保护公众。这可能包括有关在特定行业或应用程序中使用语言模型的法规,以及对这些技术的开发和部署的透明度和问责制的要求。
总之,虽然使用 ChatGPT 等语言模型肯定存在风险,但可以通过负责任的开发和部署以及监管监督和公众意识来减轻这些风险。
哇哦,ChatGPT 认为它应该受到监管?我给它的创建者 OpenAI 发了邮件,问他们是否同意,如果不同意,那么他们知道什么是他们的语言模型不知道的?截至发稿时,他们尚未回复。
长期以来,我们一直在自我训练以“用谷歌搜索答案”,现在我们可能开始训练自己“只问 ChatGPT”。然而,重要的是要记住,这个工具只是吸取互联网的一部分并将其反哺给你。 ChatGPT 可以是一个不错的研究工具,但它是垃圾输入和垃圾输出。
像所有技术一样,这是 BYOB。带上你自己的大脑,不要给鳗鱼喂汽车电池。

作者 east
chatgpt 4月 3,2023

开始使用 Azure OpenAI

现代机器学习和 AI 研究已从实验室迅速转移到我们的 IDE,Azure 的认知服务等工具提供了对预训练模型的基于 API 的访问。提供人工智能服务有许多不同的方法,其中一种更有前途的处理语言的方法是一种称为生成预训练或 GPT 的技术,它可以处理大量文本。
OpenAI 研究实验室率先采用了这项技术,并于 2018 年发表了关于该主题的第一篇论文。它使用的模型经过了多次迭代,从无监督 GPT-2 开始,它使用未标记的数据来模仿人类。 GPT-2 建立在 40GB 的公共互联网内容之上,需要大量训练才能提供具有 15 亿个参数的模型。紧随其后的是 GPT-3,这是一个拥有 1750 亿个参数的更大模型。 GPT-3 独家授权给 Microsoft,是 GitHub Copilot 使用的以编程代码为中心的 Codex 和图像生成 DALL-E 等工具的基础。
像 GPT-3 这样的模型需要大量的计算和内存,大约为数千 petaflop/s-days,它是在专用超级计算机硬件上进行基于云的高性能计算的理想候选者。微软在 Azure 上构建了自己的基于 Nvidia 的超级计算服务器,其云实例出现在 TOP500 超级计算列表中。 Azure 的 AI 服务器围绕 Nvidia Ampere A12000 Tensor Core GPU 构建,通过高速 InfiniBand 网络互连。
OpenAI 的生成式 AI 工具已在 Azure 服务器上构建和训练。作为 OpenAI 和微软之间长期交易的一部分,OpenAI 的工具作为 Azure 的一部分提供,具有 Azure 特定的 API 并与 Azure 的计费服务集成。经过一段时间的私人预览后,Azure OpenAI API 套件现已普遍可用,支持 GPT-3 文本生成和 Codex 代码模型。微软表示将在未来的更新中添加 DALL-E 图像生成。
这并不意味着任何人都可以构建使用 GPT-3 的应用程序;微软仍在限制访问,以确保项目符合其道德人工智能使用政策,并严格限定在特定用例范围内。您还需要成为 Microsoft 的直接客户才能访问 Azure OpenAI。 Microsoft 使用类似的过程来访问其受限访问认知服务,其中可能存在冒充或侵犯隐私的情况。
这些政策可能会保持严格,而某些领域(例如医疗服务)可能需要额外保护才能满足监管要求。微软自己在 AI 语言模型方面的经验给它上了一课,它不想重蹈覆辙。作为附加保护,输入和输出上有内容过滤器,并向 Microsoft 和开发人员发出警报。
一旦你的帐户被批准使用 Azure OpenAI,你就可以开始构建使用其 API 端点的代码。可以从门户、Azure CLI 或 Arm 模板创建适当的 Azure 资源。如果您使用的是 Azure 门户,请创建分配给您的帐户的资源以及您打算用于您的应用程序和任何关联的 Azure 服务和基础结构的资源组。接下来,为资源命名并选择定价层。目前,只有一种定价选项,但随着微软推出新的服务等级,这种情况可能会发生变化。
有了资源,你现在可以使用 Azure OpenAI Studio 部署模型。这是您使用 OpenAI 完成大部分工作的地方。目前,您可以在 GPT-3 系列模型的成员之间进行选择,包括基于代码的 Codex。其他模型使用嵌入,为搜索优化的复杂语义信息。
在每个系列中,都有一组不同的模型,其名称同时表明了成本和能力。如果你使用 GPT-3,Ada 是成本最低且能力最差的,而 Davinci 是最高的。每个模型都是前一个模型的超集,因此随着任务变得越来越复杂,您无需更改代码,只需选择不同的模型即可。有趣的是,Microsoft 建议在设计基于 OpenAI 的应用程序时从功能最强大的模型开始,因为这可以让您在投入生产时调整基础模型的价格和性能。
尽管 GPT-3 的文本完成功能已经流行起来,但实际上您的应用程序需要更加关注您的特定用例。您不希望 GPT-3 为定期提供无关建议的支持服务提供支持。您必须使用带有输入和所需输出的训练示例构建自定义模型,Azure OpenAI 将其称为“完成”。拥有大量训练数据很重要,Microsoft 建议使用数百个示例。您可以将所有提示和完成内容包含在一个 JSON 文件中,以简化训练数据的管理。
自定义模型到位后,您可以使用 Azure OpenAI Studio 来测试 GPT-3 如何适用于您的场景。一个基本的 playground 可以让你看到模型如何响应特定的提示,一个基本的控制台应用程序可以让你输入一个提示并返回一个 OpenAI 完成。微软将构建良好的提示描述为“显示,不要告诉”,这表明提示需要尽可能明确以获得最佳输出。 playground 还有助于训练您的模型,因此如果您正在构建分类器,您可以在提供输入和触发以获得响应之前提供文本和预期输出列表。
playground 的一个有用功能是能够尽早设置意图和预期行为,因此如果您使用 OpenAI 为帮助台分类工具提供支持,您可以设置输出礼貌和冷静的期望,确保它获胜’模仿愤怒的用户。相同的工具可用于 Codex 模型,因此您可以看到它如何作为代码完成工具或动态助手工作。
准备好开始编码后,您可以直接或与 OpenAI Python 库一起使用部署的 REST 端点。后者可能是您获得实时代码的最快途径。您需要端点 URL、身份验证密钥和部署名称。一旦你有了这些,为你的代码设置适当的环境变量。与往常一样,在生产中最好不要对密钥进行硬编码,而是使用 Azure Key Vault 等工具来管理它们。
调用端点非常简单:只需使用 openai.Completion.create 方法获取响应,设置包含提示及其响应所需的最大令牌数。 API 返回的响应对象包含您的模型生成的文本,可以将其提取、格式化,然后供您的其余代码使用。基本调用很简单,您的代码还可以使用其他参数来管理响应。这些控制着模型的创造力以及它如何对其结果进行采样。您可以使用这些参数来确保响应直接且准确。
如果您使用其他语言,请使用其 REST 和 JSON 解析工具。您可以在 Azure OpenAI 文档中找到 API 参考,或利用 Azure 的 GitHub 托管的 Swagger 规范来生成 API 调用并处理返回的数据。这种方法适用于 Visual Studio 等 IDE。
OpenAI 模型的一个关键要素是它们基于代币的定价模型。 Azure OpenAI 中的令牌不是我们熟悉的身份验证令牌;它们是字符串的标记化部分,是使用内部统计模型创建的。 Open AI 在其网站上提供了一个工具来显示字符串是如何标记化的,以帮助您了解您的查询是如何计费的。你可以期望一个标记大约是四个字符的文本,尽管它可以更少也可以更多;然而,它最终应该有 75 个单词,需要大约 100 个标记(大约是一段普通文本)。
模型越复杂,代币的价格就越高。基本型号 Ada 每 1,000 个代币的价格约为 0.0004 美元,高端 Davinci 为 0.02 美元。如果您应用自己的调整,则会产生存储成本,如果您使用嵌入,则由于计算需求增加,成本可能会高出一个数量级。微调模型需要支付额外费用,起价为每计算小时 20 美元。 Azure 网站提供样本价格,但实际价格可能会有所不同,具体取决于您的组织与 Microsoft 的帐户关系。
也许 Azure OpenAIclo 最令人惊讶的地方在于它的简单性。当您使用预建模型(可以进行一些微调)时,您需要做的就是应用一些基本的预训练,了解提示如何生成输出,并将工具链接到您的代码,随时生成文本内容或代码这是需要的。

作者 east
chatgpt 3月 30,2023

利用ChatGPT不到10分钟生成一个网页工具

作为一个程序员,经常需要用到一些在线网页工具,例如时间戳转换,json格式转换。一直想做这类的工具,但苦于自己对网页开发不熟悉。

想到了ChatGPT,开始试试神奇生成代码之旅。

问ChatGPT:

设计一个在线时间戳的页面

ChatGPT答:

可以使用HTML、CSS和JavaScript编写一个简单的在线时间戳页面,如下所示:

<!DOCTYPE html>
<html>
<head>
    <title>Online Timestamp</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            text-align: center;
        }
        h1 {
            margin-top: 50px;
        }
        input {
            padding: 10px;
            font-size: 16px;
            border-radius: 5px;
            border: none;
            box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.3);
            margin-top: 20px;
            width: 250px;
        }
        button {
            background-color: #4CAF50;
            color: white;
            padding: 10px;
            font-size: 16px;
            border-radius: 5px;
            border: none;
            cursor: pointer;
            box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.3);
            margin-top: 20px;
            width: 100px;
        }
    </style>
</head>
<body>
    <h1>Online Timestamp</h1>
    <input type="text" id="timestamp" placeholder="Enter timestamp">
    <button onclick="convertTimestamp()">Convert</button>
    <p id="result"></p>

    <script>
        function convertTimestamp() {
            var timestamp = document.getElementById("timestamp").value;
            var date = new Date(timestamp * 1000);
            var year = date.getFullYear();
            var month = ("0" + (date.getMonth() + 1)).slice(-2);
            var day = ("0" + date.getDate()).slice(-2);
            var hours = ("0" + date.getHours()).slice(-2);
            var minutes = ("0" + date.getMinutes()).slice(-2);
            var seconds = ("0" + date.getSeconds()).slice(-2);
            var formattedDate = day + "/" + month + "/" + year;
            var formattedTime = hours + ":" + minutes + ":" + seconds;
            document.getElementById("result").innerHTML = formattedDate + " " + formattedTime;
        }
    </script>
</body>
</html>

该页面包括一个标题、一个输入框和一个按钮。用户可以在输入框中输入UNIX时间戳(自1970年1月1日以来的秒数),然后单击按钮将其转换为日期和时间,并将结果显示在页面上。JavaScript代码使用Date对象将时间戳转换为日期和时间,并格式化输出。HTML和CSS代码则用于构建页面布局和样式。

觉得功能太简单,又对ChatGPT下达命令:

追问ChatGPT:

再加一个功能,需要把输入标准时间,例如2023-03-30 14:00:00的时间转换成时间戳

ChatGPT答:

可以在现有的时间戳转换页面上添加一个额外的输入框和按钮,以便用户可以将标准时间转换为时间戳。以下是修改后的代码:

<!DOCTYPE html>
<html>
<head>
    <title>Online Timestamp</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            text-align: center;
        }
        h1 {
            margin-top: 50px;
        }
        input {
            padding: 10px;
            font-size: 16px;
            border-radius: 5px;
            border: none;
            box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.3);
            margin-top: 20px;
            width: 250px;
        }
        button {
            background-color: #4CAF50;
            color: white;
            padding: 10px;
            font-size: 16px;
            border-radius: 5px;
            border: none;
            cursor: pointer;
            box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.3);
            margin-top: 20px;
            width: 100px;
        }
    </style>
</head>
<body>
    <h1>Online Timestamp</h1>
    <input type="text" id="timestamp" placeholder="Enter timestamp">
    <button onclick="convertTimestamp()">Convert to Date and Time</button>
    <p id="result"></p>

    <input type="datetime-local" id="datetime" placeholder="Enter date and time">
    <button onclick="convertDateTime()">Convert to Timestamp</button>
    <p id="result2"></p>

    <script>
        function convertTimestamp() {
            var timestamp = document.getElementById("timestamp").value;
            var date = new Date(timestamp * 1000);
            var year = date.getFullYear();
            var month = ("0" + (date.getMonth() + 1)).slice(-2);
            var day = ("0" + date.getDate()).slice(-2);
            var hours = ("0" + date.getHours()).slice(-2);
            var minutes = ("0" + date.getMinutes()).slice(-2);
            var seconds = ("0" + date.getSeconds()).slice(-2);
            var formattedDate = day + "/" + month + "/" + year;
            var formattedTime = hours + ":" + minutes + ":" + seconds;
            document.getElementById("result").innerHTML = formattedDate + " " + formattedTime;
        }

        function convertDateTime() {
            var datetime = document.getElementById("datetime").value;
            var date = new Date(datetime);
            var timestamp = Math.round(date.getTime() / 1000);
            document.getElementById("result2").innerHTML = timestamp;
        }
    </script>
</body>
</html>

还是觉得美中不足,又对ChatGPT下达命令:

追问ChatGPT:增加一个功能,显示当前东八区的时间

ChatGPT答:

可以使用JavaScript获取当前的日期和时间,并将其转换为东八区的时间。以下是修改后的代码:

<!DOCTYPE html>
<html>
<head>
    <title>Online Timestamp</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            text-align: center;
        }
        h1 {
            margin-top: 50px;
        }
        input {
            padding: 10px;
            font-size: 16px;
            border-radius: 5px;
            border: none;
            box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.3);
            margin-top: 20px;
            width: 250px;
        }
        button {
            background-color: #4CAF50;
            color: white;
            padding: 10px;
            font-size: 16px;
            border-radius: 5px;
            border: none;
            cursor: pointer;
            box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.3);
            margin-top: 20px;
            width: 100px;
        }
    </style>
</head>
<body>
    <h1>Online Timestamp</h1>
    <input type="text" id="timestamp" placeholder="Enter timestamp">
    <button onclick="convertTimestamp()">Convert to Date and Time</button>
    <p id="result"></p>

    <input type="datetime-local" id="datetime" placeholder="Enter date and time">
    <button onclick="convertDateTime()">Convert to Timestamp</button>
    <p id="result2"></p>

    <h2>Current Time in GMT+8:</h2>
    <p id="current-time"></p>

    <script>
        function convertTimestamp() {
            var timestamp = document.getElementById("timestamp").value;
            var date = new Date(timestamp * 1000);
            var year = date.getFullYear();
            var month = ("0" + (date.getMonth() + 1)).slice(-2);
            var day = ("0" + date.getDate()).slice(-2);
            var hours = ("0" + date.getHours()).slice(-2);
            var minutes = ("0" + date.getMinutes()).slice(-2);
            var seconds = ("0" + date.getSeconds()).slice(-2);
            var formattedDate = day + "/" + month + "/" + year;
            var formattedTime = hours + ":" + minutes + ":" + seconds;
            document.getElementById("result").innerHTML = formattedDate + " " + formattedTime;
        }

        function convertDateTime() {
            var datetime = document.getElementById("datetime").value;
            var date = new Date(datetime);
            var timestamp = Math.round(date.getTime() / 1000);
            document.getElementById("result2").innerHTML = timestamp;
        }

        function getCurrentTime() {
            var now = new Date();
            var utcOffset = now.getTimezoneOffset();
            var gmt8Offset = -480; // GMT+8 offset in minutes
            var localOffset = utcOffset - gmt8Offset;
            now.setMinutes(now.getMinutes() + localOffset);
            return now;
        }

        var currentTime = getCurrentTime();
        var year = currentTime.getFullYear();
        var month = ("0" + (currentTime.getMonth() + 1)).slice(-2);
        var day = ("0" + currentTime.getDate()).slice(-2);
        var hours = ("0" + currentTime.getHours()).slice(-2);
        var minutes = ("0" + currentTime.getMinutes()).slice(-2);
        var seconds = ("0" + currentTime.getSeconds()).slice(-2);
        var formattedTime = day + "/" + month + "/" + year + " " + hours + ":" + minutes + ":" + seconds;
        document.getElementById("current-time").innerHTML = formattedTime;
        setInterval(function() {
            currentTime = getCurrentTime();
            year = currentTime.getFullYear();
            month = ("0" + (currentTime.getMonth() + 1)).slice(-2);
            day = ("0" + currentTime.getDate()).slice(-2);
            hours = ("0" + currentTime.getHours()).slice(-2);
            minutes = ("0" + currentTime.getMinutes()).slice(-2);
            seconds = ("0" + currentTime.getSeconds()).slice(-2);
            formattedTime = day + "/" + month + "/" + year + " " + hours + ":" + minutes + ":" + seconds;
            document.getElementById("current-time").innerHTML = formattedTime;
        }, 1000); // update time every second
    </script>
</body>
</html>

最终生成工具如下:

借助ChatGPT,不到10分钟就基本初步达到自己想要的效果。如果自己看工具书编写,或者通过传统的搜索引擎,不顺利时可能要几个小时才做出来。

作者 east

1 2 下一个

关注公众号“大模型全栈程序员”回复“小程序”获取1000个小程序打包源码。回复”chatgpt”获取免注册可用chatgpt。回复“大数据”获取多本大数据电子书

标签

AIGC AI创作 bert chatgpt github GPT-3 gpt3 GTP-3 hive mysql O2O tensorflow UI控件 不含后台 交流 共享经济 出行 图像 地图定位 外卖 多媒体 娱乐 小程序 布局 带后台完整项目 开源项目 搜索 支付 效率 教育 日历 机器学习 深度学习 物流 用户系统 电商 画图 画布(canvas) 社交 签到 联网 读书 资讯 阅读 预订

官方QQ群

小程序开发群:74052405

大数据开发群: 952493060

近期文章

  • 详解Python当中的pip常用命令
  • AUTOSAR如何在多个供应商交付的配置中避免ARXML不兼容?
  • C++thread pool(线程池)设计应关注哪些扩展性问题?
  • 各类MCAL(Microcontroller Abstraction Layer)如何与AUTOSAR工具链解耦?
  • 如何设计AUTOSAR中的“域控制器”以支持未来扩展?
  • C++ 中避免悬挂引用的企业策略有哪些?
  • 嵌入式电机:如何在低速和高负载状态下保持FOC(Field-Oriented Control)算法的电流控制稳定?
  • C++如何在插件式架构中使用反射实现模块隔离?
  • C++如何追踪内存泄漏(valgrind/ASan等)并定位到业务代码?
  • C++大型系统中如何组织头文件和依赖树?

文章归档

  • 2025年6月
  • 2025年5月
  • 2025年4月
  • 2025年3月
  • 2025年2月
  • 2025年1月
  • 2024年12月
  • 2024年11月
  • 2024年10月
  • 2024年9月
  • 2024年8月
  • 2024年7月
  • 2024年6月
  • 2024年5月
  • 2024年4月
  • 2024年3月
  • 2023年11月
  • 2023年10月
  • 2023年9月
  • 2023年8月
  • 2023年7月
  • 2023年6月
  • 2023年5月
  • 2023年4月
  • 2023年3月
  • 2023年1月
  • 2022年11月
  • 2022年10月
  • 2022年9月
  • 2022年8月
  • 2022年7月
  • 2022年6月
  • 2022年5月
  • 2022年4月
  • 2022年3月
  • 2022年2月
  • 2022年1月
  • 2021年12月
  • 2021年11月
  • 2021年9月
  • 2021年8月
  • 2021年7月
  • 2021年6月
  • 2021年5月
  • 2021年4月
  • 2021年3月
  • 2021年2月
  • 2021年1月
  • 2020年12月
  • 2020年11月
  • 2020年10月
  • 2020年9月
  • 2020年8月
  • 2020年7月
  • 2020年6月
  • 2020年5月
  • 2020年4月
  • 2020年3月
  • 2020年2月
  • 2020年1月
  • 2019年7月
  • 2019年6月
  • 2019年5月
  • 2019年4月
  • 2019年3月
  • 2019年2月
  • 2019年1月
  • 2018年12月
  • 2018年7月
  • 2018年6月

分类目录

  • Android (73)
  • bug清单 (79)
  • C++ (34)
  • Fuchsia (15)
  • php (4)
  • python (43)
  • sklearn (1)
  • 云计算 (20)
  • 人工智能 (61)
    • chatgpt (21)
      • 提示词 (6)
    • Keras (1)
    • Tensorflow (3)
    • 大模型 (1)
    • 智能体 (4)
    • 深度学习 (14)
  • 储能 (44)
  • 前端 (4)
  • 大数据开发 (488)
    • CDH (6)
    • datax (4)
    • doris (30)
    • Elasticsearch (15)
    • Flink (78)
    • flume (7)
    • Hadoop (19)
    • Hbase (23)
    • Hive (40)
    • Impala (2)
    • Java (71)
    • Kafka (10)
    • neo4j (5)
    • shardingsphere (6)
    • solr (5)
    • Spark (99)
    • spring (11)
    • 数据仓库 (9)
    • 数据挖掘 (7)
    • 海豚调度器 (10)
    • 运维 (34)
      • Docker (3)
  • 小游戏代码 (1)
  • 小程序代码 (139)
    • O2O (16)
    • UI控件 (5)
    • 互联网类 (23)
    • 企业类 (6)
    • 地图定位 (9)
    • 多媒体 (6)
    • 工具类 (25)
    • 电商类 (22)
    • 社交 (7)
    • 行业软件 (7)
    • 资讯读书 (11)
  • 嵌入式 (70)
    • autosar (63)
    • RTOS (1)
    • 总线 (1)
  • 开发博客 (16)
    • Harmony (9)
  • 技术架构 (6)
  • 数据库 (32)
    • mongodb (1)
    • mysql (13)
    • pgsql (2)
    • redis (1)
    • tdengine (4)
  • 未分类 (6)
  • 程序员网赚 (20)
    • 广告联盟 (3)
    • 私域流量 (5)
    • 自媒体 (5)
  • 量化投资 (4)
  • 面试 (14)

功能

  • 登录
  • 文章RSS
  • 评论RSS
  • WordPress.org

All Rights Reserved by Gitweixin.本站收集网友上传代码, 如有侵犯版权,请发邮件联系yiyuyos@gmail.com删除.