Skip to content

Commit

Permalink
update
Browse files Browse the repository at this point in the history
  • Loading branch information
ddadaal committed Feb 15, 2025
1 parent dd413a0 commit 2f6c549
Show file tree
Hide file tree
Showing 6 changed files with 29 additions and 45 deletions.
6 changes: 3 additions & 3 deletions contents/20241231-summary-for-2024/cn.summary.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,14 @@
},
{
"summaries": [
"这篇文章展现了作者在多个方面的思考,涵盖了生活、工作、自我成长等多个主题。以下是对主要内容的总结:\n\n1. **生活与城市体验**: \n - 作者对大城市生活的满意程度和迷茫感,认为虽然付出金钱和住房质量,但未充分利用城市独特之处。 \n - 他珍视当前平淡生活状态,同时渴望更年轻化、活力的生活。\n\n2. **职业发展与未来规划**: \n - 作者对稳定工作的认可,但意识到其变化不可避免。 \n - 面临选择时,内心纠结维持现状还是改变。\n\n3. **自我反思与心理状态**: \n - 体会到年龄带来的身体素质下降,对羽毛球表现的反思。 \n - 认识到自己在理性与非理性的选择上存在矛盾,难以做出最优决策。\n\n4. **游戏体验与启示**: \n - 在《沙石镇时光》中,作者感受到认同和热爱某事的重要性,以及团队合作的意义。 \n - 这一体验让他更理解自己投入事物是出于认可,而非其他动机。\n\n5. **未来展望**: \n - 作为“最好的年龄”,作者反思如何度过这一时期,面对选择时的内心挣扎。 \n - 他意识到明年可能会有更为急迫的决定,需要权衡现状与改变。\n\n总体而言,文章深入探讨了作者在生活、工作和个人成长方面的复杂思考,展现了他对自身处境的深刻洞察和内心的矛盾。"
"**答案:**\n\n在面对人生的重要决策时,保持理性和自我反思至关重要。以下是根据文章内容总结出的关键点:\n\n1. **身体状况**:\n - 20多岁是人类的巅峰年龄,身体素质随着年龄增长逐渐下降。\n - 年龄带来的变化需要被认可,不能否定自身成长。\n\n2. **工作与生活平衡**:\n - 当前稳定的工作和生活状态不容忽视,但也要识别其局限性。\n - 大城市的资源和机会值得利用,但需以实际收益来衡量。\n\n3. **内心需求与选择**:\n - 明年面临的选择需要谨慎权衡,既要珍惜已有成就,也要追求自我提升。\n - 决策应基于自身价值观和长期规划,而非外界压力。\n\n4. **心理状态**:\n - 在选择时,不要被短期困扰所左右,保持内心的平和与开放态度。\n - 面对变化,不可避免地会有挑战,但每个决定都有其必然性。\n\n5. **自我认同与投入**:\n - 投入事业或活动应基于个人认可和意义感,非外在因素驱动。\n - 理性决策虽重要,但情感因素不可忽视,需找到两者的平衡点。\n\n总之,在选择时,既要理性评估现状,也要勇于面对变化,最终做出符合自我价值的决定。明年或许会有新的挑战,但每一次选择都是成长的机会。"
],
"metadata": {
"summarizer": "ollama",
"model": "deepseek-r1:8b"
},
"endTime": "2025-02-15T02:05:15.653Z",
"startTime": "2025-02-15T02:05:01.232Z"
"endTime": "2025-02-15T02:48:55.197Z",
"startTime": "2025-02-15T02:48:39.536Z"
}
]
}
39 changes: 10 additions & 29 deletions contents/20250214-summarize-article-by-llm-inference/cn.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
---
id: summarize-article-by-llm-inference
date: 2025-02-14 23:54
title: 用大模型总结文章:效果绝佳!
title: 用大模型总结文章:玄学,但是效果很好
lang: cn
tags:
- blog
Expand Down Expand Up @@ -31,15 +31,13 @@ related:

# 用Azure AI部署的DeepSeek R1总结文章

