LangChain接入azureopenai步调(2025年初)

打印 上一主题 下一主题

主题 1888|帖子 1888|积分 5664

背景:

  为了快速且规范的实现ai应用,可使用LangChain框架,便于后期维护。虽然deepseek异军突起,在终端用户占据率很高,但是过细查阅相干api接口,尤其是自有知识库必要使用的文本向量化模型方面,openai仍无法被替代。目前国内仍无法付费使用openai接口,必要迂回使用azure版的openai相干模型。

  目前,ai类应用处于快速迭代期,许多一年前的教程已经过期,因此记录下2025年最新的ai应用使用方法。
  
一、开通azureopenai必要注册azure.microsoft.com微软云服务,并绑定visa功能的信用卡。

openai.com不支持国内信用卡:

在azure的主页左上角下拉菜单,找到“成本管理 + 计费”:

在“成本管理 + 计费”窗口左侧导航栏,打开“计费-》付款方式”:

添加visa卡即可。
二、进入Azure AI Foundry,创建ai容器

访问新版的ai地址:Azure AI Foundry
https://ai.azure.com/
 

然后通过顶部“+创建项目”按键一键完成openai容器创建。
注意:我也试过旧版的创建容器方式,也许是访问地址没有搞对,使用api访问总是报404错误。
用新版创建容器后,点击项目名称,直接进入项目。

点击操场即可测试当前容器是否运行正常:


 在旧版的azure openai容器没有找到类似功能。也许有,但是新版更好找。保举小白初学者用新版
Azure AI Foundry
https://ai.azure.com/
三、测试python接入azure openai

点击谈天操场的“查看代码”功能

 可以看到完整的python运行代码:

 粘贴到https://colab.research.google.com/或者jupyter notebook中稍加改动(加入api key和endpoint)即可运行:

 api key在 Azure AI Foundry / 224199843-5323 / 概述 页可以找到

endpoint在示例代码上方的文本框中能找到:

 注意:在使用langchain_openai框架时,endpoint不填全,api接口无法访问,会报404错误。好比只填域名部门:
  1. https://ai-2241998435710ai347721904316.openai.azure.com/
复制代码
https://ai-2241998435710ai347721904316.openai.azure.com/
 

被这个问题困惑了一天,最后填写了精确的url地址才解决。

  1. !pip install -U langchain_openai
  2. from langchain_openai import AzureChatOpenAI
  3. from google.colab import userdata
  4. chat = AzureChatOpenAI(
  5.     azure_endpoint="https://ai-2241998435710ai347721904316.openai.azure.com/openai/deployments/gpt-4o-mini/chat/completions?api-version=2025-01-01-preview",
  6.     # azure_endpoint="https://ai-2241998435710ai347721904316.openai.azure.com/", 错误url
  7.     azure_deployment="ai-2241998435710ai347721904316",
  8.     api_key=userdata.get('AZURE_OPENAI_API_KEY'),
  9.     api_version="2025-01-01-preview",
  10.     temperature=0,
  11.     max_tokens=None,
  12.     timeout=None,
  13.     max_retries=2,
  14.     # organization="...",
  15.     # model="gpt-35-turbo",
  16.     # model_version="0125",
  17.     # other params...
  18. )
  19. messages = [
  20.     (
  21.         "system",
  22.         "You are a helpful translator. Translate the user sentence to French.",
  23.     ),
  24.     ("human", "I love programming."),
  25. ]
  26. chat.invoke(messages)
复制代码
四、学会使用langchain的 提示词模板(ChatPromptTemplate)和 输出解析器(JsonOutputParser)

