单次模型请求

前言

这个只是个人学习的笔记,只为了记录一些个人学习的心得,没有任何教人的想法,也没有那个能力去教导别人。大家看个乐呵就行了,如果存在问题欢迎大家给我指正。

作为开篇已经发布了介绍了一些基础知识大家有兴趣可以看一下,AI Agent 开篇

这个代码系列:主要是记录自己作为程序员一步步通过代码学习如何从0到能开发一个简单的AI Agent

还有另外一个系列是主要学习一些 AI 的原理,会在后续也逐步更新

最后,因为我也是上班族,同时也是个程序猿,空闲时间比较有限,更新不会很稳定,最多一周更新两篇暂定,如果自己学习进度喜人那就努力多发几篇。

1、通过Vibe Coding写代码和让AI在项目中运行这个其实是两个概念

前几天,我的一个做销售的朋友,他是完全不会一点开发的,安装了Hermes Agent之后生成了一个网页版的贪吃蛇小游戏。

这其实就是Vibe Coding,这是一种用AI开发软件的方式。

随着现在主流LLM厂商发布的大模型能力越来越强,大家在使用中也会发现,AI写出的项目完整度越来越高,甚至一些能自己做测试、修改代码等。

但是这里产生一个问题用AI写出来的就是AI应用吗?

其实不是的!

1、如何判断是不是AI应用

我在理解了一段时间后,我认为,如果只是通过AI生成项目且项目内业务没有LLM的参与,那就可以认为不是AI应用。

那这时产生了一个问题,我用AI生成了一个项目里面只有一个小模块有LLM参与,那这个算是AI应用吗?

我个人认为是,因为在项目里一个很小的模块也是在线上功能中执行了对应功能后也是会让AI进行理解、判断、推理和行动等动作。

2、VibeCoding带来的变化

我作为一个程序猿VibeCoding给我带来的感触其实颇多。

首先,之前接手其他人开发的项目后,发现成堆的代码阅读起来十分暴躁,现在通过AI去总结代码可以快速掌握代码的技术核心。

其次,没有AI之前代码都是自己一行一行手敲出来的,有了VibeCoding之后,大部分框架代码都可以用AI快速生成,自己只需要将一些细节打磨完整就好。

最后,之前自测都是需要花费大量时间写脚本抓错误日志,现在将脚本和自测交给AI,可以将大部分精力用于修复Bug。

3、VibeCoding带来的冲击

因为有了VibeCoding,效率必然被提上台面,这就给很多人的工作稳定性带来了冲击,从现在个大厂商不停的裁员也能看的出来。

而且现在工作中的岗位职责和需求的能力,也从原来的代码能力悄悄的转变为阅读代码能力、VibeCoding准确度和熟练度还有就是对于VibeCoding产生的幻觉的辨别能力。

最后总结为一句话就是开发的职场已经从会写代码转变为了会用且高效的使用VibeCoding。

4、我理解的AI应用

我认为是在项目交付后,模型仍在某一个或某些模块中参与功能流程中所需要的理解、判断、推理和行动,才能真正称之为AI应用

2、从一次简单的请求开始

现在不考虑任何业务相关的问题,我就是从代码角度开始,完成的一次模型请求。

这次我会使用三种请求的方式。

1、LangChain的调用方式:
import os
from dotenv import load_dotenv, find_dotenv

from langchain_openai import ChatOpenAI

load_dotenv(find_dotenv())

api_key = os.getenv("KIMI_API_KEY")
if not api_key:
    raise RuntimeError("未找到 KIMI_API_KEY,否则无法运行真实模型请求。")
model_name = os.getenv("MODEL_NAME", "")
base_url = os.getenv("KIMI_BASE_URL", "")
# 注意:不要打印 API Key,密钥属于敏感信息,泄露后可能被盗用
print(f"Model Name: {model_name}")
print(f"Base URL: {base_url}")

def build_model():
    return ChatOpenAI(
        model_name=model_name,
        openai_api_key=api_key,
        base_url=base_url
    )

message = [
    {"role": "system", "content":"你是一个有帮助的助手。"},
    {"role": "user", "content":"什么是人工智能?"}
]
def main():
    llm_response = build_model().invoke(message)
    print(f"LLM Response: {llm_response}")