[Azure AI](https://ai.azure.com)是一个微软做的Model as a service平台,可以直接在上面部署、使用、微调模型,不需要自己管理基础设施。

我一直都知道这个平台,但是一直没能用上;直到这时,我想起来,是不是可以用大模型来帮我总结文章?
实话说,我很少直接和大模型聊天。我使用AI基本只有让Copilot回答编程问题以及生成代码,在编程场景之外我基本完全不用AI,所以也一直不知道怎么把AI应用到我自己的工作和生活流中。我的工作也和AI毫无关系,即使公司策略是All in AI,但是我组仍然和AI似乎扯不上边。

并且,DeepSeek R1模型发布后没几天,Azure AI可以直接就支持了部署([公告](https://azure.microsoft.com/en-us/blog/deepseek-r1-is-now-available-on-azure-ai-foundry-and-github/)),甚至没有价格表,意思是……
而此时,需求终于来了,为何不让大模型帮我总结文章?

**它是免费的?**
[Azure AI](https://ai.azure.com)是一个微软做的Model as a service平台,可以直接在上面部署、使用、微调模型,不需要自己管理基础设施。DeepSeek R1模型发布后没几天,Azure AI可以直接就支持了部署([公告](https://azure.microsoft.com/en-us/blog/deepseek-r1-is-now-available-on-azure-ai-foundry-and-github/)),甚至没有价格表,意思是:**它是免费的?**

想到这里,我立刻去Azure AI上注册了Project,部署了DeepSeek R1。
我立刻去Azure AI上注册了Project,部署了DeepSeek R1。

用Azure AI部署模型非常方便:

Expand Down Expand Up @@ -101,32 +99,15 @@ Windows版本的Ollama会在本地`11434`端口启动Ollama的API([定义](htt

> Summarize the article in the next message in language ${languageCode} in 100 words. Return the result in plain text format, without any other information.
于是,我试了多次其中Prompt,终于找到了一个Prompt,貌似能把这些要求满足得好一点。

> Summarize the article in the next message in language ${languageCode}. Return must be plain text. Don't include any markdown things!! And it must contain less than 100 words or characters.\n${text}
1. 中文prompt(不知道有没有关系)
2. 强调不包含markdown(甚至说markdown tags都没用……)
3. 强调字数要求
4. 并直接把文本附在prompt后面(不知道到底有没有起效)

在这个Prompt下,2024年总结得到了还行的结果:
我试了很多次prompt,仍然没找到什么方法能够让它同时满足这三个需求。同一个提示词,有时候能生成不含markdown的文本,有时候生成又包含;文字字数的限制也是不一定生效。

> 在这个阶段,我觉得最适合我的方式可能就是保持稳定,同时寻找可以逐步改变的机会。比如,每个季度给自己设定一个小目标,逐步提升,而不是突然做出大改变。这样既能维持现状,又能有所进步,不至于让自己过分紧张。同时,也要留下一些时间来尝试新事物,看看是否有领域值得投入更多的精力。毕竟,保持开放的心态也很重要,这样才能在未来面对新的选择时更好地做出判断。\n\n关于身体素质的问题,我觉得这是正常的衰退过程,每个人的体能都会随着年龄增长而变化。但是,可以通过合理安排时间,进行一些轻度锻炼,比如散步或者简单的运动,这样可以帮助保持相对好的身体状态。同时,也要注意作息和饮食习惯,这些都对身体素质有积极影响。\n\n在职业发展方面,我觉得当前的工作已经为自己提供了很好的平台,如果能持续学习和提升,完全可以在未来的职业生涯中保持竞争力。此外,可以多拓展一些人际网络,了解更多行业动态,这样也能为未来做准备。不过,也要注意不要过分追求结果,而是享受工作过程本身,这样才能达到更好的心理成全。\n\n关于游戏的时间管理,我觉得找到一个平衡点非常重要。可以把游戏作为放松的一种方式,但不应该占用太多时间影响到其他方面的生活和工作。比如,限定每天或每周的玩游戏时间,这样既能享受游戏带来的乐趣,又不会让其他部分受到负面影响。\n\n总的来说,我认为保持稳定是当前阶段的一个重要平衡点,但同时也需要为未来的发展做好准备。这需要在行动上找到一种适合自己的方式,既不压力过大,也能保持内心的活力和满足感
试了多次也没获得好的结果。小模型的效果确实和大模型没法比。听说即使到14B,效果都不是很好

但是这个Prompt也不能让它完全听话,比如[7天Hackathon,Web前端极速入门指南](/articles/hackathon-frontend-quick-start)的结果仍然超长和含有markdown字符。这些问题,之后再来当Prompt工程师解决吧。

> 为了有效应用前端开发技巧,以下是一个结构化的解决方案:\n\n1. **框架选择**:\n - 选择 React、Vue 或 Angular 中的一种。React 和 Vue 在流行度上较高,适合新手入门。\n\n2. **组件库使用**:\n - 使用 Ant Design 或 Material-UI 等现成的组件库,快速构建界面,节省时间并提高效率。\n\n3. **模块化开发**:\n - 采用 React 的组件化思维或 Vue 的单文件组件结构,将代码分为多个功能模块,便于管理和维护。\n\n4. **Mock服务器**:\n - 学习搭建 Mock 数据,使用 Axios 等库的 Mock 功能模拟接口,确保前后端同步开发。\n\n5. **单元测试**:\n - 使用 React Testing Library 编写基础测试案例,重点关注关键功能,如用户登录或数据展示页面。\n\n6. **TypeScript学习**:\n - 投资时间学习 TypeScript,了解其静态类型优势,减少代码错误并提高开发效率。学习 JSX 以简化组件编写。\n\n7. **持续集成工具**:\n - 学习 Travis CI 等工具的基本配置和操作,整合到开发流程中,实现自动化测试和部署。\n\n8. **资源利用**:\n - 阅读推荐的文章和教程,特别是针对新手的入门指南,系统学习各项工具和技术。\n\n通过以上步骤,可以快速掌握前端开发的关键技能,不仅提高工作效率,还能应对实际项目中的挑战。

小模型的效果确实和大模型没法比。听说即使到14B,效果都不是很好。推理过程中GPU计算量不大,主要是占了很多的显存。看来接下来换个16G显存的显卡,应该就可以跑更高级的模型了。
推理过程中GPU计算量不大,主要是占了很多的显存。看来接下来换个16G显存的显卡,应该就可以跑更高级的模型了。

![运行推理过程的GPU占用](r1-8b.png)

# 总结

实话说,我很少直接和大模型聊天。我使用AI基本只有让Copilot回答编程问题以及生成代码,在编程场景之外我基本完全不用AI,所以也一直不知道怎么把AI应用到我自己的工作和生活流中。我的工作也和AI毫无关系,即使公司策略是All in AI,但是我组仍然和AI似乎扯不上边。

而这次是我第一次真正做LLM相关的功能。虽然仍然只是个API Boy,但也体验了一个简单但完整的LLM应用的开发流程,选择模型、部署模型、设计prompt,以及将LLM的输入输出和应用集成起来。
# 代码不是业务逻辑,而是大模型调用脚本

这次体验让我认识到一点,用LLM写功能的流程和传统的软件工程完全不同:

Expand All @@ -138,7 +119,7 @@ Windows版本的Ollama会在本地`11434`端口启动Ollama的API([定义](htt

这种不确定性让我感觉有点不安。传统的软件即使再复杂,如果模块划分合理、测试充分,起码行为是可预测的,也总做或多或少的维护。而用大模型实现的功能,世界上没有人能直到它是怎么运行的,下次能不能用、有没有可能出什么问题,完全靠天决定。

不过AI确实解决了很多之前想都不敢想让机器解决的问题。AI的时代毋庸置疑地到来了。希望以后能在更多地方用到AI
不过AI确实解决了很多之前想都不敢想让机器解决的问题,很多问题也不需要那么精确。希望以后能找到更多大模型适用的使用场景



Original file line number Diff line number Diff line change
@@ -1,29 +1,29 @@
{
"articleId": "summary-article-by-llm-inference",
"articleId": "summarize-article-by-llm-inference",
"lang": "cn",
"hash": "85c6edcc02b719c8ad5713c671bb50898b02ed4abfc5397cabeedbea1a318137",
"hash": "7c12244a86d7ff5aed37ec8fb7bdcc88d8ab56dca1300b75e109bab2944d146d",
"summaries": [
{
"summaries": [
"作者批评Azure AI语言服务的中文摘要效果差,转而通过Azure AI平台部署DeepSeek R1模型,设置特定Prompt后取得优秀效果。对比原服务机械化的关键词堆砌,R1能生成流畅自然的百字总结,并展示多篇文章改进案例。尝试本地部署DeepSeek R1 8B模型时发现小模型存在格式控制和语义理解缺陷,需通过Prompt工程调整。实践揭示LLM应用与传统软件开发的本质差异:业务逻辑内嵌于模型而非代码,提示词成为核心接口,这种黑箱特性带来结果不可预测性,但AI确实解决了传统方法难以实现的语义处理问题"
"作者批评Azure AI Language Service的中文摘要效果差,转而使用Azure部署的DeepSeek R1模型获得显著提升。通过设计精准提示词实现高质量文本摘要,成功应用于个人博客所有文章。尝试本地运行DeepSeek R1 8B版本时,发现小模型存在输出格式不稳定等问题。文章对比了传统编程与AI开发的差异,指出大模型将业务逻辑隐入黑箱带来的不确定性,但认可其突破传统技术限制的价值,期待未来探索更多适用场景"
],
"metadata": {
"summarizer": "azure-ai",
"model": "DeepSeek-R1"
},
"endTime": "2025-02-15T02:08:28.839Z",
"startTime": "2025-02-15T02:07:51.243Z"
"endTime": "2025-02-15T02:51:03.982Z",
"startTime": "2025-02-15T02:49:57.481Z"
},
{
"summaries": [
"<think>\n\n# 如何将AI应用于实际场景:我的初步体验\n\n作为一个AI开发者,我最近开始探索如何将大型语言模型(LLM)应用于实际场景。这次经历让我对LLM的使用流程有了更深刻的理解,同时也意识到其与传统软件工程的显著区别。\n\n在传统软件开发中,业务逻辑是通过代码精确地实现的。无论需求多么复杂,最终都能在代码中找到对应的逻辑。而使用LLM时,整个过程更像是在编写一段提示词,供模型根据上下文生成所需输出。这种模式带来了巨大的灵活性,但同时也增加了不确定性。\n\n我选择了一个特定的模型,并部署它到我的应用中。设计Prompt的过程是关键,因为它直接影响最终的输出结果。不同的Prompt可能会产生完全不同的回复,即使使用相同的输入,也可能得到相似的答案。这让我意识到,编写有效的Prompt是一门艺术,而非科学。\n\n在实际应用中,我遇到了几个挑战。首先,如何确保模型能够准确理解并处理特定的业务规则?其次,如何处理潜在的错误或不确定性?最后,如何将LLM集成到现有的系统中,并与其他组件协同工作。\n\n通过这次体验,我认识到以下几个关键点:\n\n1. **模型选择**:不同模型有不同的特点和限制,需要根据具体需求进行权衡。例如,对于需要高精度的应用,选择训练数据量多的大型模型会更合适。\n\n2. **Prompt设计**:设计有效的Prompt是非常挑战性的。这不仅需要对业务知识的深刻理解,还需要掌握如何引导模型生成所需输出。\n\n3. **错误处理和可靠性**:LLM虽然灵活,但在处理复杂问题时可能会出错。因此,必须有机制来检测和纠正这些错误,或至少在不影响关键业务流程的情况下进行容错处理。\n\n4. **集成与维护**:将LLM集成到现有系统中需要考虑硬件资源、API接口的设计、以及如何持续优化模型性能。这对技术团队提出了更高的要求,尤其是在代码维护和更新方面。\n\n尽管面临诸多挑战,我认为LLM在解决复杂问题和提供创新的可能性方面具有无限潜力。通过不断的探索和实践,我希望能够将这些技术应用于更多实际场景,推动业务的发展与创新。\n\n# 结语\n\n此次使用大型语言模型的经历让我深刻体会到其独特之处。虽然与传统软件开发不同,但LLM为解决复杂问题提供了全新的思路和方法。我期待未来能够将这些技术应用得更加广泛,推动更多领域的进步。"
"这篇文章探讨了作者在“最好的年龄”如何度过这一阶段,涉及身体变化、工作环境不确定性以及内心的挣扎。总结起来,作者通过对工作和游戏的多角度描写,揭示了成熟与不稳定之间的矛盾,并鼓励读者反思自己的生活态度和价值观选择。文章语言流畅,情感真挚,但大模型在生成内容时未能完全满足格式、字数和语言要求,这表明在特定场景下,大模型的使用仍需优化。同时,作者也提到了对传统软件与LLM开发差异的思考,以及硬件升级建议,以支持更大的模型运行"
],
"metadata": {
"summarizer": "ollama",
"model": "deepseek-r1:8b"
},
"endTime": "2025-02-15T02:08:48.295Z",
"startTime": "2025-02-15T02:08:28.841Z"
"endTime": "2025-02-15T02:51:34.865Z",
"startTime": "2025-02-15T02:51:03.983Z"
}
]
}
6 changes: 4 additions & 2 deletions tools/summarize/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ const summarierMap: Record<string, (() => Summarizer) | undefined> = {
"ollama": createOllamaSummarizer,
};

const summarizerOrder = ["azure-ai", "ollama", "azure-language"];

const env = cleanEnv(process.env, {
ENABLED_SUMMARIZERS: str({
desc: "The summarizers to use, separated by ,. Available values: " + Object.keys(summarierMap).join(",") }),
Expand Down Expand Up @@ -135,8 +137,8 @@ async function summarizeArticle(articleDir: string) {
// order by summarizer name
// get indexes of summarizers
summaryFile.summaries.sort((a, b) =>
summarizers.findIndex((x) => x.name === a.metadata.summarizer)
- summarizers.findIndex((x) => x.name === b.metadata.summarizer),
summarizerOrder.findIndex((x) => x === a.metadata.summarizer)
- summarizerOrder.findIndex((x) => x === b.metadata.summarizer),
);
}
}
Expand Down
7 changes: 4 additions & 3 deletions tools/summarize/ollama.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@ import { Ollama } from "ollama";
import { removeThinkTags } from "./azureAi.js";
import { Summarizer, SummaryResult } from "./index.js";

const generatePrompt = (languageCode: string, text: string) =>
`用100字以内的纯文本(不要包含markdown样式)总结下面这篇文章,用${languageCode}语言: \n\n${text}`;
const generatePrompt = (languageCode: string) =>
`在100字以内总结下面这篇文章,用${languageCode}语言,不要包含markdown,直接返回结果`;

export const createOllamaSummarizer = (): Summarizer => {
const env = cleanEnv(process.env, {
Expand All @@ -16,7 +16,7 @@ export const createOllamaSummarizer = (): Summarizer => {
return {
name: "ollama",
summarize: async (text: string, languageCode: string): Promise<SummaryResult[]> => {
const prompt = generatePrompt(languageCode, text);
const prompt = generatePrompt(languageCode);

const ollama = new Ollama({
host: env.OLLAMA_LOCAL_ENDPOINT,
Expand All @@ -29,6 +29,7 @@ export const createOllamaSummarizer = (): Summarizer => {
stream: false,
messages: [
{ role: "user", content: prompt },
{ role: "user", content: text },
],
});

Expand Down

0 comments on commit 2f6c549

Please sign in to comment.