虽然吴恩达的课程已经过期,但是可以结合deepseek的提示和最新的langchain api文档来学习,我觉得吴恩达的授课思绪非常清晰,很适合看了一堆视频,越看越没有头绪的初学者。
(超爽中英!) 2024公认最好的【吴恩达LangChain+RAG】教程!更适合中国宝宝体质,全程干货无废话,学完成为AGI大佬!(附课件+代码)_哔哩哔哩_bilibili(超爽中英!) 2024公认最好的【吴恩达LangChain+RAG】教程!更适合中国宝宝体质,全程干货无废话,学完成为AGI大佬!(附课件+代码)共计29条视频,包括:基于LangChain的大语言模型应用开发1——介绍、基于LangChain的大语言模型应用开发2——模型,提示和输出解析、基于LangChain的大语言模型应用开发3——记忆等,UP主更多出色视频,请关注UP账号。
https://www.bilibili.com/video/BV1TJ4zemETf/
  1. from langchain_openai import AzureChatOpenAI
  2. from google.colab import userdata
  3. chat = AzureChatOpenAI(
  4.     azure_endpoint="https://ai-2241998435710ai347721904316.openai.azure.com/openai/deployments/gpt-4o-mini/chat/completions?api-version=2025-01-01-preview",
  5.     # azure_endpoint="https://ai-2241998435710ai347721904316.openai.azure.com/",
  6.     azure_deployment="ai-2241998435710ai347721904316",
  7.     api_key=userdata.get('AZURE_OPENAI_API_KEY'),
  8.     api_version="2025-01-01-preview",
  9.     temperature=0,
  10.     max_tokens=None,
  11.     timeout=None,
  12.     max_retries=2,
  13.     # organization="...",
  14.     # model="gpt-35-turbo",
  15.     # model_version="0125",
  16.     # other params...
  17. )
  18. from langchain_core.prompts import ChatPromptTemplate
  19. from langchain_core.output_parsers import JsonOutputParser
  20. # from langchain_core.pydantic_v1 import BaseModel, Field, HttpUrl  
  21. # langchain_core.pydantic_v1 已淘汰,langchain可以直接导入pydantic 2的对象
  22. from pydantic import BaseModel, Field, HttpUrl
  23. from typing import List, Optional, Union
  24. from datetime import date
  25. # 1.1 创建含有动态字段的简历结构
  26. # 动态字段的基类
  27. class DynamicSection(BaseModel):
  28.     section_name: str = Field(description="模块名称")
  29.     content: Union[str, List[str], dict] = Field(description="模块内容")
  30. # 教育经历、工作经历、技能、项目经验
  31. class Education(BaseModel):
  32.     """教育背景条目(所有字段可选)"""
  33.     sections: List[DynamicSection] = Field(default_factory=list, description="动态项或动态列表")
  34. class WorkExperience(BaseModel):
  35.     """工作经历条目(所有字段可选)"""
  36.     sections: List[DynamicSection] = Field(default_factory=list, description="动态项或动态列表")
  37. class Skill(BaseModel):
  38.     """技能条目(所有字段可选)"""
  39.     sections: List[DynamicSection] = Field(default_factory=list, description="动态项或动态列表")
  40. class ProjectExperience(BaseModel):
  41.     sections: List[DynamicSection] = Field(default_factory=list, description="动态项或动态列表")
  42. class Resume_dynamic(BaseModel):
  43.     """简历数据模型(所有字段可选)"""
  44.     # 基础信息
  45.     seq_num: Optional[int] = Field(None, description="序号", gt=0)
  46.     file_name: Optional[str] = Field(None, description="文件名", max_length=255)  # 允许字母数字/下划线/点/横线 regex=r"^[\w\-\.]+$"
  47.     is_resume: Optional[bool] = Field(None, description="该文件是否是简历")
  48.     # 个人信息
  49.     name: Optional[str] = Field(None, description="姓名", min_length=2, max_length=50)
  50.     gender: Optional[str] = Field(None, description="性别", examples=["男", "女", "其他"])
  51.     birthday: Optional[date] = Field(None, description="生日")
  52.     ethnicity: Optional[str] = Field(None, description="民族")
  53.     political_affiliation: Optional[str] = Field(None, description="政治面貌")
  54.     marital_status: Optional[str] = Field(None, description="婚姻状况")
  55.     native_place: Optional[str] = Field(None, description="籍贯或户口所在地")
  56.     address: Optional[str] = Field(None, description="现住址")
  57.     id_number: Optional[str] = Field(None, description="身份证号码", pattern=r"^\d{17}[\dXx]$")
  58.     phone: Optional[str] = Field(None, description="手机号", pattern=r"^1[3-9]\d{9}$")
  59.     email: Optional[str] = Field(None, description="邮箱", pattern=r"^[\w\.-]+@[\w\.-]+\.\w{2,4}$")
  60.     # 教育信息
  61.     highest_degree: Optional[str] = Field(None, description="最高学历", examples=["高中", "专科", "本科", "硕士", "博士"])
  62.     major: Optional[str] = Field(None, description="最高学历专业", max_length=50)
  63.     # 求职信息
  64.     job_target: Optional[str] = Field(None, description="求职意向职业", max_length=100)
  65.     # 结构化信息
  66.     education_background: Optional[List[Education]] = Field(None, description="教育背景")
  67.     work_experience: Optional[List[WorkExperience]] = Field(None, description="工作经历")
  68.     skills: Optional[List[Skill]] = Field(None, description="特殊技能或资格证书")
  69.     project_experience: Optional[List[ProjectExperience]] = Field(None, description="项目经历")
  70. # 2.1 创建简历结构json解析器
  71. resume_output_parser = JsonOutputParser(pydantic_object=Resume_dynamic)
  72. # 3. 创建简历解析提示模板
  73. prompt = ChatPromptTemplate.from_template(
  74.     "解析以下简历:{question}\n"
  75.     "请按照指定格式返回:\n"
  76.     "{format_instructions}"
  77. )
  78. # 4. 组合成链
  79. chain = prompt | chat | resume_output_parser
  80. resume_text = '''
  81. 应聘人员信息表
  82. 姓名 ...
  83. 电话 ...
  84. ... ...
  85. '''
  86. # 5. 调用
  87. result = chain.invoke({
  88.     "question": resume_text,
  89.     "format_instructions": resume_output_parser.get_format_instructions()
  90. })