if __name__ == "__main__":
    main()

请求结果 :

LLM Response: content='# 什么是人工智能?\n\n**人工智能(Artificial Intelligence,简称 AI)** 是指让计算机系统模拟、延伸和扩展人类智能的技术和科学。简单来说,就是让机器能够像人一样"思考"、学习和解决问题。\n\n## 核心能力\n\n人工智能主要模拟人类的以下能力:\n\n- **学习**:从数据中总结规律(如机器学习)\n- **推理**:根据已知信息得出结论\n- **感知**:识别图像、语音、文字(如人脸识别、语音识别)\n- **理解语言**:与人类进行自然交流(如 ChatGPT)\n- **决策**:在复杂环境中做出选择(如自动驾驶)\n\n## 主要类型\n\n1. **弱人工智能(ANI)**:专注于特定任务的 AI,如语音助手、推荐系统、下棋程序。目前所有实际应用的 AI 都属于这一类。\n\n2. **强人工智能(AGI)**:具有与人类相当的通用智能,能处理各种任务。目前尚未实现。\n\n3. **超人工智能(ASI)**:超越人类智能的假想阶段,目前仅存在于理论讨论中。\n\n## 常见应用\n\n- 🗣️ **智能助手**:Siri、小爱同学\n- 📱 **推荐算法**:短视频、购物推荐\n- 🚗 **自动驾驶**:特斯拉、Waymo\n- 🏥 **医疗诊断**:影像识别、药物研发\n- ✍️ **生成式 AI**:ChatGPT、文心一言等\n\n人工智能正在深刻改变我们的生活和工作方式,被誉为继蒸汽机、电力、互联网之后的又一场技术革命。\n\n有什么具体的方面想深入了解吗?比如机器学习、深度学习,或者某个应用领域?' additional_kwargs={'refusal': None} response_metadata={'token_usage': {'completion_tokens': 368, 'prompt_tokens': 105, 'total_tokens': 473, 'completion_tokens_details': {'accepted_prediction_tokens': None, 'audio_tokens': None, 'reasoning_tokens': 33, 'rejected_prediction_tokens': None}, 'prompt_tokens_details': None}, 'model_provider': 'openai', 'model_name': 'kimi-k3', 'system_fingerprint': None, 'id': 'chatcmpl-B1SUSXU31D6A3qRs44jcP5Hn', 'finish_reason': 'stop', 'logprobs': None} id='lc_run--01a019aa-4045-7302-bd19-e35d824171df-0' tool_calls=[] invalid_tool_calls=[] usage_metadata={'input_tokens': 105, 'output_tokens': 368, 'total_tokens': 473, 'input_token_details': {}, 'output_token_details': {'reasoning': 33}}
2、OpenAI的调用方式:
import os
from dotenv import load_dotenv, find_dotenv
from openai import OpenAI

load_dotenv(find_dotenv())

api_key = os.getenv("KIMI_API_KEY")
if not api_key:
    raise RuntimeError("未找到 KIMI_API_KEY,否则无法运行真实模型请求。")
model_name = os.getenv("MODEL_NAME", "")
base_url = os.getenv("KIMI_BASE_URL", "")
# 注意:不要打印 API Key,密钥属于敏感信息,泄露后可能被盗用
print(f"Model Name: {model_name}")
print(f"Base URL: {base_url}")

message = [
    {"role": "system", "content":"你是一个有帮助的助手。"},
    {"role": "user", "content":"什么是人工智能?"}
]

def main():
    client = OpenAI(
        api_key=api_key,
        base_url=base_url
    )
    llm_response = client.chat.completions.create(
        model=model_name, 
        messages=message,
        max_tokens=100)
    print(f"LLM Response: {llm_response}")


if __name__ == "__main__":
    main()

请求结果:

