from langchain_experimental.llms.ollama_functions import OllamaFunctions

model = OllamaFunctions(model='qwen2:7b', base_url='http://{your ollama ip}:11434', format='json')
# 定义相关API_Key
tavily_api_key = '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'             #官网:Tavily tavily.com

# 1. 自定义网络搜索工具二
def search_web(query, k=5, max_retry=3):
    print('Call tool2: search_web(query=' + query+')' )
    import os
    from langchain_community.retrievers import TavilySearchAPIRetriever

    os.environ["TAVILY_API_KEY"] = tavily_api_key
    retriever = TavilySearchAPIRetriever(k=5)
    documents = retriever.invoke(query)
    # return [{'title': doc.metadata['title'], 'abstract': doc.page_content, 'href': doc.metadata['source'], 'score': doc.metadata['score']} for doc in
    #         documents]
    content = '\n\n'.join([doc.page_content for doc in documents])
    prompt = f"""请将下面这段内容(<<<content>>><<</content>>>包裹的部分)进行总结:
    <<<content>>>
    {content}
    <<</content>>>
    """
    # print('prompt:')
    # print(prompt)

    return model.invoke(prompt).content

# 自定义汇率查询工具一
def get_currency_exchange(fromcoin, tocoin, money):
    print('Call tool1: get_currency_exchange(fromcoin='+fromcoin+', tocoin='+tocoin+', money='+str(money)+')')
    import requests

    currency_api_key = "6gb4ac0058c31fed14e86ac8f3fb160f" #your tool api key
    url = f'https://apis.tianapi.com/fxrate/index?fromcoin={fromcoin}&tocoin={tocoin}&money={money}&key={currency_api_key}'
    resp = requests.get(url)
    """样例数据
    {
        "code": 200,
        "msg": "success",
        "result": {
            "money": "7.0752"
        }
    }
    """
    #print('汇率转换:')
    #print(resp.json())
    result = f"{resp.json()['result']['money']}"
    # print(result)
    if money == 1:
        prompt = f"""请将下面这段内容(<<<content>>><<</content>>>包裹的部分)进行总结:
                {fromcoin}转换成{tocoin}的汇率为{result}
            """
    else:
        prompt = f"""请将下面这段内容(<<<content>>><<</content>>>包裹的部分)进行总结:
                待转换的现金为{money} {fromcoin},转换成{tocoin}以后,结果为{result}
            """
    return model.invoke(prompt).content


# 3. 工具映射列表
fn_map = {
    'get_currency_exchange': get_currency_exchange,
    'search_web': search_web
}

# 4. 使用下面的语句,将自定义的函数,绑定到大语言模型上
llm_with_tool = model.bind_tools(
    tools=[
        {
            "name": "get_currency_exchange",
            "description": "实现不同现金格式的实时汇率转换",
            "parameters": {
                "type": "object",
                "properties": {
                    "fromcoin": {
                        "type": "string",
                        "description": "待被转换汇率的现金格式,默认为USD"
                    },
                    "tocoin": {
                        "type": "string",
                        "description": "目标转换现金格式,默认为CNY"
                    }, "money": {
                        "type": "int",
                        "description": "待被转换汇率的现金的数量,默认为1"
                    }
                },
                "required": ["fromcoin", "tocoin","money"]
            }
        },
        {
            "name": "search_web",
            "description": "搜索互联网",
            "parameters": {
                "type": "object",
                "properties": {
                    "query": {
                        "type": "string",
                        "description": "要搜素的内容"
                    }
                },
                "required": ["query"]
            }
        },
    ],
    #function_call={"name": "get_current_weather"}
)

# 5.使用工具
# 基于大模型获取调用工具及相关参数
import json
# 不调用工具,直接使用大模型生成答案
# ai_msg = llm_with_tool.invoke("中国最具影响力的10大事件有哪些?")

# 调用工具一:实时汇率转换工具,get_currency_exchange    --调用接口 https://www.tianapi.com/apiview/119,1天限调100次
# ai_msg = llm_with_tool.invoke("待转换现金单位:CNY(元),目标转换现金单位:USD(美元),待转换金额:2元,最终得到多少美元?")
# ai_msg = llm_with_tool.invoke("按照实时汇率将5欧元转换成人民币")
ai_msg = llm_with_tool.invoke("欧元转换成人民币按照实时汇率是多少")

# 调用工具二:网上搜索前5工具,search_web
# ai_msg = llm_with_tool.invoke("从互联网搜索什么是命运?")

# 下面一行是去掉的,无用的原来的代码
# kwargs = json.loads(ai_msg.additional_kwargs['function_call']['arguments'])
if len(ai_msg.lc_attributes['tool_calls'])==0:
    print('没有调用tool,直接使用大模型的回答。')
    res = ai_msg.content
else:
    kwargs = ai_msg.lc_attributes['tool_calls'][0]['args']
    # print(kwargs)
    # 调用自定义函数,获得返回结果
    res = fn_map[ai_msg.lc_attributes["tool_calls"][0]['name']](**kwargs)

print(res)
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