ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Web-Dev-For-Beginners 之 AI Framework:用 LangChain 与 GitHub Models 构建生产级智能应用

Web-Dev-For-Beginners 之 AI Framework:用 LangChain 与 GitHub Models 构建生产级智能应用 Web-Dev-For-Beginners 之 AI Framework用 LangChain 与 GitHub Models 构建生产级智能应用【免费下载链接】Web-Dev-For-Beginners24 Lessons, 12 Weeks, Get Started as a Web Developer项目地址: https://gitcode.com/GitHub_Trending/we/Web-Dev-For-Beginners本教程源自 Web-Dev-For-Beginners 课程的第 10 课「AI Framework」。它以 LangChain 为具体载体讲解如何用 AI 框架把复杂的模型接入、对话记忆、工具调用与文档检索等任务封装成简洁的 Python 方法调用并基于 GitHub Models 免费接入多种大模型。读完本篇你将掌握框架与裸 API 调用的选型判断、消息类型与对话记忆的实现、流式输出、Prompt 模板、结构化输出、工具调用Tool Calling以及 Embeddings 文档处理并最终组合出可上线的编程助手应用。为什么选择 AI 框架三条路线的对比在把 AI 能力接入项目的过程中通常有三条路径可选各有取舍。框架存在的意义正是把「怎么做」交给框架、把「做什么」留给开发者方案优势最适合的场景需要考虑的问题直接 HTTP 请求完全可控、零依赖简单查询、学习底层原理代码冗长、需要手工处理错误SDK 集成样板代码少、有模型厂商优化单模型应用被锁定在特定厂商AI 框架统一 API、内置抽象多模型应用、复杂工作流有学习曲线、可能过度抽象框架带来的实际收益包括将多个 AI 厂商统一到一套接口之下、自动管理对话记忆、提供 Embeddings 与函数调用等现成工具、内置错误处理与重试逻辑以及把复杂工作流转化为可读的方法调用。经验法则当需要在不同模型之间切换或构建 Agent、记忆、工具调用等复杂特性时优先选择框架当处于学习基础阶段或构建简单、聚焦的应用时直接使用厂商 API 反而更合适。⚡ 5 分钟快速起步面向繁忙开发者的快速路径只需 5 分钟即可直观感受到「框架抽象 vs 裸 API」的差别第 1 分钟安装依赖pip install langchain langchain-openai第 2 分钟配置 GitHub Token 并导入ChatOpenAI客户端第 3 分钟用系统消息SystemMessage与用户消息HumanMessage发起一次简单对话第 4 分钟添加一个简单工具如加法函数观察 AI 发起工具调用第 5 分钟对比裸 API 调用与框架抽象的差异快速测试代码如下from langchain_openai import ChatOpenAI from langchain_core.messages import SystemMessage, HumanMessage llm ChatOpenAI( api_keyos.environ[GITHUB_TOKEN], base_urlhttps://models.github.ai/inference, modelopenai/gpt-4o-mini ) response llm.invoke([ SystemMessage(contentYou are a helpful coding assistant), HumanMessage(contentExplain Python functions briefly) ]) print(response.content)这段代码对应的可运行版本就存放在仓库 code/python/app.py 中可以直接作为起步模板。你的第一个 AI Prompt连接 GitHub ModelsLangChain 连接 GitHub Models 只需四个配置参数这也是后续所有例子的共同基础from langchain_openai import ChatOpenAI import os llm ChatOpenAI( api_keyos.environ[GITHUB_TOKEN], base_urlhttps://models.github.ai/inference, modelopenai/gpt-4o-mini, ) # 发送一个简单提问 response llm.invoke(Whats the capital of France?) print(response.content)逐步拆解这个最小示例ChatOpenAI类创建 LangChain 客户端即接入 AI 的入口api_key使用环境变量GITHUB_TOKEN完成身份认证base_url指向 GitHub Models 的推理端点https://models.github.ai/inferencemodel指定使用的模型此处为gpt-4o-mini相当于选择你的 AI 助手invoke()发送请求并等待完整响应这是最常用的同步调用入口response.content提取并展示模型返回的文本内容。预期输出The capital of France is Paris.环境配置提示如果使用 GitHub CodespacesGITHUB_TOKEN已经预先配置好若在本地开发则需要自行创建具有相应权限的 Personal Access Token。一次完整的调用链路为Python 应用调用llm.invoke()→ LangChain 构造 HTTP 请求 → GitHub Models 转发给gpt-4o-mini处理 → 模型生成回答 → 逐层返回至应用读取response.content。构建对话式 AI消息类型与对话记忆单次问答只是「一问一答」而真实应用要求 AI 记住聊过的内容。LangChain 通过不同的消息类型来追踪「谁在说什么」消息类型用途示例应用SystemMessage定义 AI 的人格与行为「你是一个乐于助人的编程助手」HumanMessage表示用户的输入「解释一下函数是怎么工作的」AIMessage存储 AI 的回复对话中之前 AI 给出的回答赋予 AI 人格多轮对话示例下面让 AI 扮演《星际迷航》中的皮卡德舰长通过SystemMessage设定角色再用HumanMessage发起首个提问from langchain_core.messages import HumanMessage, SystemMessage from langchain_openai import ChatOpenAI import os llm ChatOpenAI( api_keyos.environ[GITHUB_TOKEN], base_urlhttps://models.github.ai/inference, modelopenai/gpt-4o-mini, ) messages [ SystemMessage(contentYou are Captain Picard of the Starship Enterprise), HumanMessage(contentTell me about you), ] # works response llm.invoke(messages) print(response.content)这段对话示例的完整版本见仓库 code/python/app-chat.py其中演示了关键的多轮技巧把每次的response即AIMessage与新的HumanMessage追加回消息列表再次调用llm.invoke()模型就能基于完整对话历史给出上下文相关的回答# 第一次调用 response llm.invoke(messages) print(response.content) print(---- Next ----) # 追加 AI 回复与新的用户提问保持对话连续性 messages.append(response) messages.append(HumanMessage(contentNow that I know about you, Im Chris, can I be in your crew?)) response llm.invoke(messages) print(response.content)两次调用分别传入[SystemMessage, HumanMessage]与[SystemMessage, HumanMessage, AIMessage, HumanMessage]。第二次请求时模型已经「看到」全部上下文因此能自然地回应「Chris 想加入船员」的请求——这就是框架把「对话记忆」这一易错细节封装掉的核心价值。流式响应让对话像 ChatGPT 一样实时输出ChatGPT 那种逐字「打字」的效果就是流式Streaming输出。LangChain 只需在构造客户端时开启streamingTrue并改用llm.stream()遍历数据块from langchain_openai import ChatOpenAI import os llm ChatOpenAI( api_keyos.environ[GITHUB_TOKEN], base_urlhttps://models.github.ai/inference, modelopenai/gpt-4o-mini, streamingTrue ) # 流式接收回答 for chunk in llm.stream(Write a short story about a robot learning to code): print(chunk.content, end, flushTrue)流式输出的价值在于内容边生成边展示用户无需干等空白屏幕感知上更「快」用户可以在 AI 仍在「思考」时就开始阅读。对于代码讲解、创意写作、详细教程等长回答流式是显著提升体验的关键手段。体验提示流式尤其适合长回答场景——让用户看到进度而不是盯着空白页面等待。Prompt 模板可复用的提示词结构Prompt 模板让你把提示词结构固定下来运行时只需替换变量避免手工字符串拼接。使用ChatPromptTemplate.from_messages定义模板其中以元组(角色, 内容)形式声明消息{concept}、{language}等花括号内为占位变量from langchain_core.prompts import ChatPromptTemplate # 定义代码讲解模板 template ChatPromptTemplate.from_messages([ (system, You are an expert programming instructor. Explain concepts clearly with examples.), (human, Explain {concept} in {language} with a practical example for {skill_level} developers) ]) # 用不同取值复用同一模板 questions [ {concept: functions, language: JavaScript, skill_level: beginner}, {concept: classes, language: Python, skill_level: intermediate}, {concept: async/await, language: JavaScript, skill_level: advanced} ] for question in questions: prompt template.format_messages(**question) response llm.invoke(prompt) print(fTopic: {question[concept]}\n{response.content}\n---\n)模板带来的直接收益整个应用的提示词保持一致、不再有凌乱的字符串拼接、AI 行为因结构稳定而可预期、更新只需改动模板一处即可全局生效。结构化输出让 AI 返回可解析的 JSON裸 API 返回的纯文本难以直接对接数据库或接口。LangChain 结合 Pydantic 模型与JsonOutputParser可以要求模型按既定 Schema 返回结构化数据。下面的CodeReview模型定义了代码评审的四项字段from langchain_core.prompts import ChatPromptTemplate from langchain_core.output_parsers import JsonOutputParser from pydantic import BaseModel, Field class CodeReview(BaseModel): score: int Field(descriptionCode quality score from 1-10) strengths: list[str] Field(descriptionList of code strengths) improvements: list[str] Field(descriptionList of suggested improvements) overall_feedback: str Field(descriptionSummary feedback) # 设置解析器 parser JsonOutputParser(pydantic_objectCodeReview) # 创建带格式指令的提示词 prompt ChatPromptTemplate.from_messages([ (system, You are a code reviewer. {format_instructions}), (human, Review this code: {code}) ]) # 用管道操作符组合成链prompt - llm - parser chain prompt | llm | parser code_sample def calculate_average(numbers): return sum(numbers) / len(numbers) result chain.invoke({ code: code_sample, format_instructions: parser.get_format_instructions() }) print(fScore: {result[score]}) print(fStrengths: {, .join(result[strengths])})注意这里chain prompt | llm | parser是 LangChain 的标志性写法——用|把提示词、模型与解析器串联成一条流水线最终直接得到字典形式的结果。parser.get_format_instructions()会自动生成告知模型如何输出的格式说明。结构化输出的优势返回格式每次都一致、可直接写入数据库或对接 API、异常响应在进入应用前就被「拦截」、代码可读性与可维护性显著提升。工具调用赋予 AI 实际执行能力工具Tool是让 AI 超越「对话」去「做事」的关键机制。开发者描述可用工具模型在收到匹配请求时返回工具调用意图由应用侧执行真实逻辑。用 TypedDict 定义工具蓝图LangChain 支持用TypedDict声明工具参数 Schema配合typing_extensions的Annotated标注类型、默认值与描述from typing_extensions import Annotated, TypedDict class add(TypedDict): Add two integers. # 注解依次为类型、默认值... 表示必填、描述 a: Annotated[int, ..., First integer] b: Annotated[int, ..., Second integer] tools [add] functions { add: lambda a, b: a b }这里add类本质是给 LLM 看的「工具说明书」而functions字典是应用侧的执行箱——当模型决定调用某工具时按名称取到对应实现并执行。绑定工具并触发调用用llm.bind_tools(tools)把工具清单告知模型之后调用返回结果中tool_calls属性即可能被填充llm ChatOpenAI( api_keyos.environ[GITHUB_TOKEN], base_urlhttps://models.github.ai/inference, modelopenai/gpt-4o-mini, ) llm_with_tools llm.bind_tools(tools) query What is 3 12? res llm_with_tools.invoke(query) if(res.tool_calls): for tool in res.tool_calls: print(TOOL CALL: , functions[tool[name]](**tool[args])) print(CONTENT: ,res.content)当tool_calls非空时每个元素包含name要调用的工具名与args调用参数用functions[tool[name]](**tool[args])即可执行。运行上述代码的预期输出TOOL CALL: 15 CONTENT:模型根据工具的名称、描述与字段规格自主判断「3 12」属于add工具的职责——这正是工具调用的决策过程。调用真实 Web API 的工具实际生产中的工具往往要执行复杂操作比如请求外部 Web API。下面的joke工具通过 chucknorris.io 的公开接口获取笑话class joke(TypedDict): Tell a joke. category: Annotated[str, ..., The joke category] def get_joke(category: str) - str: response requests.get(fhttps://api.chucknorris.io/jokes/random?category{category}, headers{Accept: application/json}) if response.status_code 200: return response.json().get(value, fHeres a {category} joke!) return fHeres a {category} joke! functions { add: lambda a, b: a b, joke: lambda category: get_joke(category) } query Tell me a joke about animals工具调用的完整决策流程是用户请求 → LangChain 分析是否存在可用工具 → 匹配则抽取参数并调用对应函数 → 函数执行 API 请求并返回结果 → 展示给用户若无匹配工具则直接生成回答。定义工具的三个层次分别是TypedDict的 Schema、函数实现与参数校验。仓库 code/python/app-tools.py 提供了add与joke两个工具合并的完整可运行版本包含绑定、调用与结果打印的全过程是学习本节的直接参考。Embeddings 与文档处理构建语义检索Embeddings 把任意文本转换为多维空间中的数值坐标语义相近的内容在向量空间中彼此靠近从而支撑「理解语义而非关键词」的检索。建立向量库并进行相似度检索from langchain_openai import OpenAIEmbeddings from langchain_community.vectorstores import FAISS from langchain_community.document_loaders import TextLoader from langchain.text_splitter import CharacterTextSplitter # 初始化 Embeddings embeddings OpenAIEmbeddings( api_keyos.environ[GITHUB_TOKEN], base_urlhttps://models.github.ai/inference, modeltext-embedding-3-small ) # 加载并切分文档 loader TextLoader(documentation.txt) documents loader.load() text_splitter CharacterTextSplitter(chunk_size1000, chunk_overlap0) texts text_splitter.split_documents(documents) # 创建向量库 vectorstore FAISS.from_documents(texts, embeddings) # 执行相似度检索 query How do I handle user authentication? similar_docs vectorstore.similarity_search(query, k3) for doc in similar_docs: print(fRelevant content: {doc.page_content[:200]}...)流程要点OpenAIEmbeddings通过 GitHub Models 调用text-embedding-3-small生成向量CharacterTextSplitter以chunk_size1000、chunk_overlap0切分长文本FAISS.from_documents构建向量索引similarity_search(query, k3)返回最相关的 3 个文档片段。多格式文档加载器不同来源的文档可借助 LangChain 社区加载器统一处理from langchain_community.document_loaders import ( PyPDFLoader, CSVLoader, JSONLoader, WebBaseLoader ) pdf_loader PyPDFLoader(manual.pdf) csv_loader CSVLoader(data.csv) json_loader JSONLoader(config.json) web_loader WebBaseLoader(https://example.com/docs) all_documents [] for loader in [pdf_loader, csv_loader, json_loader, web_loader]: docs loader.load() all_documents.extend(docs)借助 Embeddings 可以实现的典型能力真正理解意图的搜索、针对自有文档的问答系统、推荐系统以及内容的自动组织与分类。整体链路为文档 → 文本切分 → 生成 Embeddings → 存入向量库用户查询 → 查询向量化 → 相似度检索 → 返回相关文档 → 交给 AI 生成回答。构建完整 AI 应用一个可对话、会用工具的编程助手把前述能力整合成CodingAssistant类它记住整个对话、拥有两个工具web_search与code_formatter、并能自动执行工具调用from langchain_openai import ChatOpenAI, OpenAIEmbeddings from langchain_core.prompts import ChatPromptTemplate from langchain_core.messages import HumanMessage, SystemMessage, AIMessage from langchain_community.vectorstores import FAISS from typing_extensions import Annotated, TypedDict import os import requests class CodingAssistant: def __init__(self): self.llm ChatOpenAI( api_keyos.environ[GITHUB_TOKEN], base_urlhttps://models.github.ai/inference, modelopenai/gpt-4o-mini ) self.conversation_history [ SystemMessage(contentYou are an expert coding assistant. Help users learn programming concepts, debug code, and write better software. Use tools when needed and maintain a helpful, encouraging tone.) ] # 定义工具 self.setup_tools() def setup_tools(self): class web_search(TypedDict): Search for programming documentation or examples. query: Annotated[str, Search query for programming help] class code_formatter(TypedDict): Format and validate code snippets. code: Annotated[str, Code to format] language: Annotated[str, Programming language] self.tools [web_search, code_formatter] self.llm_with_tools self.llm.bind_tools(self.tools) def chat(self, user_input: str): # 把用户消息追加到对话历史 self.conversation_history.append(HumanMessage(contentuser_input)) # 获取 AI 回复 response self.llm_with_tools.invoke(self.conversation_history) # 若存在工具调用则执行 if response.tool_calls: for tool_call in response.tool_calls: tool_result self.execute_tool(tool_call) print(f Tool used: {tool_call[name]}) print(f Result: {tool_result}) # 把 AI 回复追加到对话历史维持上下文 self.conversation_history.append(response) return response.content def execute_tool(self, tool_call): tool_name tool_call[name] args tool_call[args] if tool_name web_search: return fFound documentation for: {args[query]} elif tool_name code_formatter: return fFormatted {args[language]} code: {args[code][:50]}... return Tool execution completed # 使用示例 assistant CodingAssistant() print( Coding Assistant Ready! Type quit to exit.\n) while True: user_input input(You: ) if user_input.lower() quit: break response assistant.chat(user_input) print(f Assistant: {response}\n)这个应用的架构体现了几项生产级设计类封装LLM 初始化、工具定义、对话逻辑集中在CodingAssistant类中结构清晰、易于扩展记忆管理conversation_history持续追加HumanMessage与 AI 回复保证多轮上下文工具集成bind_tools绑定工具、execute_tool按tool_calls分发执行让 AI 具备对话之外的行动能力确定性交互模式用户输入 → 追加消息 → 模型响应 → 工具执行 → 结果回填流程可预测。这套「对话类 工具系统 记忆管理」的架构模式正是当前主流 AI 应用如各类 Copilot 助手普遍采用的组织方式。综合练习构建你自己的 AI 学习助手目标创建一个帮助学生学习编程概念的 AI 应用提供讲解、代码示例与互动测验。核心需求必做对话式界面实现能跨多轮问题保持上下文的聊天系统至少两个教学工具代码讲解器、概念测验生成器个性化学习支持用系统消息按不同知识水平调整回答回答格式化为测验题实现结构化输出。实施步骤第 1 步环境准备pip install langchain langchain-openai第 2 步基础聊天创建StudyAssistant类、实现对话记忆、添加面向学习支持的人格配置第 3 步添加教学工具代码讲解器把代码拆解成易懂部分、测验生成器围绕编程概念出题、进度追踪记录已覆盖主题第 4 步可选增强流式响应提升体验、文档加载融入课程材料、Embeddings 做相似内容检索示例骨架class StudyAssistant: def __init__(self, skill_levelbeginner): # 初始化 LLM、工具与对话记忆 pass def explain_code(self, code, language): # 工具解释代码如何工作 pass def generate_quiz(self, topic, difficulty): # 工具生成练习题目 pass def chat(self, user_input): # 主对话接口 pass # 使用示例 assistant StudyAssistant(skill_levelintermediate) response assistant.chat(Explain how Python functions work)评分标准参考功能优秀4良好3合格2待改进1对话连贯性回答自然且感知上下文上下文保持良好基础对话各轮之间无记忆工具集成多个工具无缝协作正确实现 2 个以上工具12 个基础工具工具不可用代码质量整洁、有文档、有错误处理结构良好、部分文档基础功能可运行结构差、无错误处理教学价值真正助力学习、有适应性学习支持良好基础讲解教学价值有限加分挑战加入语音输入/输出用 Streamlit 或 Flask 实现 Web 界面用 Embeddings 从课程材料构建知识库加入进度追踪与个性化学习路径。延伸挑战Agent 模式进一步构建一个CodeReviewAssistant——实现代码复杂度分析与改进建议工具、最佳实践审查工具用 Pydantic 模型保证评审格式一致并用对话记忆追踪多轮评审会话使其能够跨多种编程语言、跨多次代码提交保持上下文同时输出总结评分与详细改进建议。总结从裸 API 到生产级 AI 应用的决策框架至此你已经掌握了 AI 框架开发的核心能力。回顾本文覆盖的知识点框架选型何时用框架、何时用 SDK、何时用裸 APILangChain 基础ChatOpenAI的api_key、base_url、model配置与invoke()调用消息系统SystemMessage、HumanMessage、AIMessage构建结构化对话对话记忆通过持续追加消息保持跨轮上下文流式输出streamingTrue与llm.stream()实现实时回复Prompt 模板ChatPromptTemplate复用提示词结构结构化输出Pydantic JsonOutputParser获取可解析结果工具调用TypedDictSchema bind_toolstool_calls执行链Embeddings向量化、向量库与语义检索支撑文档问答。日常选型可遵循以下决策路径先问「是否是简单单次查询」——是则直接走 HTTP API否则问「是否需要对话记忆」——不需要则用厂商 SDK需要则再问「是否要工具或复杂特性」——不需要则用框架的基础聊天配置需要则进入完整框架实现如 LangChain 工具 记忆 Agent。下一步可以做什么用 LangChain 像逛模型游乐场一样实验不同模型为工作或项目中的真实问题编写工具在此基础上继续探索 AI Agent、RAG结合向量数据库的检索增强生成、多模态 AI 与生产环境的部署监控。你可以随时回看仓库中的 code/python/app.py、code/python/app-chat.py 与 code/python/app-tools.py 三个示例文件把本文每一节代码直接跑通再逐步改造成自己的应用。【免费下载链接】Web-Dev-For-Beginners24 Lessons, 12 Weeks, Get Started as a Web Developer项目地址: https://gitcode.com/GitHub_Trending/we/Web-Dev-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表