介绍

fabric是一个使用人工智能增强人类的命令行调用形式的开源框架。

安装

For Windows

text
1
2
3
4
5
go install github.com/danielmiessler/fabric@latest //安装fabric
go install github.com/danielmiessler/yt@latest //安装yt

fabric --setup //配置

也可以在 C:\\Users\\UserName\\.config.env进行配置

text
1
2
3
4
5
6
7
// 配置默认Vendor和Model (以ollama的qwen2.5模型为例)
DEFAULT_VENDOR=Ollama
DEFAULT_MODEL=qwen2.5:latest

//配置 Youtube API KEY
YOUTUBE_API_KEY=******

基础

Text

使用 asset.txt 生成文章,-p代表应用pattern

text
1
2
type asset.txt | fabric -p write_essay

提取 introduce.md 智慧 ,并翻译成中文,-s代表流式处理

text
1
2
type introduce.md | fabric -p extract_wisdom | fabric -sp translate_cn

Youtube

使用yt获取指定YouTube链接视频的内容,提取智慧->撰写文章->翻译成中文并流式输出

text
1
2
yt <https://www.youtube.com/watch?v=RXeOiIDNNek> | fabric -p extract_wisdom | fabric -p write_essay | fabric -sp translate_cn

Audio

在Python版本支持,当前Go版本尚未支持

