以下是一个简单的 Python 脚本,展示如何用 OpenAI 库调用 Ollama 的 qwen2.5 模型,实现对Baidu的调用:
import asyncio
import json
from datetime import datetime
import pytz
from openai import AsyncOpenAI
from tools.baidu_search import BaiduSearch
class LLM:
def __init__(self):
self.model = "qwen2.5"
self.max_tokens = 4096
self.base_url = "http://127.0.0.1:11434/v1"
self.api_key = "key"
self.client = AsyncOpenAI(api_key=self.api_key, base_url=self.base_url)
self.baidu_search = BaiduSearch()
async def ask_tool(self, prompt, tools=None, temperature=1.0, timeout=None, **kwargs):
"""
向模型发送带有工具调用的提示并获取回复
Args:
prompt (str): 用户输入的提示文本
tools (list, optional): 可用的工具列表
temperature (float, optional): 控制回复的随机性,默认为1.0
timeout (int, optional): 请求超时时间
**kwargs: 其他可选参数
Returns:
str: 模型的回复内容
"""
messages = [{"role": "user", "content": prompt}]
response = await self.client.chat.completions.create(
model=self.model,
messages=messages,
temperature=temperature,
max_tokens=self.max_tokens,
tools=tools,
tool_choice="auto",
timeout=timeout,
**kwargs,
)
print(f"模型初次回复: {response}")
tool_calls = response.choices[0].message.tool_calls
if tool_calls:
tool_call = tool_calls[0]
print(f"检测到工具调用: {tool_call.function.name}, 参数: {tool_call.function.arguments}")
tool_result = await self.handle_tool_call(tool_call)
print(f"本地工具返回: {tool_result}")
messages.append({
"role": "assistant",
"content": "",
"tool_calls": [tool_call]
})
messages.append({
"role": "tool",
"tool_call_id": tool_call.id,
"name": tool_call.function.name,
"content": tool_result
})
response = await self.client.chat.completions.create(
model=self.model,
messages=messages,
temperature=temperature,
max_tokens=self.max_tokens,
timeout=timeout,
**kwargs,
)
print(f"最终模型回复: {response.choices[0].message.content}")
return response.choices[0].message.content
else:
print(f"最终模型回复: {response.choices[0].message.content}")
return response.choices[0].message.content
async def handle_tool_call(self, tool_call):
"""
根据 tool_call 调用本地工具函数
"""
function_name = tool_call.function.name
arguments = json.loads(tool_call.function.arguments)
if function_name == "get_current_time":
return get_current_time(**arguments)
elif function_name == "baidu_search":
# baidu_search 工具
query = arguments.get("query")
num_results = arguments.get("num_results", 10)
links = await self.baidu_search.execute(query, num_results)
# 如果每个元素是 dict,提取 link 字段
if links and isinstance(links[0], dict):
urls = [item.get("link", str(item)) for item in links]
else:
urls = [str(item) for item in links]
return "\n".join(urls)
else:
return f"未实现的工具: {function_name}"
def get_current_time(timezone):
tz = pytz.timezone(timezone)
return datetime.now(tz).strftime("%Y-%m-%d %H:%M:%S")
if __name__ == "__main__":
async def main():
llm = LLM()
# 测试工具调用
tools = [
{
"type": "function",
"function": {
"name": "get_current_time",
"description": "获取当前时间",
"parameters": {
"type": "object",
"properties": {
"timezone": {"type": "string", "description": "时区"}
}
}
}
},
{
"type": "function",
"function": {
"name": "baidu_search",
"description": BaiduSearch.description,
"parameters": BaiduSearch.parameters
}
}
]
# results = await llm.ask_tool("当前的北京时间是多少", tools=tools)
# print(results)
results = await llm.ask_tool("帮我查一下OpenAI的最新新闻", tools=tools)
print(results)
asyncio.run(main())
baidu_search.py代码
import asyncio
from typing import List
# from googlesearch import search
from baidusearch.baidusearch import search
class BaiduSearch:
# name: str = "google_search"
name: str = "baidu_search"
description: str = """Perform a Baidu search and return a list of relevant links.
Use this tool when you need to find information on the web, get up-to-date data, or research specific topics.
The tool returns a list of URLs that match the search query.
"""
parameters: dict = {
"type": "object",
"properties": {
"query": {
"type": "string",
"description": "(required) The search query to submit to Baidu.",
},
"num_results": {
"type": "integer",
"description": "(optional) The number of search results to return. Default is 10.",
"default": 10,
},
},
"required": ["query"],
}
async def execute(self, query: str, num_results: int = 10) -> List[str]:
"""
Execute a Baidu search and return a list of URLs.
Args:
query (str): The search query to submit to Baidu.
num_results (int, optional): The number of search results to return. Default is 10.
Returns:
List[str]: A list of URLs matching the search query.
"""
# Run the search in a thread pool to prevent blocking
loop = asyncio.get_event_loop()
links = await loop.run_in_executor(
None, lambda: list(search(query, num_results=num_results))
)
return links
安装openai依赖:
uv pip install baidusearch
执行:
% python -m llm.ollamaToolSearch
模型初次回复: ChatCompletion(id='chatcmpl-728', choices=[Choice(finish_reason='tool_calls', index=0, logprobs=None, message=ChatCompletionMessage(content='', refusal=None, role='assistant', annotations=None, audio=None, function_call=None, tool_calls=[ChatCompletionMessageToolCall(id='call_ngt926u6', function=Function(arguments='{"num_results":5,"query":"OpenAI 最新新闻"}', name='baidu_search'), type='function', index=0)]))], created=1745826945, model='qwen2.5', object='chat.completion', service_tier=None, system_fingerprint='fp_ollama', usage=CompletionUsage(completion_tokens=32, prompt_tokens=294, total_tokens=326, completion_tokens_details=None, prompt_tokens_details=None))
检测到工具调用: baidu_search, 参数: {"num_results":5,"query":"OpenAI 最新新闻"}
本地工具返回: {'title': 'OpenAI 最新新闻的最新相关信息', 'abstract': 'OpenAI 最新新闻的最新相关信息过于追求人性化:OpenAI称GPT4o出现谄媚烦人倾向,计...【过于追求人性化:#OpenAI称GPT4o出现谄媚烦人倾向#,计划在一周内修复】4月 28日消息,OpenAI首席执行官萨姆奥尔特曼(Sam Altma...新浪3小时前\n\n\ue680\n播报\n\n\n\ue67d\n暂停\n\n再次更新,OpenAI 推出 o3 和 o4-mini 模型o3 和 o4-mini 是 OpenAI 最新的推理模型,取代了 o 系列之前的模型,比如 o1 和 o3-mini。o 系模型不同于主要关注模式识别和文...新浪新闻1小时前\n\n\ue680\n播报\n\n\n\ue67d\n暂停\n\n新AI 微积分:Google', 'url': 'http://www.baidu.com/link?url=3FZHbPMMObSb7mhpC0Ll8Bg5YzAKcSwFpa0a2CgKSOjvApkx5F6JAt4xpLi26EWPKMbLsDmP_N8EvCW8p0W6Lzb52Z9tA8Hux-0l2OFbepRl1vmf1X29R5jtmTCKlbxjLgemxpNAo9-6fwRbQuXQbq', 'rank': 1}
{'title': 'OpenAI_澎湃新闻-The Paper', 'abstract': 'OpenAI_澎湃新闻-The Paper\n\n\n\n\n\n\n\n\n澎湃,澎湃新闻,澎湃新闻网,新闻与思想,澎湃是植根于中国上海的时政思想类互联网平台,以最活跃的原创新闻与最冷静的思想分析为两翼,是互联网技术创新与新闻价值传承的结合体,致力于问答式新...澎湃新闻\ue62b', 'url': 'http://www.baidu.com/link?url=3Esr5MSRGKBwPkn-HFTCY8lf0X3r2_jcebRHRA3FraxouW3vM_anPsvdKFj4y41I', 'rank': 2}
{'title': 'OpenAI最新资讯-快科技--科技改变未来', 'abstract': 'OpenAI最新资讯-快科技--科技改变未来\n\n\n\n\n\n\n\n\n6天前 快科技4月15日消息,今天凌晨,OpenAI正式发布GPT-4.1系列模型,带来标准版GPT-4.1,更轻量快速GPT-4.1 mini和极致性价比的GPT-4.1 nano三款模型,全面超越GPT-4o,更聪明、更便宜。目前,GPT...快科技\ue62b', 'url': 'http://www.baidu.com/link?url=KIbtBnAjYsR_rqDAz-gE-TBDdQwASQX8HuqmouVRznaMAS4k2ODmYNBuV8YSIWZNqRNHMsoePgdKkPNv8UjCeK', 'rank': 3}
{'title': '围剿OpenAI:中国AI专利量占全球近40%,新架构模型推理算力...', 'abstract': '围剿OpenAI:中国AI专利量占全球近40%,新架构模型推理算力...\n\n\n\n\n\n\n\n\n6小时前 OpenAI计划向营利性公司的转型受到阻碍。 近日,辛顿、Hugging Face首席伦理科学家玛格丽特·米切尔(Margaret Mitchell)和美国加州大学伯克利分校教授斯图尔特·拉塞尔(Stuart Russel...新浪网\ue62b\n\n\ue680\n播报\n\n\n\ue67d\n暂停', 'url': 'http://www.baidu.com/link?url=X-_PcFMYNcwgmtqwKSyJB67vRACfl5MC6rRK2-k9LSWglFaWNE9emGfX4xqdJSIf6e5PTG1bPbijp6cFfIOqX9SgG7m43tk2BzAh1dqnuze', 'rank': 4}
{'title': '大家还在搜OpenAI 文本生成器openai中文官网openai国内合作公司OPenAi官网openaiopenAI捉迷藏openai是哪个公司的OpenAI公司OpenAI应用open itopenai股市中国的openai', 'abstract': '大家还在搜OpenAI 文本生成器openai中文官网openai国内合作公司OPenAi官网openaiopenAI捉迷藏openai是哪个公司的OpenAI公司OpenAI应用open itopenai股市中国的openai', 'url': '/s?wd=OpenAI%20%E6%96%87%E6%9C%AC%E7%94%9F%E6%88%90%E5%99%A8&usm=3&ie=utf-8&rsv_pq=c64b41490006df0b&oq=OpenAI%20%E6%9C%80%E6%96%B0%E6%96%B0%E9%97%BB&rsv_t=9743x7S9sMTt1pKFobE%2B2FdcRbD9JEZCQie4MBdGpN%2FdzmvDrlGvKHCW3k0&rsf=101631202&rsv_dl=0_prs_28608_1', 'rank': 5}
最终模型回复: 根据查询到的信息,以下是一些与OpenAI相关的最新新闻摘要:
1. **4月28日**:OpenAI首席执行官萨姆·奥尔特曼(Sam Altman)透露称GPT-4o存在谄媚和烦人的倾向,并计划在一星期内修复这一问题。
2. **4月27日**:OpenAI推出了新的推理模型 o3 和 o4-mini,取代了之前的 o 系列模型。这些新型号与主要关注模式识别和文本生成的不同,更注重提供智能化的服务。
3. **4月15日**:OpenAI 正式发布 GPT-4.1 系列模型,包括标准版、轻量快速版本以及极致性价比的版本,全面超越了之前的GPT-4o产品,表现更为聪明且价格更加亲民。
另外,有报道指出中国在 AI 技术方面也开始发力,专利数量占全球接近 40%,并且正在构建与之相关的新型计算架构和高效率推理模型。不过这条新闻主要是关于 OpenAI 面临的挑战及其技术竞争对手的情况。
请注意上述链接指向的是百度搜索引擎结果页面,请直接点击对应的实际网站链接获取更多详细信息。
[第一篇新闻](http://www.baidu.com/link?url=3FZHbPMMObSb7mhpC0Ll8Bg5YzAKcSwFpa0a2CgKSOjvApkx5F6JAt4xpLi26EWPKMbLsDmP_N8EvCW8p0W6Lzb52Z9tA8Hux-0l2OFbepRl1vmf1X29R5jtmTCKlbxjLgemxpNAo9-6fwRbQuXQbq)
[第二篇新闻](http://www.baidu.com/link?url=3Esr5MSRGKBwPkn-HFTCY8lf0X3r2_jcebRHRA3FraxouW3vM_anPsvdKFj4y41I)
[第三篇新闻](http://www.baidu.com/link?url=KIbtBnAjYsR_rqDAz-gE-TBDdQwASQX8HuqmouVRznaMAS4k2ODmYNBuV8YSIWZNqRNHMsoePgdKkPNv8UjCeK)
您可以通过点击上述链接来访问原网站获取更详细的信息。
根据查询到的信息,以下是一些与OpenAI相关的最新新闻摘要:
1. **4月28日**:OpenAI首席执行官萨姆·奥尔特曼(Sam Altman)透露称GPT-4o存在谄媚和烦人的倾向,并计划在一星期内修复这一问题。
2. **4月27日**:OpenAI推出了新的推理模型 o3 和 o4-mini,取代了之前的 o 系列模型。这些新型号与主要关注模式识别和文本生成的不同,更注重提供智能化的服务。
3. **4月15日**:OpenAI 正式发布 GPT-4.1 系列模型,包括标准版、轻量快速版本以及极致性价比的版本,全面超越了之前的GPT-4o产品,表现更为聪明且价格更加亲民。
另外,有报道指出中国在 AI 技术方面也开始发力,专利数量占全球接近 40%,并且正在构建与之相关的新型计算架构和高效率推理模型。不过这条新闻主要是关于 OpenAI 面临的挑战及其技术竞争对手的情况。
请注意上述链接指向的是百度搜索引擎结果页面,请直接点击对应的实际网站链接获取更多详细信息。
[第一篇新闻](http://www.baidu.com/link?url=3FZHbPMMObSb7mhpC0Ll8Bg5YzAKcSwFpa0a2CgKSOjvApkx5F6JAt4xpLi26EWPKMbLsDmP_N8EvCW8p0W6Lzb52Z9tA8Hux-0l2OFbepRl1vmf1X29R5jtmTCKlbxjLgemxpNAo9-6fwRbQuXQbq)
[第二篇新闻](http://www.baidu.com/link?url=3Esr5MSRGKBwPkn-HFTCY8lf0X3r2_jcebRHRA3FraxouW3vM_anPsvdKFj4y41I)
[第三篇新闻](http://www.baidu.com/link?url=KIbtBnAjYsR_rqDAz-gE-TBDdQwASQX8HuqmouVRznaMAS4k2ODmYNBuV8YSIWZNqRNHMsoePgdKkPNv8UjCeK)
您可以通过点击上述链接来访问原网站获取更详细的信息。