LLM Response: ChatCompletion(id='chatcmpl-OXlUwSePIJ3ev9ovkVaHzhQD', choices=[Choice(finish_reason='length', index=0, logprobs=None, message=ChatCompletionMessage(content='人工智能(AI)是让计算机或机器完成通常需要人类智能才能做的任务的技术,比如理解语言、识别图像、做决策、推理、学习和创作内容。\n\n它的核心是:从数据或经验中发现规律,并把这些规律用到新情况上。常见技术包括机器学习、深度学习、自然语言处理、计算机视觉和机器人等。\n\n例子:语音助手、推荐系统、翻译软件、自动驾驶、医学影像分析,以及像我这样的对话式 AI。\n\n现在大多数 AI 属于', refusal=None, role='assistant', annotations=None, audio=None, function_call=None, tool_calls=None, reasoning_content='用户问"什么是人工智能?"这是一个基础概念问题。需要用中文回答,清晰简洁,定义AI,涵盖核心要点:让机器执行通常需要人类智能的任务;包括学习、推理、感知、语言理解、决策等;技术分支如机器学习、深度学习、自然语言处理、计算机视觉、机器人;应用例子;与人类的区别/局限。注意避免过长。可以提强AI弱AI但不必深。需要给出易懂类比。最终回答中文。确保内容准确:人工智能是计算机科学分支,目标是构建能从数据/经验中学习、泛化到新情况的系统。现代AI多为弱人工智能。可以提生成式AI。结尾可以问是否需要例子。'))], created=1787152250, model='kimi-k3', object='chat.completion', moderation=None, service_tier=None, system_fingerprint=None, usage=CompletionUsage(completion_tokens=244, prompt_tokens=105, total_tokens=349, completion_tokens_details=CompletionTokensDetails(accepted_prediction_tokens=None, audio_tokens=None, reasoning_tokens=137, rejected_prediction_tokens=None), prompt_tokens_details=None))
3、Agently的调用方式:
import os
from dotenv import load_dotenv, find_dotenv

from agently import Agently

load_dotenv(find_dotenv())

api_key = os.getenv("KIMI_API_KEY")
if not api_key:
    raise RuntimeError("未找到 KIMI_API_KEY,否则无法运行真实模型请求。")
model_name = os.getenv("MODEL_NAME", "")
base_url = os.getenv("KIMI_BASE_URL", "")
# 注意:不要打印 API Key,密钥属于敏感信息,泄露后可能被盗用
print(f"Model Name: {model_name}")
print(f"Base URL: {base_url}")

def build_model():
    Agently.set_settings(
        "OpenAICompatible",
        {
            "base_url": base_url,
            "api_key": api_key,
            "model": model_name,
        },
    )

def main():
    build_model()
    result = Agently.create_agent().system("你是一个有帮助的助手。").input("什么是人工智能?").output({
                "content": (str, "一句话定位"),
                "highlights": [
                    {
                        "title": (str, "亮点标题"),
                        "detail": (str, "一句话描述"),
                    }
                ],
            }).start()
    print(f"LLM Response: {result}")


if __name__ == "__main__":
    main()

请求结果:

LLM Response: {'content': '人工智能是让计算机系统模拟人类感知、学习、推理、决策与创造能力,以完成通常需要智能才能完成任务的技术与方法体系。', 'highlights': [{'title': '核心能力', 'detail': '包括理解语言、识别图像、规划决策、生成内容和从经验中持续学习。'}, {'title': '关键技术', 'detail': '主要依赖机器学习、深度学习、自然语言处理、计算机视觉和强化学习等方法。'}, {'title': '典型应用', 'detail': '广泛用于智能助手、推荐系统、自动驾驶、医疗影像、工业质检和金融风控等场景。'}, {'title': '发展边界', 'detail': '当前多数系统仍属于面向特定任务的弱人工智能,距离通用人类水平智能仍有差距。'}]}

3、三种请求方式对比

上面三种方式我都实际跑了一遍,拿到的结果都能正常返回。下面我从代码阅读性、使用方便程度、学习难度三个方面说说我自己的感受,纯属个人主观体验,仅供参考。

1、代码阅读性

OpenAI SDK:★★★★

这个是最接近"裸请求"的写法,messages 数组长什么样、发出去的是什么,全都摆在明面上。拿回来的虽然是完整的 ChatCompletion 对象(带着 usage、finish_reason 这些字段),但它的结构和官方 API 文档里的响应格式一一对应,没有二次封装,对照文档就能看懂。

LangChain:★★★☆

