Python + LLM 实战:OpenAI API 集成与 Agent 开发

使用 Python 集成 OpenAI / Claude / 国产大模型 API,掌握 Prompt Engineering、Function Calling、RAG 检索增强生成、LangChain / LlamaIndex 框架与 AI Agent 开发。

1. OpenAI API 基础

1.1 安装与配置

pip install openai python-dotenv
import os
from openai import OpenAI
from dotenv import load_dotenv

load_dotenv()
client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))

# 基础调用
response = client.chat.completions.create(
    model="gpt-4o",
    messages=[
        {"role": "system", "content": "你是一个 helpful 助手"},
        {"role": "user", "content": "解释 Python 的 GIL 是什么"}
    ],
    temperature=0.7,
    max_tokens=500
)
print(response.choices[0].message.content)

1.2 流式输出

# 流式响应(实时输出,适合聊天界面)
stream = client.chat.completions.create(
    model="gpt-4o",
    messages=[{"role": "user", "content": "写一首关于编程的诗"}],
    stream=True
)
for chunk in stream:
    content = chunk.choices[0].delta.content
    if content:
        print(content, end="", flush=True)

1.3 国产大模型适配

# 阿里云通义千问
from openai import OpenAI
qwen = OpenAI(
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1"
)

# 百度文心
# 火山引擎豆包
# 智谱 GLM
# 统一使用 OpenAI SDK 兼容接口

2. Function Calling(工具调用)

让 LLM 调用外部函数,实现查询天气、操作数据库等能力。

import json

def get_weather(city: str) -> str:
    """查询城市天气(模拟)"""
    weather_data = {
        "北京": "晴天 25°C",
        "上海": "多云 22°C",
        "深圳": "小雨 28°C"
    }
    return weather_data.get(city, "未知城市")

# 定义工具
functions = [{
    "type": "function",
    "function": {
        "name": "get_weather",
        "description": "获取指定城市的天气信息",
        "parameters": {
            "type": "object",
            "properties": {
                "city": {"type": "string", "description": "城市名称"}
            },
            "required": ["city"]
        }
    }
}]

# 调用
messages = [{"role": "user", "content": "北京今天天气怎么样?"}]
response = client.chat.completions.create(
    model="gpt-4o",
    messages=messages,
    tools=functions
)

# 处理工具调用
message = response.choices[0].message
if message.tool_calls:
    tool_call = message.tool_calls[0]
    function_name = tool_call.function.name
    arguments = json.loads(tool_call.function.arguments)
    
    # 执行函数
    result = get_weather(**arguments)
    
    # 将结果返回给 LLM
    messages.append(message)  # AI 的 tool_call
    messages.append({
        "role": "tool",
        "tool_call_id": tool_call.id,
        "content": result
    })
    
    final = client.chat.completions.create(
        model="gpt-4o", messages=messages
    )
    print(final.choices[0].message.content)
    # 输出: "北京今天是晴天,气温 25°C,适合外出!"

3. RAG(检索增强生成)

将私有知识库接入 LLM,解决模型知识截止和幻觉问题。

# 简化版 RAG 实现
from typing import List
import numpy as np

class SimpleRAG:
    def __init__(self, client):
        self.client = client
        self.documents: List[str] = []
        self.embeddings: List[List[float]] = []
    
    def add_document(self, text: str):
        """添加文档并计算嵌入"""
        self.documents.append(text)
        resp = self.client.embeddings.create(
            model="text-embedding-3-small",
            input=text
        )
        self.embeddings.append(resp.data[0].embedding)
    
    def search(self, query: str, top_k: int = 3) -> List[str]:
        """语义搜索最相关文档"""
        resp = self.client.embeddings.create(
            model="text-embedding-3-small", input=query
        )
        query_emb = np.array(resp.data[0].embedding)
        
        # 计算余弦相似度
        scores = []
        for emb in self.embeddings:
            sim = np.dot(query_emb, emb) / (np.linalg.norm(query_emb) * np.linalg.norm(emb))
            scores.append(sim)
        
        top_indices = np.argsort(scores)[-top_k:][::-1]
        return [self.documents[i] for i in top_indices]
    
    def ask(self, query: str) -> str:
        """RAG 问答"""
        contexts = self.search(query)
        context_text = "\n".join(contexts)
        
        prompt = f"""基于以下上下文回答问题:

上下文:
{context_text}

问题:{query}

请基于上下文回答,如果无法回答请说明。"""
        
        response = self.client.chat.completions.create(
            model="gpt-4o",
            messages=[{"role": "user", "content": prompt}]
        )
        return response.choices[0].message.content

# 使用
rag = SimpleRAG(client)
rag.add_document("Python 3.12 于 2023 年 10 月发布,引入了改进的错误消息、f-string 调试语法等")
rag.add_document("FastAPI 是一个现代 Python Web 框架,基于 Starlette 和 Pydantic")
rag.add_document("Docker 容器化可以将 Python 应用打包成镜像,实现环境一致性")

print(rag.ask("FastAPI 是什么?"))

4. LangChain 框架

from langchain_openai import ChatOpenAI, OpenAIEmbeddings
from langchain_community.vectorstores import Chroma
from langchain.chains import RetrievalQA
from langchain.text_splitter import RecursiveCharacterTextSplitter

# LLM
llm = ChatOpenAI(model="gpt-4o")

# 文档处理
text = """Python 是一种解释型、高级、通用编程语言。Python 的设计哲学强调代码的可读性和简洁的语法。
它的语言结构以及面向对象的方法旨在帮助程序员为小型和大型项目编写清晰、合乎逻辑的代码。"""

splitter = RecursiveCharacterTextSplitter(chunk_size=100, chunk_overlap=20)
docs = splitter.create_documents([text])

# 向量化存储
embeddings = OpenAIEmbeddings()
vectorstore = Chroma.from_documents(docs, embeddings)

# RAG 链
qa = RetrievalQA.from_chain_type(
    llm=llm,
    retriever=vectorstore.as_retriever(),
    chain_type="stuff"
)

result = qa.invoke({"query": "Python 是什么类型的语言?"})
print(result["result"])

延伸阅读

继续阅读

探索更多技术文章

浏览归档,发现更多关于系统设计、工具链和工程实践的内容。

全部文章 返回首页

「python」更多文章

  1. Python 高级异步编程:Trio 结构化并发与 AnyIO 兼容层
  2. Python 数据工程与 ETL 管道实战
  3. Python 元编程与动态特性深度解析