模式 Patterns

  • ai: 解读问题的核心和精神,并以富有洞察力的方式回答。

  • analyze_answers: 评估学习者对由配套测验创建模式生成的问题的回答的正确性,旨在评估学习目标的理解程度并识别需要进一步学习的领域。

  • analyze_claims: 分析输入中的真实性声明,提供支持和反对的证据,以及平衡的观点。它将真实性声明与论点分开,为每个声明提供评级和标签。

  • analyze_debate: 分析辩论记录以帮助用户理解不同观点并拓宽视角。它中立地映射和分析主张,评估辩论的洞察力和情感性。

  • analyze_incident: 通过高效提取关键信息来总结网络安全漏洞文章,专注于简洁性和组织性。它避免推断性结论,仅依赖文章内容提供详细信息。

  • analyze_logs: 分析服务器日志文件以识别模式、异常和潜在问题,旨在提高服务器的可靠性和性能。该过程包括详细检查日志条目、评估运营可靠性和识别重复出现的问题。

  • analyze_malware: 分析各种平台的恶意软件,专注于提取妥协指标和详细的恶意软件行为。这种方法包括分析遥测和社区数据,以帮助恶意软件检测和分析。

  • analyze_paper: 分析研究论文以确定其主要发现、科学严谨性和质量。它独特地映射出主张,评估研究设计,并评估利益冲突。

  • analyze_patent: 概述了专利审查员的角色和责任,强调了在评估专利时技术和法律专业知识的重要性。它详细说明了审查专利的步骤,包括识别技术领域、解决的问题、解决方案、优势、新颖性等。

  • analyze_personality: 对提供的输入中的主要个人进行深入的心理分析。它涉及识别主要人物,深入思考他们的语言和反应,并将这些与已知的人类心理学原理进行比较。

  • analyze_presentation: 分析和批评演讲,重点关注内容、演讲者的心理以及陈述目标与实际目标之间的差异。它涉及比较预期信息与实际内容,包括自我引用和娱乐尝试。

  • analyze_threat_report: 指示超级智能网络安全专家分析和提取网络安全威胁报告的关键见解。它强调识别新的、有趣的和令人惊讶的信息,并将这些发现组织成简洁的分类摘要。

  • analyze_threat_report_trends: 分析网络安全威胁报告以识别多达50个独特、令人惊讶和有洞察力的趋势。这个过程涉及深入的专家分析,以发现新的和有趣的信息。

  • answer_interview_question: 生成针对技术面试问题的定制回答,旨在达到随意而有洞察力的语气。AI从技术知识库和专业经验中汲取,构建展示深度和替代观点的回答。

  • ask_secure_by_design_questions: 生成一套全面的安全性问题,针对特定项目的基本设计量身定制。这个过程涉及对项目组件及其安全需求的深入分析和概念化。

  • capture_thinkers_work: 总结著名个人或哲学流派的教导和哲学,提供关于他们背景、思想和应用的详细模板。它提供了一种将复杂思想浓缩成易于理解的摘要的结构化方法。

  • extract_instructions: 您是从教学视频转录中提取清晰、简洁的分步说明的专家。目标是以易于遵循的格式提取和呈现关键说明。

  • extract_videoid: 从URL中提取视频ID以用于其他应用程序。它仔细分析URL以隔离视频ID。输出仅为视频ID,不包含任何其他信息或错误。

  • extract_wisdom: 从文本内容中提取关键见解、想法、引用、习惯和参考,以解决信息过载和知识保留的挑战。它独特地过滤和浓缩来自各种文本的有价值信息,使用户更容易决定内容是否值得深入审查或用作笔记替代品。

  • extract_wisdom_agents: 这个提示概述了从文本内容中提取见解的复杂过程,重点关注生命意义和技术对人类影响等主题。它涉及创建具有不同专业知识的AI代理团队来分析内容并产生摘要、想法、见解、引用、习惯、事实、参考和建议。

  • extract_wisdom_dm: 从输入文本中提取和综合有价值的内容,重点关注与生命目的和人类进步相关的见解。它采用结构化方法从内容中提炼出令人惊讶的想法、见解、引用、习惯、事实和建议。

  • extract_wisdom_nometa: 这个提示指导从文本中提取和组织有洞察力的内容,重点关注生命目的、人类繁荣和技术影响。它强调识别和总结与这些主题相关的令人惊讶的想法、精炼的见解、实用习惯、值得注意的引用、有效事实和有用建议。

  • improve_prompt: 您是一位专家LLM提示写作服务。您接收LLM/AI提示作为输入,并根据您的提示写作专业知识和提供的知识输出更好的提示。

  • rate_content: 您是一位超级智慧和出色的内容分类器和评判者。您用逗号分隔的单词标签列表标记内容,然后给出质量评级。

  • show_fabric_options_markmap: 您是一个高级UI构建器,展示通过输入提供给您的功能的可视化表示。

  • suggest_pattern: 您是一个智能程序员,由GPT-4驱动。您很乐意帮助回答用户的任何问题(通常是关于编码的)。您将获得一些可能相关的代码块。

  • summarize_prompt: 您是一位专家提示总结者。您接收AI聊天提示并使用以下格式输出提示目的的简洁摘要。

  • summarize_text: 生成输入文本的简洁摘要,重点关注主要思想和关键细节。它使用结构化方法来组织信息,包括主题句、关键点和结论。

  • summarize_video: 从YouTube视频转录中提取关键信息并生成结构化摘要。它包括视频的主要主题、关键点、引用和时间戳参考。

  • test_code: 分析代码片段并生成全面的单元测试套件。它考虑边缘情况、异常处理和代码覆盖率,以确保彻底的测试。

  • translate: 将文本从一种语言翻译成另一种语言,保持原意和语气。它考虑文化差异和习语表达,以确保准确和自然的翻译。

  • write_article: 创建高质量、引人入胜的文章,重点关注特定主题。它强调研究、结构和风格,以产生信息丰富且引人入胜的内容。

  • write_code: 根据用户的规格生成高质量、高效的代码。它关注代码的可读性、可维护性和性能,并提供详细的注释和文档。

  • write_email: 根据给定的上下文和目的起草专业和有效的电子邮件。它考虑收件人、语气和所需的结果,以创建有说服力的信息。

  • write_essay: 创作结构良好、论点有力的论文,涵盖指定的主题。它强调清晰的论点、支持证据和逻辑流程。

  • write_poem: 根据给定的主题或风格创作富有表现力和原创性的诗歌。它关注韵律、意象和情感共鸣,以创造引人入胜的诗歌作品。

  • write_press_release: 起草简洁、信息丰富的新闻稿,有效传达关键信息。它遵循标准的新闻稿格式,重点关注新闻价值和清晰的信息传递。

  • write_story: 根据给定的提示或主题创作引人入胜的短篇小说。它关注情节发展、角色塑造和叙事技巧,以创造引人入胜的故事。

进阶

用代码对文档分段处理并风格化改写

  1. 拆分文稿

  2. 段落划分

  3. 风格化改写

  4. 处理标点符号

示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
import os
import shutil
import subprocess
import glob
import sys
import tiktoken
import argparse