代码本身也不难读,但它把响应包成了自己的 AIMessage 对象,字段名和官方 API 对不上,第一次看输出会一脸懵——我只是想要个回答,怎么给我返回了这么长一串东西?好处是 token 用量这些信息直接就能拿到。

Agently:★★★★☆

从打印结果看,Agently 的输出是三种里最干净的——只有回答本身。代码也是链式调用,读起来像一句自然语言。扣掉的半星在于它隐藏了太多细节:消息数组去哪了?请求是怎么发的?不看文档根本不知道底层做了什么,对想搞清楚"一次请求到底发生了什么"的初学者来说,这种黑盒感不太友好。

2、使用方便程度

Agently:★★★★★

单论"写起来爽",Agently 是最舒服的。链式调用一气呵成,还自带 Agent 的抽象(角色设定、输入输出都是方法),后续要做结构化输出、工具调用这些进阶功能时,它的语法优势会更明显。

LangChain:★★★★

LangChain 的优势不在单次请求,而在生态。它把各家模型统一成了同一套接口,今天用 Kimi、明天换 DeepSeek、后天换 GPT,业务代码基本不用动。如果项目里要做 RAG、多轮对话、工具链这些复杂流程,LangChain 的现成组件能省很多事。只为发一次请求的话,用它有点杀鸡用牛刀。

OpenAI SDK:★★★☆

单次请求用起来也不麻烦,但什么都得自己来:消息历史自己维护、返回结果自己解析、错误重试自己写。功能少即是多——没有魔法,也没有现成的轮子。

另外这次请求还踩了个小坑:我设置了 max_tokens=100,结果回答被截断了(finish_reason='length'),这也说明用 SDK 时这些参数细节都得自己操心。

3、学习难度

OpenAI SDK:★(最简单)

只要理解 system / user / assistant 三种角色和 messages 数组的结构,基本就会用了。学习成本几乎等于学习一次 HTTP 请求的成本,而且官方文档和网上的资料也是最多的。

Agently:★★

入门其实很快,跟着例子抄一遍就能跑通。但它有自己一套 API 范式,各种链式方法需要翻文档才能记住,遇到问题能搜到的资料也相对少一些。

LangChain:★★★★(最难)

LangChain 的概念最多:Chain、Prompt Template、Memory、Output Parser、Agent……每个概念都要单独花时间理解。而且它的版本迭代很快,网上很多教程的写法已经过时了,新手很容易踩"照着教程抄却报错"的坑。建议先用 OpenAI SDK 把一次请求的完整流程搞明白,再回来学 LangChain 会顺很多。

4、总结
维度 OpenAI SDK LangChain Agently
代码阅读性 ★★★★ ★★★☆ ★★★★☆
使用方便程度 ★★★☆ ★★★★ ★★★★★
学习难度(星越多越难) ★★★★ ★★

我自己的选择倾向是:学习阶段用 OpenAI SDK(能把请求的每个细节看清楚),做复杂项目用 LangChain 或 Agently(生态和抽象能力会帮你省掉大量重复劳动)。

不过这些都是建立在"发一次简单请求"这个场景下的感受,后续学到多轮对话、工具调用的时候,这个对比的结论可能还会变,到时候再更新。

4、结束语

这篇先聊了 Vibe Coding 和 AI 应用的区别——用 AI 写代码不代表写出来的就是 AI 应用,关键看项目交付后,模型是否还在功能流程中参与理解、判断、推理和行动。然后从一次最简单的模型请求出发,用 LangChain、OpenAI SDK、Agently 三种方式分别调了一遍,并从代码阅读性、使用方便程度、学习难度三个维度做了对比:学习阶段适合用 OpenAI SDK 把请求的每个细节看清楚,做复杂项目时 LangChain 和 Agently 的生态和抽象能力会更省力。

我也是第一次写这种学习记录,不知道这样写好不好,但是我尽量把自己学到的知识都展示出来,希望可以在写的过程中将知识捋顺,也加深自己的记忆。

下一期应该会记录自己学习数据结构化输出控制操作,暂时还没想好怎么展示,需要一些时间构思一下。

也希望能和同样在学习AI Agent开发的同学一起交流讨论。

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