Phi-3-mini-128k-instruct实战教程vLLM API接入LangChain实现Agent编排1. 引言从单机对话到智能编排你刚刚在本地用vLLM部署了Phi-3-mini-128k-instruct模型也通过Chainlit前端成功进行了对话测试。这感觉不错对吧模型响应快回答质量也让人满意。但你可能马上会想如果我想让这个模型不只是回答问题而是能帮我完成更复杂的任务呢比如让它读取网页内容后总结或者分析本地文档甚至根据我的需求自动调用不同的工具这就是我们今天要解决的问题。传统的单次问答就像让一个专家坐在你对面你问一句他答一句。而Agent编排则是给这位专家配了一个智能助理团队——有人负责查资料有人负责写代码有人负责分析数据专家则负责统筹协调最终给你一个完整的解决方案。本文将带你一步步实现这个转变。我们将把vLLM部署的Phi-3-mini-128k-instruct通过API接入LangChain框架构建一个能够自主规划、执行多步任务的智能Agent。整个过程不需要复杂的配置代码清晰易懂即使你是LangChain的新手也能跟上。2. 环境准备与核心概念2.1 你需要准备什么在开始之前确保你已经有了以下环境已部署的Phi-3-mini-128k-instruct服务按照之前的教程通过vLLM部署并验证服务正常运行。你可以通过以下命令检查curl http://localhost:8000/v1/completions \ -H Content-Type: application/json \ -d { model: phi-3-mini-128k-instruct, prompt: Hello, max_tokens: 50 }如果看到返回的JSON中包含生成的文本说明服务正常。Python环境建议使用Python 3.8或更高版本。基础Python包我们将安装必要的依赖。2.2 快速理解几个核心概念在深入代码之前我们先花几分钟理解几个关键概念这能让你更好地理解后面的每一步在做什么。vLLM API你可以把它想象成模型的服务窗口。vLLM部署后会提供一个标准的HTTP接口其他程序比如我们的LangChain应用可以通过这个接口向模型发送请求、获取回复。这就像餐厅的后厨模型通过传菜窗口API为前厅应用提供服务。LangChain这是一个构建AI应用的工具箱。它提供了各种标准化的组件让你能像搭积木一样快速构建复杂的AI应用。不用自己从头写网络请求、处理响应、管理对话历史等繁琐的细节。Agent在LangChain中Agent不是指一个固定的程序而是一个决策者执行者的组合。它能够理解你的意图决定需要哪些工具按什么顺序使用这些工具最后整合结果给你。想象一下你告诉助理帮我查一下明天的天气如果下雨就提醒我带伞助理会先查天气再根据结果决定是否提醒你——这就是Agent的工作方式。工具ToolsAgent可以调用的具体功能比如搜索网页、计算数学、读写文件等。每个工具就像一件专用工具Agent根据任务需要选择合适的工具。3. 基础接入让LangChain认识你的模型3.1 安装必要的库首先创建一个新的Python环境或使用现有的环境安装必要的包pip install langchain langchain-community requests这里我们安装了三个包langchain核心框架langchain-community社区贡献的各种工具和集成requests用于发送HTTP请求3.2 创建基础的模型连接现在让我们创建一个最简单的连接测试LangChain能否正常调用你的Phi-3模型。创建一个新文件basic_connection.pyfrom langchain_community.llms import VLLMOpenAI # 配置vLLM API的连接 llm VLLMOpenAI( openai_api_keynot-needed, # vLLM不需要真正的API key openai_api_basehttp://localhost:8000/v1, # 你的vLLM服务地址 model_namephi-3-mini-128k-instruct, # 模型名称 max_tokens512, # 最大生成token数 temperature0.7, # 创造性0-1之间越高越有创意 ) # 测试连接 response llm.invoke(请用一句话介绍你自己。) print(模型回复, response)运行这个脚本python basic_connection.py如果一切正常你应该能看到Phi-3模型的自我介绍。这证明LangChain已经成功连接到了你的vLLM服务。3.3 理解连接配置参数让我们仔细看看上面代码中的几个关键参数openai_api_base这是vLLM服务的地址。默认情况下vLLM会在8000端口提供服务路径为/v1。如果你修改了端口或路径需要相应调整。model_name必须和你部署的模型名称完全一致这里是phi-3-mini-128k-instruct。max_tokens控制生成文本的最大长度。Phi-3-mini支持128K上下文但实际生成时可以根据需要调整。temperature控制输出的随机性。0.0表示完全确定性的输出每次相同1.0表示最大随机性。对于大多数任务0.7是个不错的起点。4. 构建你的第一个智能Agent4.1 添加基础工具现在模型连接通了让我们给它增加一些能力。我们将创建两个简单的工具一个计算器和一个文本长度统计器。创建新文件first_agent.pyfrom langchain.agents import initialize_agent, AgentType from langchain.tools import Tool from langchain_community.llms import VLLMOpenAI import math # 1. 初始化模型连接和之前一样 llm VLLMOpenAI( openai_api_keynot-needed, openai_api_basehttp://localhost:8000/v1, model_namephi-3-mini-128k-instruct, max_tokens512, temperature0.7, ) # 2. 创建自定义工具 def calculate(expression: str) - str: 计算数学表达式支持加减乘除和常见数学函数 try: # 安全地计算表达式 result eval(expression, {__builtins__: {}}, {math: math}) return f计算结果: {result} except Exception as e: return f计算错误: {str(e)} def count_text(text: str) - str: 统计文本的字符数和单词数 char_count len(text) word_count len(text.split()) return f字符数: {char_count}, 单词数: {word_count} # 3. 将函数包装成LangChain工具 tools [ Tool( nameCalculator, funccalculate, description用于计算数学表达式。输入应该是一个有效的数学表达式比如 2 3 * 4 或 math.sqrt(16) ), Tool( nameTextCounter, funccount_text, description用于统计文本的长度。输入是一段文本输出是字符数和单词数 ) ] # 4. 创建Agent agent initialize_agent( toolstools, llmllm, agentAgentType.ZERO_SHOT_REACT_DESCRIPTION, # 最基础的Agent类型 verboseTrue, # 显示详细的思考过程 handle_parsing_errorsTrue, # 处理解析错误 ) # 5. 测试Agent print( 测试1: 数学计算 ) result1 agent.run(请计算 15 的平方加上 20 除以 4 的结果是多少) print(f最终答案: {result1}\n) print( 测试2: 文本统计 ) result2 agent.run(统计这句话的长度LangChain是一个强大的AI应用开发框架) print(f最终答案: {result2}\n) print( 测试3: 组合任务 ) result3 agent.run(先计算 3.14 * 10 的平方然后统计圆周率计算完成这句话的长度) print(f最终答案: {result3})运行这个脚本你会看到详细的执行过程 测试1: 数学计算 思考我需要计算一个数学表达式。用户问的是15 的平方加上 20 除以 4。我应该用计算器工具。 行动Calculator 行动输入15**2 20/4 观察计算结果: 225.0 5.0 230.0 思考我得到了计算结果现在可以给出最终答案。 最终答案: 15的平方加上20除以4的结果是230.0。4.2 理解Agent的工作流程从上面的输出中你可以看到Agent的思考过程理解任务Agent先分析你的问题理解你需要什么。选择工具根据问题类型决定使用哪个工具Calculator或TextCounter。执行工具使用正确的输入调用工具。分析结果获取工具返回的结果判断是否需要继续使用其他工具。生成最终答案整合所有结果用自然语言回复。这种思考-行动-观察的循环就是ReAct模式的核心。ZERO_SHOT_REACT_DESCRIPTION是LangChain中最基础的Agent类型适合入门学习。5. 接入真实世界工具5.1 添加网络搜索能力基础工具很有用但真正的威力在于连接外部世界。让我们给Agent添加网络搜索能力。首先安装必要的包pip install duckduckgo-search然后创建新文件web_agent.pyfrom langchain.agents import initialize_agent, AgentType from langchain.tools import Tool from langchain_community.llms import VLLMOpenAI from langchain_community.utilities import DuckDuckGoSearchAPIWrapper import math # 1. 初始化模型和搜索工具 llm VLLMOpenAI( openai_api_keynot-needed, openai_api_basehttp://localhost:8000/v1, model_namephi-3-mini-128k-instruct, max_tokens1024, # 搜索可能需要更多token temperature0.3, # 搜索任务需要更确定的答案 ) # 2. 创建搜索工具 search DuckDuckGoSearchAPIWrapper() def search_web(query: str) - str: 搜索网络获取最新信息 try: results search.run(query) # 限制返回长度避免token超限 return results[:1000] if len(results) 1000 else results except Exception as e: return f搜索失败: {str(e)} # 3. 创建所有工具 tools [ Tool( nameWebSearch, funcsearch_web, description用于搜索网络获取最新信息。当需要实时数据、新闻或未知信息时使用此工具。 ), Tool( nameCalculator, funclambda x: str(eval(x, {__builtins__: {}}, {math: math})), description用于计算数学表达式。输入应该是一个有效的数学表达式。 ), ] # 4. 创建支持更多工具的Agent agent initialize_agent( toolstools, llmllm, agentAgentType.STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION, # 支持更复杂的工具调用 verboseTrue, handle_parsing_errorsTrue, max_iterations5, # 限制最大迭代次数避免无限循环 ) # 5. 测试网络搜索能力 print( 测试1: 实时信息查询 ) result1 agent.run(今天北京天气怎么样) print(f答案: {result1}\n) print( 测试2: 综合任务 ) result2 agent.run(搜索最新的AI新闻然后告诉我其中最有趣的一条是什么) print(f答案: {result2}\n) print( 测试3: 计算加搜索 ) result3 agent.run(先计算100美元按当前汇率能换多少人民币然后搜索今天的美元兑人民币汇率) print(f答案: {result3})5.2 处理复杂任务链有时候一个任务需要多个步骤每个步骤可能依赖前一步的结果。让我们看一个更复杂的例子# 继续在web_agent.py中添加 def analyze_sentiment(text: str) - str: 简单的情感分析工具 positive_words [好, 优秀, 棒, 满意, 高兴, 喜欢] negative_words [差, 糟糕, 坏, 不满意, 生气, 讨厌] text_lower text.lower() positive_count sum(1 for word in positive_words if word in text_lower) negative_count sum(1 for word in negative_words if word in text_lower) if positive_count negative_count: return 正面情感 elif negative_count positive_count: return 负面情感 else: return 中性情感 # 添加情感分析工具 tools.append( Tool( nameSentimentAnalyzer, funcanalyze_sentiment, description分析文本的情感倾向。返回正面情感、负面情感或中性情感。 ) ) # 重新初始化Agent agent initialize_agent( toolstools, llmllm, agentAgentType.STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION, verboseTrue, handle_parsing_errorsTrue, max_iterations6, ) print( 测试复杂任务链 ) complex_task 请执行以下任务 1. 搜索关于人工智能的最新新闻 2. 选择其中一条新闻 3. 分析这条新闻内容的情感倾向 4. 如果是正面新闻计算一下AI这个词在新闻中出现的次数 5. 给我完整的分析报告 result agent.run(complex_task) print(f完整报告:\n{result})这个例子展示了Agent如何自主规划任务步骤先搜索再选择然后分析情感最后根据情感结果决定是否进行计数统计。6. 高级应用构建专业领域Agent6.1 创建代码分析Agent让我们构建一个专门用于代码分析的Agent这对于开发者特别有用。创建新文件code_agent.pyfrom langchain.agents import initialize_agent, AgentType from langchain.tools import Tool from langchain_community.llms import VLLMOpenAI import ast import re llm VLLMOpenAI( openai_api_keynot-needed, openai_api_basehttp://localhost:8000/v1, model_namephi-3-mini-128k-instruct, max_tokens1024, temperature0.1, # 代码分析需要高确定性 ) # 代码分析工具集 def check_syntax(code: str) - str: 检查Python代码语法 try: ast.parse(code) return 语法正确 except SyntaxError as e: return f语法错误: {str(e)} def find_bugs(code: str) - str: 查找常见的代码问题 issues [] # 检查未使用的变量 tree ast.parse(code) defined_vars set() used_vars set() for node in ast.walk(tree): if isinstance(node, ast.Name) and isinstance(node.ctx, ast.Store): defined_vars.add(node.id) elif isinstance(node, ast.Name) and isinstance(node.ctx, ast.Load): used_vars.add(node.id) unused_vars defined_vars - used_vars if unused_vars: issues.append(f未使用的变量: {, .join(unused_vars)}) # 检查魔法数字 numbers re.findall(r\b\d\b, code) if len(numbers) 3: issues.append(f发现多个魔法数字: {, .join(numbers[:3])}...) # 检查过长的函数简单行数检查 lines code.strip().split(\n) if len(lines) 50: issues.append(f代码过长 ({len(lines)}行)建议拆分为小函数) return | .join(issues) if issues else 未发现明显问题 def explain_code(code: str) - str: 解释代码功能 prompt f请解释以下Python代码的功能 {code} 请用简单的中文解释这段代码做了什么主要步骤是什么。 return llm.invoke(prompt) # 创建代码分析工具 tools [ Tool( nameSyntaxChecker, funccheck_syntax, description检查Python代码的语法是否正确。输入是Python代码字符串。 ), Tool( nameBugFinder, funcfind_bugs, description查找代码中的常见问题如未使用变量、魔法数字等。输入是Python代码字符串。 ), Tool( nameCodeExplainer, funcexplain_code, description解释代码的功能和逻辑。输入是Python代码字符串。 ), ] # 创建代码分析Agent code_agent initialize_agent( toolstools, llmllm, agentAgentType.STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION, verboseTrue, handle_parsing_errorsTrue, ) # 测试代码 test_code def calculate_stats(numbers): total 0 count 0 for num in numbers: total num count 1 average total / count if count 0 else 0 max_num numbers[0] for num in numbers: if num max_num: max_num num unused_var 42 # 这个变量没有被使用 return { total: total, count: count, average: average, max: max_num } result calculate_stats([1, 2, 3, 4, 5]) print(f总和: {result[total]}) print(f平均值: {result[average]}) print( 代码分析测试 ) print(待分析代码:) print(test_code) print(\n *50 \n) result code_agent.run(f请分析这段代码{test_code}) print(f分析结果:\n{result})6.2 创建文档处理Agent另一个常见需求是处理文档。让我们创建一个能读取、分析和总结文档的Agent。首先安装必要的包pip install python-docx PyPDF2然后创建document_agent.pyfrom langchain.agents import initialize_agent, AgentType from langchain.tools import Tool from langchain_community.llms import VLLMOpenAI from langchain.text_splitter import RecursiveCharacterTextSplitter import os from typing import List llm VLLMOpenAI( openai_api_keynot-needed, openai_api_basehttp://localhost:8000/v1, model_namephi-3-mini-128k-instruct, max_tokens2048, # 文档处理需要更多token temperature0.3, ) # 文档处理工具 def read_text_file(filepath: str) - str: 读取文本文件 try: with open(filepath, r, encodingutf-8) as f: return f.read() except Exception as e: return f读取文件失败: {str(e)} def split_text(text: str, chunk_size: int 1000) - List[str]: 将长文本分割成小块 splitter RecursiveCharacterTextSplitter( chunk_sizechunk_size, chunk_overlap200, length_functionlen, ) return splitter.split_text(text) def summarize_text(text: str) - str: 总结文本内容 if len(text) 500: # 短文本直接总结 prompt f请用一句话总结以下文本的主要内容\n\n{text} else: # 长文本先分割再总结 chunks split_text(text, 800) if len(chunks) 3: chunks chunks[:3] # 只处理前3个块避免过长 summaries [] for i, chunk in enumerate(chunks): chunk_prompt f请总结文本块{i1}的内容\n\n{chunk} summary llm.invoke(chunk_prompt) summaries.append(summary) # 合并总结 combined .join(summaries) prompt f基于以下分块总结生成一个完整的总结\n\n{combined} return llm.invoke(prompt) def extract_keywords(text: str, num_keywords: int 5) - str: 提取关键词 prompt f从以下文本中提取{num_keywords}个最重要的关键词 {text} 请用逗号分隔关键词。 return llm.invoke(prompt) # 创建文档处理工具 tools [ Tool( nameTextFileReader, funcread_text_file, description读取文本文件的内容。输入是文件路径。 ), Tool( nameTextSummarizer, funcsummarize_text, description总结文本内容。输入是要总结的文本。 ), Tool( nameKeywordExtractor, funcextract_keywords, description从文本中提取关键词。输入是要提取的文本可以指定关键词数量默认5个。 ), ] # 创建文档处理Agent doc_agent initialize_agent( toolstools, llmllm, agentAgentType.STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION, verboseTrue, handle_parsing_errorsTrue, max_iterations4, ) # 测试文档处理 print( 文档处理测试 ) # 先创建一个测试文件 test_content 人工智能AI是计算机科学的一个分支旨在创建能够执行通常需要人类智能的任务的系统。 这些任务包括视觉感知、语音识别、决策和语言翻译。 机器学习是人工智能的一个子领域它使计算机能够从数据中学习而无需明确编程。 深度学习是机器学习的一个子集使用神经网络模拟人脑的工作方式。 近年来AI在多个领域取得了显著进展 1. 自然语言处理GPT系列模型能够生成类似人类的文本 2. 计算机视觉图像识别准确率已超过人类水平 3. 自动驾驶Level 4自动驾驶汽车已在特定区域运行 4. 医疗诊断AI辅助诊断系统提高了疾病检测准确率 AI的发展也带来了伦理和社会挑战包括就业影响、隐私问题和算法偏见。 未来AI可能会与人类更紧密地协作而不是完全取代人类工作。 # 保存测试文件 with open(test_ai.txt, w, encodingutf-8) as f: f.write(test_content) print(已创建测试文件: test_ai.txt) # 使用Agent处理文档 task 请处理test_ai.txt文件 1. 读取文件内容 2. 总结文件的主要内容 3. 提取5个关键词 4. 给我完整的处理报告 result doc_agent.run(task) print(f\n处理结果:\n{result}) # 清理测试文件 os.remove(test_ai.txt) print(\n已清理测试文件)7. 优化与调试技巧7.1 处理常见问题在实际使用中你可能会遇到一些问题。这里是一些常见问题的解决方法问题1Agent陷入循环或执行步骤过多# 设置最大迭代次数 agent initialize_agent( toolstools, llmllm, agentAgentType.STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION, verboseTrue, max_iterations10, # 限制最大迭代次数 early_stopping_methodgenerate, # 提前停止策略 )问题2工具调用失败或解析错误# 更好的错误处理 from langchain.agents import AgentExecutor agent_executor AgentExecutor.from_agent_and_tools( agentagent, toolstools, verboseTrue, handle_parsing_errorsTrue, # 自动处理解析错误 return_intermediate_stepsTrue, # 返回中间步骤便于调试 ) try: result agent_executor.invoke({input: 你的问题}) print(成功:, result[output]) print(中间步骤:, result[intermediate_steps]) except Exception as e: print(f执行失败: {e})问题3响应时间过长# 优化模型参数 llm VLLMOpenAI( openai_api_basehttp://localhost:8000/v1, model_namephi-3-mini-128k-instruct, max_tokens256, # 减少生成长度 temperature0.3, # 降低随机性 request_timeout30, # 设置超时时间 )7.2 性能优化建议工具设计优化每个工具功能要单一明确工具描述要清晰准确帮助Agent正确选择复杂工具可以拆分成多个简单工具提示工程优化from langchain.prompts import PromptTemplate # 自定义系统提示 custom_prompt PromptTemplate.from_template( 你是一个专业的AI助手擅长使用工具解决问题。 可用工具 {tools} 任务{input} 请按照以下格式回答 思考分析任务并决定使用哪个工具 行动工具名称 行动输入工具的输入 观察工具返回的结果 ...重复直到任务完成 最终答案完整的答案 开始 )批量处理优化# 批量处理多个查询 queries [ 查询北京天气, 计算15的平方, 总结AI的发展趋势 ] for query in queries: print(f\n处理: {query}) result agent.run(query) print(f结果: {result[:100]}...) # 只显示前100字符8. 总结通过本教程你已经成功将vLLM部署的Phi-3-mini-128k-instruct模型接入LangChain并构建了多种类型的智能Agent。让我们回顾一下关键收获8.1 核心成果基础连接建立学会了如何通过VLLMOpenAI类连接本地vLLM服务这是所有高级功能的基础。工具集成能力掌握了创建自定义工具的方法从简单的计算器到复杂的文档处理器你可以根据需求扩展Agent的能力。Agent工作流程理解了ReAct模式的工作机制——思考、行动、观察的循环这是智能Agent的核心。实际应用构建实践了构建专业领域Agent代码分析、文档处理的完整流程这些模式可以复用到其他领域。8.2 下一步建议现在你已经掌握了基础可以考虑以下进阶方向集成更多工具尝试接入数据库、API服务、文件系统等构建更强大的Agent。优化提示工程通过改进系统提示和工具描述提升Agent的决策质量。构建多Agent系统创建多个协作的Agent每个负责特定领域实现更复杂的任务。添加记忆功能让Agent能够记住对话历史实现更连贯的交互。部署为服务将你的Agent封装成API服务或Web应用供其他人使用。8.3 实用技巧回顾从简单开始先构建基础功能逐步添加复杂度充分测试每个工具都要单独测试确保功能正常监控性能关注响应时间和资源使用情况持续优化根据使用反馈不断改进工具和提示最重要的是现在你有了一个强大的起点。基于Phi-3-mini-128k-instruct和LangChain你可以快速构建各种智能应用从个人助手到专业工具可能性是无限的。开始动手实验吧最好的学习方式就是实践。尝试修改代码添加新功能解决实际问题。遇到问题时回顾本文中的示例代码或者查阅LangChain官方文档。祝你构建出令人惊艳的AI应用获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。