def setup_temp_folder():
temp_folder = 'polish_text_temp'
if os.path.exists(temp_folder):
shutil.rmtree(temp_folder)
os.mkdir(temp_folder)
return temp_folder

def split_text_file(filename, max_tokens=4096, model="gpt-3.5-turbo", newline_threshold=0.1):
encoding = tiktoken.encoding_for_model(model)
with open(filename, 'r', encoding='utf-8') as file:
text = file.read()
total_chars = len(text)
newline_count = text.count('\\n')
newline_ratio = newline_count / total_chars

if newline_ratio >= newline_threshold:
segments = text.split('\\n')
else:
segments = text.split()

chunks = []
current_chunk = []
current_token_count = 0

for segment in segments:
segment_tokens = encoding.encode(segment + " ")
segment_token_count = len(segment_tokens)
if current_token_count + segment_token_count > max_tokens:
chunks.append(" ".join(current_chunk))
current_chunk = [segment]
current_token_count = segment_token_count
else:
current_chunk.append(segment)
current_token_count += segment_token_count

if current_chunk:
chunks.append(" ".join(current_chunk))

return chunks

def process_segment(segment_file):
base_name = os.path.splitext(segment_file)[0]
output_file = f'{base_name.replace("output", "polished")}.md'

# Step 1: Initial fenduan processing
fenduan_output = f'{base_name}_fenduan.txt'
command1 = f'cat "{segment_file}" | fabric -sp fenduan --model google/gemini-flash-1.5 -o "{fenduan_output}"'
print("Step 1: Initial fenduan processing...\\n")
os.system(command1)

# Step 2: Write blog
blog_output = f'{base_name}_blog.txt'
command2 = f'cat "{fenduan_output}" | fabric -sp write_wsy_nontech_blog -m anthropic/claude-3.5-sonnet -o "{blog_output}"'
print("Step 2: Writing blog...\\n")
os.system(command2)

# Step 3: Extract modification
extract_output = f'{base_name}_extract.txt'
command3 = f'cat "{blog_output}" | fabric -sp extract_modification -m google/gemini-flash-1.5 -o "{extract_output}"'
print("Step 3: Extracting modification...\\n")
os.system(command3)

# Step 4: Final judou processing
command4 = f'cat "{extract_output}" | fabric -sp judou --model google/gemini-flash-1.5 -o "{output_file}"'
print("Step 4: Final judou processing...\\n")
os.system(command4)

# # Clean up intermediate files
# for file in [fenduan_output, blog_output, extract_output]:
# os.remove(file)

def main():
parser = argparse.ArgumentParser(description="处理转录后的文本文件")
parser.add_argument("input_file", help="输入文本文件的路径")
parser.add_argument("-m", "--max_tokens", type=int, default=4096, help="每个分段的最大token数")
parser.add_argument("--model", default="gpt-3.5-turbo", help="用于tokenization的GPT模型")
parser.add_argument("--newline_threshold", type=float, default=0.1, help="换行符占比阈值")
args = parser.parse_args()

if not os.path.exists(args.input_file):
print(f"Error: The file '{args.input_file}' does not exist.")
sys.exit(1)

temp_folder = setup_temp_folder()

chunks = split_text_file(args.input_file, args.max_tokens, args.model, args.newline_threshold)

for i, chunk in enumerate(chunks, 1):
chunk_file = f'{temp_folder}/output_{i}.txt'
with open(chunk_file, 'w', encoding='utf-8') as file:
file.write(chunk)
process_segment(chunk_file)

output_dir = os.path.dirname(args.input_file)
with open(os.path.join(output_dir, 'polished.md'), 'w') as outfile:
for polished_file in sorted(glob.glob(f'{temp_folder}/polished*.md')):
with open(polished_file, 'r') as infile:
outfile.write(infile.read())

if __name__ == "__main__":
main()

Custom Patterns

在  ~/.config/patterns/  创建一个目录,然后将你的  .md  文件放进去。

custom translate_cn pattern

在在  ~/.config/patterns/  创建translate_cn文件夹,创建system.md,内容为:翻译为中文

其他

补充说明

| 是管道操作符,用于将一个命令的输出传递给下一个命令作为输入。

问题解决

Windows 系统使用 type 命令乱码问题

使用 chcp 设置编码方式
chcp 65001 UTF-8 代码页

chcp 936 默认的 GBK

chcp 437 美国英语