复制代码
result输出效果:
  1. {'seq_num': None,
  2. 'file_name': None,
  3. 'is_resume': None,
  4. 'name': '',
  5. 'gender': '男',
  6. 'birthday': '1900-00-00',
  7. 'ethnicity': '汉',
  8. 'political_affiliation': '群众',
  9. 'marital_status': '未婚',
  10. 'native_place': '吉林省长春市',
  11. 'address': '高新技术开发区,保利罗兰香谷',
  12. 'id_number': '221100000000000000',
  13. 'phone': '15922334455',
  14. 'email': None,
  15. 'highest_degree': '硕士',
  16. 'major': '建筑与土木工程',
  17. 'job_target': '市政道路、排水设计',
  18. 'education_background': [{'sections': [{'section_name': '教育经历',
  19.      'content': {'起止年月': '2012.09-2015.07',
  20.       '毕业院校及系名称': '吉林建筑大学',
  21.       '专业': '建筑与土木工程',
  22.       '学位': '硕士'}},
  23.     {'section_name': '教育经历',
  24.      'content': {'起止年月': '2008.09-2012.07',
  25.       '毕业院校及系名称': '长春工程学院',
  26. ...
  27.     {'section_name': '项目经历',
复制代码
注意:langchain_core.pydantic_v1 已淘汰,langchain可以直接导入pydantic 2的对象


例子来自deepseek,在本例中class Resume_dynamic(BaseModel):对象即用于提示词中对生成格式的要求,又用于将ai生成效果解析为dict对象,一箭双雕。其余代码非常直观,链式编程也符合一般人的认知。如许编写的代码即简洁又高效。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

杀鸡焉用牛刀

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表