[{"content":"MEDUSA is an acceleration framework designed to optimize the inference process for large language models (LLMs), specifically targeting the decoding phase in text generation tasks. Its core innovation lies in leveraging multiple decoding heads, which can simultaneously generate multiple candidate outputs, significantly reducing the time required for inference.\nMedusa: Simple LLM Inference Acceleration Framework with Multiple Decoding Heads\nChallenges in Traditional Decoding In conventional autoregressive decoding, the process typically involves the following steps:\nThe model takes the input and generates a probability distribution (logits) for the first token. A token is selected (using greedy decoding, sampling, beam search, etc.). The selected token is appended to the input, and the process is repeated to generate the next token. This process continues sequentially until a stopping criterion is met (e.g., reaching the maximum length or a special end token). Issues: Sequential Dependence: Each step depends on the previous step\u0026rsquo;s output, making parallelization impossible. Inefficiency for Long Outputs: The time to generate output grows linearly with the length of the text. Underutilized Hardware: Modern GPUs are capable of highly parallel computations, but the sequential nature of traditional decoding does not fully utilize these capabilities. MEDUSA\u0026rsquo;s Core Mechanism 1. Multiple Decoding Heads In traditional decoding, a single decoder head is used to generate one token at a time. MEDUSA introduces multiple decoding heads, which can operate in parallel, each exploring different potential continuations of the sequence. This parallelization allows the framework to process several candidate paths simultaneously within a single decoding step. 2. Decoding Head Allocation Strategies MEDUSA intelligently assigns decoding heads based on the task:\nCandidate Exploration: Each decoding head explores a different token or sequence, enabling diverse output possibilities. Path Management: The framework evaluates and ranks candidate paths, discarding lower-quality ones while retaining promising sequences for further exploration. 3. Parallel Inference By leveraging the parallel processing capabilities of modern GPUs, MEDUSA enables multiple decoding heads to process their assigned tasks concurrently. Tensor operations are optimized so that all decoding heads share the same underlying model parameters, reducing redundant computations. 4. Dynamic Pruning As the decoding progresses, MEDUSA evaluates the quality of different paths and dynamically prunes those that are unlikely to produce high-quality outputs. This ensures that computational resources are focused on the most promising candidate paths, maintaining both efficiency and output quality. Workflow of MEDUSA Input Preprocessing: The user\u0026rsquo;s input is transformed into a tensor format suitable for the model. Parallel Decoding: Multiple decoding heads generate candidate sequences simultaneously. Candidate Evaluation: The framework scores all generated candidates based on predefined metrics (e.g., likelihood, coherence). Path Selection and Pruning: Low-scoring candidates are discarded, and the remaining candidates are used for the next decoding step. Final Output: The process continues until a termination condition is met, at which point the best sequence is returned. Key Optimizations 1. Time Complexity Reduction Traditional decoding has a time complexity of O(T×N)O(T \\times N)O(T×N), where TTT is the output length and NNN is the computation per step. MEDUSA reduces TTT by parallelizing multiple steps, making the process closer to O(N)O(N). 2. Efficient Resource Utilization Multiple decoding heads efficiently utilize GPU cores, significantly boosting throughput without requiring additional hardware. 3. Flexibility MEDUSA can be integrated with various LLMs (e.g., GPT models, generative variants of BERT). It supports diverse decoding strategies, including greedy decoding, sampling, and beam search. Advantages of MEDUSA Faster Inference:\nBy parallelizing the decoding process, MEDUSA achieves significant speedups, especially in scenarios requiring long text generation.\nImproved Output Quality:\nThe dynamic pruning mechanism ensures that only the best candidate paths are pursued, leading to coherent and high-quality outputs.\nBetter Hardware Utilization:\nThe framework takes full advantage of modern GPUs\u0026rsquo; parallel processing capabilities.\nConclusion MEDUSA is a game-changing framework for accelerating LLM inference. By introducing multiple decoding heads, parallelized processing, and dynamic path management, it overcomes the limitations of traditional sequential decoding. The result is a highly efficient and flexible system that delivers faster and higher-quality text generation while fully leveraging modern hardware capabilities.\n","permalink":"https://coriva.eu.org/medusa-detailed-explanation-of-the-mechanism/","summary":"\u003cp\u003eMEDUSA is an acceleration framework designed to optimize the inference process for large language models (LLMs), specifically targeting the decoding phase in text generation tasks. Its core innovation lies in leveraging \u003cstrong\u003emultiple decoding heads\u003c/strong\u003e, which can simultaneously generate multiple candidate outputs, significantly reducing the time required for inference.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://arxiv.org/abs/2401.10774\"\u003eMedusa: Simple LLM Inference Acceleration Framework with Multiple Decoding Heads\u003c/a\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003ch3 id=\"challenges-in-traditional-decoding\"\u003eChallenges in Traditional Decoding\u003c/h3\u003e\n\u003cp\u003eIn conventional autoregressive decoding, the process typically involves the following steps:\u003c/p\u003e","title":"MEDUSA: Detailed Explanation of the Mechanism"},{"content":"The Price-to-Earnings (P/E) ratio is a widely used financial metric that indicates how much investors are willing to pay for a dollar of earnings. Using Python\u0026rsquo;s yfinance library, you can easily download stock market data, including the P/E ratio. This blog will guide you step-by-step on how to retrieve the P/E ratio for stocks using yfinance.\nStep 1: Install and Import Required Libraries First, make sure you have yfinance installed. You can install it using pip if you haven\u0026rsquo;t already:\npip install yfinance Once installed, import the necessary library:\nimport yfinance as yf Step 2: Fetch Stock Data You can retrieve stock data using the Ticker object provided by yfinance. This object includes various key financial statistics, including the P/E ratio.\nHere’s how you can get started:\n# Create a Ticker object for the stock stock = yf.Ticker(\u0026#34;AAPL\u0026#34;) # Example: AAPL for Apple Inc. The Ticker object contains all the financial data related to the stock, including historical data, company information, and key statistics.\nStep 3: Retrieve the P/E Ratio The P/E ratio can be found in the info attribute of the Ticker object. Here’s an example:\n# Get stock information info = stock.info # Extract the P/E ratio pe_ratio = info.get(\u0026#34;forwardPE\u0026#34;) # Forward P/E ratio print(f\u0026#34;The Forward P/E ratio of AAPL is: {pe_ratio}\u0026#34;) Understanding the Keys in info forwardPE: Represents the forward P/E ratio, which uses forecasted earnings. trailingPE: Represents the trailing P/E ratio, which uses the earnings of the past 12 months. You can access either based on your requirements:\n# Extract the trailing P/E ratio trailing_pe = info.get(\u0026#34;trailingPE\u0026#34;) print(f\u0026#34;The Trailing P/E ratio of AAPL is: {trailing_pe}\u0026#34;) Step 4: Retrieve P/E Ratios for Multiple Stocks If you want to get the P/E ratios for multiple stocks, you can use a loop:\n# List of stock tickers tickers = [\u0026#34;AAPL\u0026#34;, \u0026#34;MSFT\u0026#34;, \u0026#34;GOOGL\u0026#34;] for ticker in tickers: stock = yf.Ticker(ticker) info = stock.info forward_pe = info.get(\u0026#34;forwardPE\u0026#34;) trailing_pe = info.get(\u0026#34;trailingPE\u0026#34;) print(f\u0026#34;{ticker}: Forward P/E = {forward_pe}, Trailing P/E = {trailing_pe}\u0026#34;) Step 5: Handle Missing Data Sometimes, a stock may not have a reported P/E ratio, resulting in None values. You can handle this gracefully:\nif forward_pe is None: print(f\u0026#34;{ticker}: Forward P/E is not available\u0026#34;) else: print(f\u0026#34;{ticker}: Forward P/E = {forward_pe}\u0026#34;) Conclusion With Python’s yfinance library, fetching the P/E ratio and other key financial metrics is both simple and efficient. Whether you are analyzing a single stock or a portfolio, these steps will help you access and manage the data with ease.\nHappy coding, and may your investments be profitable!\n","permalink":"https://coriva.eu.org/how-to-use-yfinance-to-download-stock-p-e-ratio/","summary":"\u003cp\u003eThe \u003cstrong\u003ePrice-to-Earnings (P/E) ratio\u003c/strong\u003e is a widely used financial metric that indicates how much investors are willing to pay for a dollar of earnings. Using Python\u0026rsquo;s \u003ccode\u003eyfinance\u003c/code\u003e library, you can easily download stock market data, including the P/E ratio. This blog will guide you step-by-step on how to retrieve the P/E ratio for stocks using \u003ccode\u003eyfinance\u003c/code\u003e.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"step-1-install-and-import-required-libraries\"\u003eStep 1: Install and Import Required Libraries\u003c/h2\u003e\n\u003cp\u003eFirst, make sure you have \u003ccode\u003eyfinance\u003c/code\u003e installed. You can install it using pip if you haven\u0026rsquo;t already:\u003c/p\u003e","title":"How to Use yfinance to Download Stock P/E Ratio"},{"content":"The yfinance Python library is a powerful tool for accessing financial data from Yahoo Finance. It allows users to download historical market data, fetch stock information, and analyze trends with minimal effort. In this tutorial, we will walk through the steps to install yfinance, retrieve stock data, and extract detailed stock information.\n1. Installation To begin, ensure that yfinance is installed on your system:\npip install yfinance 2. Downloading Historical Stock Data You can download historical stock prices using the yfinance.download method:\nimport yfinance as yf # Define the stock ticker and date range data = yf.download(\u0026#34;AAPL\u0026#34;, start=\u0026#34;2020-01-01\u0026#34;, end=\u0026#34;2023-12-31\u0026#34;) # Display the first few rows of data print(data.head()) This retrieves historical data for Apple Inc. (AAPL) within the specified date range.\nCustomizing the Data To download data for multiple tickers: data = yf.download([\u0026#34;AAPL\u0026#34;, \u0026#34;MSFT\u0026#34;, \u0026#34;GOOGL\u0026#34;], start=\u0026#34;2020-01-01\u0026#34;, end=\u0026#34;2023-12-31\u0026#34;) To adjust the interval (e.g., daily, weekly): data = yf.download(\u0026#34;AAPL\u0026#34;, interval=\u0026#34;1wk\u0026#34;) 3. Fetching Stock Information To retrieve detailed information about a stock, use the Ticker object:\n# Create a Ticker object apple = yf.Ticker(\u0026#34;AAPL\u0026#34;) # Get company info info = apple.info print(info) # Extract specific fields print(\u0026#34;Sector:\u0026#34;, info.get(\u0026#34;sector\u0026#34;)) print(\u0026#34;Market Cap:\u0026#34;, info.get(\u0026#34;marketCap\u0026#34;)) Other Available Information Historical Dividends: print(apple.dividends) Splits: print(apple.splits) Recommendations: print(apple.recommendations) 4. Working with Financial Statements You can fetch financial statements such as income statements, balance sheets, and cash flow statements:\n# Income statement print(apple.financials) # Balance sheet print(apple.balance_sheet) # Cash flow statement print(apple.cashflow) 5. Downloading Options Data To retrieve options data for a stock:\n# List of available options expiration dates print(apple.options) # Get options chain for a specific date options_chain = apple.option_chain(\u0026#34;2024-01-19\u0026#34;) print(options_chain.calls) print(options_chain.puts) 6. Analyzing Stock Trends yfinance integrates seamlessly with popular Python libraries like pandas and matplotlib to analyze and visualize data:\nimport matplotlib.pyplot as plt data[\u0026#39;Close\u0026#39;].plot(title=\u0026#34;AAPL Stock Price\u0026#34;) plt.xlabel(\u0026#34;Date\u0026#34;) plt.ylabel(\u0026#34;Close Price\u0026#34;) plt.show() 7. Best Practices and Tips Caching Data: Use yfinance.cache_enabled() to cache responses and reduce API calls. Error Handling: Always include error-handling mechanisms, especially for large-scale data requests. API Limits: Be mindful of Yahoo Finance’s rate limits when downloading data. The yfinance library simplifies financial data extraction, making it an essential tool for developers, analysts, and researchers. By following this tutorial, you’ll be equipped to download and analyze stock data effectively.\n","permalink":"https://coriva.eu.org/a-tutorial-to-use-yfinance/","summary":"\u003cp\u003eThe \u003ccode\u003eyfinance\u003c/code\u003e Python library is a powerful tool for accessing financial data from Yahoo Finance. It allows users to download historical market data, fetch stock information, and analyze trends with minimal effort. In this tutorial, we will walk through the steps to install \u003ccode\u003eyfinance\u003c/code\u003e, retrieve stock data, and extract detailed stock information.\u003c/p\u003e\n\u003chr\u003e\n\u003ch4 id=\"1-installation\"\u003e1. \u003cstrong\u003eInstallation\u003c/strong\u003e\u003c/h4\u003e\n\u003cp\u003eTo begin, ensure that \u003ccode\u003eyfinance\u003c/code\u003e is installed on your system:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003epip install yfinance\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003ch4 id=\"2-downloading-historical-stock-data\"\u003e2. \u003cstrong\u003eDownloading Historical Stock Data\u003c/strong\u003e\u003c/h4\u003e\n\u003cp\u003eYou can download historical stock prices using the \u003ccode\u003eyfinance.download\u003c/code\u003e method:\u003c/p\u003e","title":"A Tutorial to use yfinance"},{"content":"Encountering the \u0026ldquo;Drive D: Not Found\u0026rdquo; error can be frustrating, especially when you rely on the drive for accessing critical data. This issue often occurs due to hardware malfunctions, incorrect system settings, or missing drive partitions. In this guide, we will walk you through the most effective troubleshooting steps to resolve the issue.\n1. Verify Physical Connections The first step is to ensure that all hardware connections are secure:\nIf Drive D: refers to an external hard drive or USB drive, check that the cables are properly connected and functional. Test the drive on another computer to confirm if it is recognized there. If not, the issue might be with the drive itself. For internal drives, ensure the SATA/IDE cables are securely attached inside the computer. 2. Check Disk Management Windows Disk Management can help identify if the drive is detected but not assigned a letter:\nPress Win + R, type diskmgmt.msc, and press Enter.\nLook for your Drive D: in the list of disks.\nIf the drive is unallocated, right-click and select \u0026ldquo;New Simple Volume\u0026rdquo; to assign a letter.\nIf the drive does not have a letter, right-click and select \u0026ldquo;Change Drive Letter and Paths\u0026hellip;\u0026rdquo; to assign D:.\n3. Update or Reinstall Drivers Outdated or corrupted drivers can prevent the system from recognizing the drive:\nPress Win + X and select \u0026ldquo;Device Manager.\u0026rdquo; Expand the \u0026ldquo;Disk Drives\u0026rdquo; or \u0026ldquo;Universal Serial Bus controllers\u0026rdquo; section. Right-click on the problematic drive and select \u0026ldquo;Update Driver.\u0026rdquo; If updating doesn’t work, uninstall the driver and restart your computer to let Windows reinstall it automatically. 4. Run Hardware and Devices Troubleshooter Windows includes a built-in troubleshooter that can diagnose and fix hardware issues:\nOpen the Settings app and navigate to System \u0026gt; Troubleshoot \u0026gt; Other Troubleshooters. Locate and run the \u0026ldquo;Hardware and Devices\u0026rdquo; troubleshooter. Follow the on-screen instructions to resolve any detected problems. 5. Check BIOS/UEFI Settings Sometimes, the drive may be disabled in BIOS/UEFI:\nRestart your computer and press the appropriate key (e.g., F2, F10, DEL) to access BIOS/UEFI settings. Navigate to the storage or boot options and ensure the drive is listed and enabled. Save the changes and exit. 6. Run CHKDSK for Drive Errors If the drive is detected but inaccessible, running CHKDSK might help:\nOpen Command Prompt as Administrator. Type chkdsk D: /f /r and press Enter. Allow the process to complete and then try accessing the drive again. Resolving the \u0026ldquo;Drive D: Not Found\u0026rdquo; issue requires a methodical approach. Start with the simple fixes, such as checking connections and updating drivers, before moving on to more advanced solutions like restoring partitions or running diagnostic tools. With patience and the right tools, you can usually recover access to your drive.\n","permalink":"https://coriva.eu.org/how-to-solve-the-drive-d-not-found-issue/","summary":"\u003cp\u003eEncountering the \u0026ldquo;Drive D: Not Found\u0026rdquo; error can be frustrating, especially when you rely on the drive for accessing critical data. This issue often occurs due to hardware malfunctions, incorrect system settings, or missing drive partitions. In this guide, we will walk you through the most effective troubleshooting steps to resolve the issue.\u003c/p\u003e\n\u003chr\u003e\n\u003ch4 id=\"1-verify-physical-connections\"\u003e1. \u003cstrong\u003eVerify Physical Connections\u003c/strong\u003e\u003c/h4\u003e\n\u003cp\u003eThe first step is to ensure that all hardware connections are secure:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eIf Drive D: refers to an external hard drive or USB drive, check that the cables are properly connected and functional.\u003c/li\u003e\n\u003cli\u003eTest the drive on another computer to confirm if it is recognized there. If not, the issue might be with the drive itself.\u003c/li\u003e\n\u003cli\u003eFor internal drives, ensure the SATA/IDE cables are securely attached inside the computer.\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch4 id=\"2-check-disk-management\"\u003e2. \u003cstrong\u003eCheck Disk Management\u003c/strong\u003e\u003c/h4\u003e\n\u003cp\u003eWindows Disk Management can help identify if the drive is detected but not assigned a letter:\u003c/p\u003e","title":"How to Solve the Drive D Not Found Issue"},{"content":"If you\u0026rsquo;ve encountered the dreaded black screen when using Remote Desktop Protocol (RDP) on Windows 11, you\u0026rsquo;re not alone. This issue can be frustrating, especially if you rely on RDP for work or remote troubleshooting. This blog will guide you through the steps to fix this problem.\nWhy Does the Black Screen Issue Occur? The black screen problem often arises due to incompatibilities or bugs introduced in updated NIC drivers. These drivers are critical for managing your network connections, and any conflict can disrupt services like RDP. Rolling back to a previous version of the NIC driver can resolve these compatibility issues.\nStep-by-Step Guide to Roll Back Your NIC Driver Step 1: Open Device Manager Press Win + X or right-click on the Start button. Select Device Manager from the menu. Step 2: Locate Your NIC In the Device Manager window, expand the Network adapters category. Find your NIC (commonly named something like \u0026ldquo;Intel Ethernet\u0026rdquo; or \u0026ldquo;Realtek Network Controller\u0026rdquo;). Step 3: Access Driver Properties Right-click on your NIC and select Properties. Navigate to the Driver tab. Step 4: Roll Back the Driver Click the Roll Back Driver button. (If this option is greyed out, you may need to download a previous version of the driver from the manufacturer’s website.) Follow the on-screen instructions to complete the rollback. Step 5: Restart Your Computer After the rollback, restart your computer to ensure the changes take effect.\nStep 6: Test RDP Open your RDP client and attempt to connect to the remote machine. Verify that the black screen issue is resolved. Preventing Future Issues To avoid similar problems in the future:\nPause Driver Updates: Temporarily pause automatic driver updates using the Windows Update settings or a tool like Group Policy Editor. Regular Backups: Always create a restore point or back up your drivers before updating them. Stay Updated: Keep an eye on the manufacturer\u0026rsquo;s website for stable driver releases. Conclusion The Windows 11 RDP black screen issue can be a significant hindrance, but rolling back your NIC driver is a quick and effective fix. By following the steps outlined above, you can restore your RDP functionality and get back to your tasks seamlessly.\nIf you found this guide helpful, share it with others facing the same problem! And if you have additional tips or questions, drop them in the comments below.\n","permalink":"https://coriva.eu.org/how-to-solve-the-windows-11-rdp-black-screen-issue/","summary":"\u003cp\u003eIf you\u0026rsquo;ve encountered the dreaded black screen when using Remote Desktop Protocol (RDP) on Windows 11, you\u0026rsquo;re not alone. This issue can be frustrating, especially if you rely on RDP for work or remote troubleshooting. This blog will guide you through the steps to fix this problem.\u003c/p\u003e\n\u003chr\u003e\n\u003ch4 id=\"why-does-the-black-screen-issue-occur\"\u003eWhy Does the Black Screen Issue Occur?\u003c/h4\u003e\n\u003cp\u003eThe black screen problem often arises due to incompatibilities or bugs introduced in updated NIC drivers. These drivers are critical for managing your network connections, and any conflict can disrupt services like RDP. Rolling back to a previous version of the NIC driver can resolve these compatibility issues.\u003c/p\u003e","title":"How to Solve the Windows 11 RDP Black Screen Issue"},{"content":"在开始大模型创业之前，首先应该想清楚下面五个问题，否则人无远虑，必有近忧。\n自ChatGPT面世以来，有两种趋势主导着初创公司和初创投资的世界，可惜这两种趋势都是错误的。首先，有一大批初创公司计划使用大模型（ChatGPT或GPT4）为已知问题提供更好的解决方案。这就像说他们正在拿一些预先烘焙的蛋糕之一，再在上面加点糖，就能使其更美味。其次，这些初创公司正在烘烤大量这些蛋糕，投资者已经开始关注糖本身的差异化——他们现在强调位于大模型之上的技术层的深度。最近一些成功融资的案例大多在宣扬糖本身拥有不同颜色、口味或质地。\n不幸的是，这还远远不够。提前要说明的是，绝不是说一个团队不能克服这些问题，而是说除非克服了它们，否则可能会陷入麻烦。\n大模型的输出不可预测 生成式AI以其不可预测性而臭名昭著。OpenAI已经提供了一个参数（温度），用于控制模型的创造力。即使设置为零，甚至使用新的函数调用功能，模型仍然会输出不确定的结果。只需尝试一遍又一遍地询问ChatGPT相同的问题就会发现这个问题。\n对于人类来说无所谓，但实际上，差异性表现出机器人的某种个性，这让它看起来更像人类。然而，对于计算机来说，这种差异性很难管理。这可能有很多原因：提示的细微变化，用户消息的某些边缘情况，甚至没有明显原因。\n虽然大模型为解决原始应用程序提供了大量的动力，但团队在使用大模型时通常更忙于适配大模型的输入输出格式，而不是实际开发下游应用程序。曾遇到多个团队，在一周内完成了他们的首个完全基于大模型解决方案。然后，随着他们尝试扩展规模，以及难于处理的不可预测性，他们开始回归更为传统、结构化的方法来解决问题。每一次这样的逆转都将解决方案从大模型所承诺的强大力量中夺走。\n大模型提供商下场自己实现应用 自2022年11月30日推出ChatGPT以来，以及随后推出GPT4，OpenAI已向其API添加了多个功能，如插件、JSON构建、函数调用等。从表面上看，“这使大模型更可预测了。”然而，你错过了重点——\nOpenAI的使命是使大模型更易于为每个人访问。这是它计划开发AGI的方式。为此，它不断推出新版本的GPT（4是最新的版本），并不断为每个版本添加新功能。例如，自ChatGPT或GPT4推出以来的几个月里，OpenAI已添加了插件、函数调用、更好的“引导”控件以及与Whisper模型的集成。\n每次添加和增强都使你一直在进行的创新变得不那么必要。实际上，我敢打赌，你或其他初创公司创新的大多数成功的东西都会以某种形式被添加到GPT中。他们并不是在做恶，他们只是忠于他们的使命。其他大模型提供商也是如此。换句话说，一旦你成功了，大模型就会复刻这件事，以便下一个人，包括你的客户，能够轻松地做你正在做的事情。\n基于大模型的解决方案可能并不值得 大模型是一项令人惊奇的发明，它将改变技术创新的步伐。然而，它们在可预测性、幻觉等方面面临着无数问题。如果您将大模型应用为解决现有问题的新方法而不重新构想问题本身，那么这确实欠考虑。\n即使有了基于大模型的解决方案，也需要清楚竞争是很激烈的。您不仅在与其他大模型解决方案竞争，而且这些解决方案的门槛变得越来越低，你不仅需要与OpenAI竞争，而且还与对于该问题已存在的所有解决方案竞争。\n我们还要承认，当前的解决方案可能没有解决问题的效果那么好。但是，当前的解决方案可能已经以低成本完成了很好的工作。如果它运作良好，那么没有理由颠覆它。如果它运作不好，那么它在客户心目中已经创造了一个巨大的期望障碍，你的市场营销或销售周期必须克服。\n因此，除非你重新定义问题或创造了一种没有参照的体验，否则请暂停你的想法。即使是Open AI，也先后尝试了GPT1、GPT2、GPT3，然后是GPT3.5，才能解决行业中的一些实际问题。许多其他公司，根本无法说服市场或资本。\n大模型看起来像捷径，然而并不是 尽管GPT改变了一切，但实际上什么也没改变。总结一下：即使使用大模型，要构建一个成功的业务，你仍然必须像以前一样投资于产品、工程和科学创新。出于上述原因以及我在文章中引用的一系列原因，这对于工作流程集成、用户体验、控制、成本、倡导、客户品牌等来说是必要的。\n当您以那个数量级进行投资时，您正在构建的解决方案不再是基于大模型的解决方案。相反，它是依赖于产品、工程和科学方面的这些创新的解决方案。换句话说，大模型只是你旅程中的一个同伴，并不是目的地。你仍然需要像在大模型之前那样努力工作，以创造可持续的竞争优势。\n大模型存在严重的安全问题 最后，但丝毫不可忽视的是企业安全的概念。到目前为止，我们已经讨论了对生成式人工智能的控制的问题，这已经够糟糕的了。另一个重要问题是大模型处理的所有内容都需要传输到云端，这是大部分企业所不能容忍的。\n像Open AI和Anthropic这样的大模型提供商对安全问题有合理且透明的政策。然而，这并非百分之百可靠；他们不能保证他们自己不会查看数据。这是信息安全的古老格言——一旦离开你的防火墙，你就真的无法控制了。\n一些初创公司考虑的另一种选择是将专有的大模型考虑在其（或客户的）防火墙内。这确实是一个合理的选择，但现在大模型不再是易于使用的工具。除了在产品、工程和与你的领域相关的科学方面进行创新，你还不得不在大模型上进行创新，。\n再次强调，这篇文章绝不是为了阻止在大模型领域创业或启动大模型项目的论点。这只是一个提醒——在你着手计划之前，一些值得深思的内容。\n","permalink":"https://coriva.eu.org/llm-based-startup-issues/","summary":"\u003cp\u003e在开始大模型创业之前，首先应该想清楚下面五个问题，否则人无远虑，必有近忧。\u003c/p\u003e\n\u003cp\u003e \u003c/p\u003e\n\u003cp\u003e自ChatGPT面世以来，有两种趋势主导着初创公司和初创投资的世界，可惜这两种趋势都是错误的。首先，有一大批初创公司计划使用大模型（ChatGPT或GPT4）为已知问题提供更好的解决方案。这就像说他们正在拿一些预先烘焙的蛋糕之一，再在上面加点糖，就能使其更美味。其次，这些初创公司正在烘烤大量这些蛋糕，投资者已经开始关注糖本身的差异化——他们现在强调位于大模型之上的技术层的深度。最近一些成功融资的案例大多在宣扬糖本身拥有不同颜色、口味或质地。\u003c/p\u003e\n\u003cp\u003e \u003c/p\u003e\n\u003cp\u003e不幸的是，这还远远不够。提前要说明的是，绝不是说一个团队不能克服这些问题，而是说除非克服了它们，否则可能会陷入麻烦。\u003c/p\u003e\n\u003cp\u003e \u003c/p\u003e\n\u003ch2 id=\"大模型的输出不可预测\"\u003e大模型的输出不可预测\u003c/h2\u003e\n\u003cp\u003e \u003c/p\u003e\n\u003cp\u003e生成式AI以其不可预测性而臭名昭著。OpenAI已经提供了一个参数（温度），用于控制模型的创造力。即使设置为零，甚至使用新的函数调用功能，模型仍然会输出不确定的结果。只需尝试一遍又一遍地询问ChatGPT相同的问题就会发现这个问题。\u003c/p\u003e\n\u003cp\u003e \u003c/p\u003e\n\u003cp\u003e对于人类来说无所谓，但实际上，差异性表现出机器人的某种个性，这让它看起来更像人类。然而，对于计算机来说，这种差异性很难管理。这可能有很多原因：提示的细微变化，用户消息的某些边缘情况，甚至没有明显原因。\u003c/p\u003e\n\u003cp\u003e \u003c/p\u003e\n\u003cp\u003e虽然大模型为解决原始应用程序提供了大量的动力，但团队在使用大模型时通常更忙于适配大模型的输入输出格式，而不是实际开发下游应用程序。曾遇到多个团队，在一周内完成了他们的首个完全基于大模型解决方案。然后，随着他们尝试扩展规模，以及难于处理的不可预测性，他们开始回归更为传统、结构化的方法来解决问题。每一次这样的逆转都将解决方案从大模型所承诺的强大力量中夺走。\u003c/p\u003e\n\u003cp\u003e \u003c/p\u003e\n\u003ch2 id=\"大模型提供商下场自己实现应用\"\u003e大模型提供商下场自己实现应用\u003c/h2\u003e\n\u003cp\u003e \u003c/p\u003e\n\u003cp\u003e自2022年11月30日推出ChatGPT以来，以及随后推出GPT4，OpenAI已向其API添加了多个功能，如插件、JSON构建、函数调用等。从表面上看，“这使大模型更可预测了。”然而，你错过了重点——\u003c/p\u003e\n\u003cp\u003e \u003c/p\u003e\n\u003cp\u003eOpenAI的使命是使大模型更易于为每个人访问。这是它计划开发AGI的方式。为此，它不断推出新版本的GPT（4是最新的版本），并不断为每个版本添加新功能。例如，自ChatGPT或GPT4推出以来的几个月里，OpenAI已添加了插件、函数调用、更好的“引导”控件以及与Whisper模型的集成。\u003c/p\u003e\n\u003cp\u003e \u003c/p\u003e\n\u003cp\u003e每次添加和增强都使你一直在进行的创新变得不那么必要。实际上，我敢打赌，你或其他初创公司创新的大多数成功的东西都会以某种形式被添加到GPT中。他们并不是在做恶，他们只是忠于他们的使命。其他大模型提供商也是如此。换句话说，一旦你成功了，大模型就会复刻这件事，以便下一个人，包括你的客户，能够轻松地做你正在做的事情。\u003c/p\u003e\n\u003cp\u003e \u003c/p\u003e\n\u003ch2 id=\"基于大模型的解决方案可能并不值得\"\u003e基于大模型的解决方案可能并不值得\u003c/h2\u003e\n\u003cp\u003e \u003c/p\u003e\n\u003cp\u003e大模型是一项令人惊奇的发明，它将改变技术创新的步伐。然而，它们在可预测性、幻觉等方面面临着无数问题。如果您将大模型应用为解决现有问题的新方法而不重新构想问题本身，那么这确实欠考虑。\u003c/p\u003e\n\u003cp\u003e \u003c/p\u003e\n\u003cp\u003e即使有了基于大模型的解决方案，也需要清楚竞争是很激烈的。您不仅在与其他大模型解决方案竞争，而且这些解决方案的门槛变得越来越低，你不仅需要与OpenAI竞争，而且还与对于该问题已存在的所有解决方案竞争。\u003c/p\u003e\n\u003cp\u003e \u003c/p\u003e\n\u003cp\u003e我们还要承认，当前的解决方案可能没有解决问题的效果那么好。但是，当前的解决方案可能已经以低成本完成了很好的工作。如果它运作良好，那么没有理由颠覆它。如果它运作不好，那么它在客户心目中已经创造了一个巨大的期望障碍，你的市场营销或销售周期必须克服。\u003c/p\u003e\n\u003cp\u003e \u003c/p\u003e\n\u003cp\u003e因此，除非你重新定义问题或创造了一种没有参照的体验，否则请暂停你的想法。即使是Open AI，也先后尝试了GPT1、GPT2、GPT3，然后是GPT3.5，才能解决行业中的一些实际问题。许多其他公司，根本无法说服市场或资本。\u003c/p\u003e\n\u003cp\u003e \u003c/p\u003e\n\u003ch2 id=\"大模型看起来像捷径然而并不是\"\u003e大模型看起来像捷径，然而并不是\u003c/h2\u003e\n\u003cp\u003e尽管GPT改变了一切，但实际上什么也没改变。总结一下：即使使用大模型，要构建一个成功的业务，你仍然必须像以前一样投资于产品、工程和科学创新。出于上述原因以及我在文章中引用的一系列原因，这对于工作流程集成、用户体验、控制、成本、倡导、客户品牌等来说是必要的。\u003c/p\u003e\n\u003cp\u003e \u003c/p\u003e\n\u003cp\u003e当您以那个数量级进行投资时，您正在构建的解决方案不再是基于大模型的解决方案。相反，它是依赖于产品、工程和科学方面的这些创新的解决方案。换句话说，大模型只是你旅程中的一个同伴，并不是目的地。你仍然需要像在大模型之前那样努力工作，以创造可持续的竞争优势。\u003c/p\u003e\n\u003cp\u003e \u003c/p\u003e\n\u003ch2 id=\"大模型存在严重的安全问题\"\u003e大模型存在严重的安全问题\u003c/h2\u003e\n\u003cp\u003e \u003c/p\u003e\n\u003cp\u003e最后，但丝毫不可忽视的是企业安全的概念。到目前为止，我们已经讨论了对生成式人工智能的控制的问题，这已经够糟糕的了。另一个重要问题是大模型处理的所有内容都需要传输到云端，这是大部分企业所不能容忍的。\u003c/p\u003e\n\u003cp\u003e \u003c/p\u003e\n\u003cp\u003e像Open AI和Anthropic这样的大模型提供商对安全问题有合理且透明的政策。然而，这并非百分之百可靠；他们不能保证他们自己不会查看数据。这是信息安全的古老格言——一旦离开你的防火墙，你就真的无法控制了。\u003c/p\u003e\n\u003cp\u003e \u003c/p\u003e\n\u003cp\u003e一些初创公司考虑的另一种选择是将专有的大模型考虑在其（或客户的）防火墙内。这确实是一个合理的选择，但现在大模型不再是易于使用的工具。除了在产品、工程和与你的领域相关的科学方面进行创新，你还不得不在大模型上进行创新，。\u003c/p\u003e\n\u003cp\u003e \u003c/p\u003e\n\u003cp\u003e再次强调，这篇文章绝不是为了阻止在大模型领域创业或启动大模型项目的论点。这只是一个提醒——在你着手计划之前，一些值得深思的内容。\u003c/p\u003e","title":"大模型创业前必须想清楚的问题"},{"content":"微软发布了Phi-2，这是一个拥有27亿参数的语言模型，展示了出色的推理和语言理解能力，在小于130亿参数的基础语言模型中表现出最先进的性能。在复杂的基准测试中，由于模型扩展和训练数据精选方面的创新，Phi-2能够匹敌或超越大约25倍更大的模型。\n由于其紧凑的规模，Phi-2成为研究人员的理想平台，可用于深入研究机械解释性、安全性改进或在各种任务上进行微调实验。微软已将Phi-2纳入Azure AI Studio模型目录，以促进语言模型研究和开发。\nPhi-2的关键技术 将语言模型的规模大幅增加到数千亿个参数已经解锁了一系列新兴能力，重新定义了自然语言处理的格局。一个问题仍然存在，即是否可以通过战略性的训练选择，例如数据选择，在较小的规模上实现这种新兴能力。\n使用Phi模型的工作旨在通过训练能够在性能上与规模更大的模型媲美（但仍远离前沿模型）的SLMs来回答这个问题。在打破传统语言模型缩放规律的过程中，通过Phi-2获得的关键见解有两个：\n首先，训练数据的质量在模型性能中起着至关重要的作用。这个观点几十年来一直存在，但通过专注于“教科书级别”数据将这一观点发挥到了极致，延续了之前的工作“只需要教科书”。全部训练数据混合包含了专门用于教授模型常识推理和一般知识的合成数据集，包括科学、日常活动和心灵理论等。研究员还通过根据教育价值和内容质量进行过滤的精心选择的Web数据来增加训练语料库。其次，使用了创新技术进行扩展，从13亿参数模型Phi-1.5开始，并将其知识嵌入到27亿参数的Phi-2中。这种规模化的知识传递不仅加速了训练收敛，还显示出Phi-2基准测试分数的明显提升。 训练细节 Phi-2是一个基于Transformer的模型，具有下一个单词预测目标，使用了1.4T个标记进行训练，通过多次在合成和Web数据集上进行NLP和编码的混合。Phi-2的训练在96个A100 GPU上花费了14天。Phi-2是一个基础模型，没有经过通过人类反馈的强化学习对齐（RLHF）的调整，也没有进行指令微调。尽管如此，观察到在毒性和偏见方面，与经过对齐的现有开源模型相比，Phi-2表现更好（见图3）。这与Phi-1.5中看到的情况一致，这归因于量身定制的数据策划技术。\nPhi-2 评估 以下是对Phi-2在学术基准上的性能总结，与流行的语言模型进行比较。基准涵盖了多个类别，包括 Big Bench Hard（BBH）（使用CoT进行3次射击），常识推理（PIQA、WinoGrande、ARC易和挑战、SIQA），语言理解（HellaSwag、OpenBookQA、MMLU（5次射击）、SQuADv2（2次射击）、BoolQ），数学（GSM8k（8次射击）），以及编码（HumanEval、MBPP（3次射击））。\n仅有27亿参数的Phi-2在各种综合基准上超越了7B和13B参数的Mistral和Llama-2模型的性能。值得注意的是，在多步推理任务，如编码和数学上，Phi-2在性能上超过了25倍更大的Llama-2-70B模型。此外，尽管规模较小，Phi-2在性能上也与最近宣布的Google Gemini Nano 2相匹敌或更胜一筹。\n当然，模型评估存在一些挑战，许多公共基准可能会泄漏到训练数据中。对于Phi-1已进行了详尽的净化研究，以排除这种可能性，详情可参见“Textbooks Are All You Need”。秉持这一精神，还使用了几个微软内部专有的数据集和任务评估了Phi-2，再次将其与Mistral和Llama-2进行了比较。研究员观察到相似的趋势，即在平均水平上，Phi-2优于Mistral-7B，而后者优于Llama-2模型（7B、13B和70B）。\n除了这些基准测试之外，微软还对研究社区常用的提示进行了广泛测试。\n","permalink":"https://coriva.eu.org/phi-2-summary/","summary":"\u003cp\u003e微软发布了Phi-2，这是一个拥有27亿参数的语言模型，展示了出色的推理和语言理解能力，在小于130亿参数的基础语言模型中表现出最先进的性能。在复杂的基准测试中，由于模型扩展和训练数据精选方面的创新，Phi-2能够匹敌或超越大约25倍更大的模型。\u003c/p\u003e\n\u003cp\u003e由于其紧凑的规模，Phi-2成为研究人员的理想平台，可用于深入研究机械解释性、安全性改进或在各种任务上进行微调实验。微软已将Phi-2纳入Azure AI Studio模型目录，以促进语言模型研究和开发。\u003c/p\u003e\n\u003ch2 id=\"phi-2的关键技术\"\u003ePhi-2的关键技术\u003c/h2\u003e\n\u003cp\u003e将语言模型的规模大幅增加到数千亿个参数已经解锁了一系列新兴能力，重新定义了自然语言处理的格局。一个问题仍然存在，即是否可以通过战略性的训练选择，例如数据选择，在较小的规模上实现这种新兴能力。\u003c/p\u003e\n\u003cp\u003e使用Phi模型的工作旨在通过训练能够在性能上与规模更大的模型媲美（但仍远离前沿模型）的SLMs来回答这个问题。在打破传统语言模型缩放规律的过程中，通过Phi-2获得的关键见解有两个：\u003c/p\u003e\n\u003cp\u003e首先，训练数据的质量在模型性能中起着至关重要的作用。这个观点几十年来一直存在，但通过专注于“教科书级别”数据将这一观点发挥到了极致，延续了之前的工作“只需要教科书”。全部训练数据混合包含了专门用于教授模型常识推理和一般知识的合成数据集，包括科学、日常活动和心灵理论等。研究员还通过根据教育价值和内容质量进行过滤的精心选择的Web数据来增加训练语料库。其次，使用了创新技术进行扩展，从13亿参数模型Phi-1.5开始，并将其知识嵌入到27亿参数的Phi-2中。这种规模化的知识传递不仅加速了训练收敛，还显示出Phi-2基准测试分数的明显提升。 \u003c/p\u003e\n\u003cp\u003e \u003c/p\u003e\n\u003ch2 id=\"训练细节\"\u003e训练细节\u003c/h2\u003e\n\u003cp\u003ePhi-2是一个基于Transformer的模型，具有下一个单词预测目标，使用了1.4T个标记进行训练，通过多次在合成和Web数据集上进行NLP和编码的混合。Phi-2的训练在96个A100 GPU上花费了14天。Phi-2是一个基础模型，没有经过通过人类反馈的强化学习对齐（RLHF）的调整，也没有进行指令微调。尽管如此，观察到在毒性和偏见方面，与经过对齐的现有开源模型相比，Phi-2表现更好（见图3）。这与Phi-1.5中看到的情况一致，这归因于量身定制的数据策划技术。\u003c/p\u003e\n\u003ch2 id=\"phi-2-评估\"\u003ePhi-2 评估\u003c/h2\u003e\n\u003cp\u003e以下是对Phi-2在学术基准上的性能总结，与流行的语言模型进行比较。基准涵盖了多个类别，包括 Big Bench Hard（BBH）（使用CoT进行3次射击），常识推理（PIQA、WinoGrande、ARC易和挑战、SIQA），语言理解（HellaSwag、OpenBookQA、MMLU（5次射击）、SQuADv2（2次射击）、BoolQ），数学（GSM8k（8次射击）），以及编码（HumanEval、MBPP（3次射击））。\u003c/p\u003e\n\u003cp\u003e仅有27亿参数的Phi-2在各种综合基准上超越了7B和13B参数的Mistral和Llama-2模型的性能。值得注意的是，在多步推理任务，如编码和数学上，Phi-2在性能上超过了25倍更大的Llama-2-70B模型。此外，尽管规模较小，Phi-2在性能上也与最近宣布的Google Gemini Nano 2相匹敌或更胜一筹。\u003c/p\u003e\n\u003cp\u003e当然，模型评估存在一些挑战，许多公共基准可能会泄漏到训练数据中。对于Phi-1已进行了详尽的净化研究，以排除这种可能性，详情可参见“Textbooks Are All You Need”。秉持这一精神，还使用了几个微软内部专有的数据集和任务评估了Phi-2，再次将其与Mistral和Llama-2进行了比较。研究员观察到相似的趋势，即在平均水平上，Phi-2优于Mistral-7B，而后者优于Llama-2模型（7B、13B和70B）。\u003c/p\u003e\n\u003cp\u003e除了这些基准测试之外，微软还对研究社区常用的提示进行了广泛测试。\u003c/p\u003e","title":"Phi-2: 小型语言模型的惊人威力"},{"content":"微软最近提出了一个有趣的方法，即使用合成教科书来教授模型，而不是通常使用的大规模数据集。\n论文原文：https://arxiv.org/abs/2306.11644\n这篇论文介绍了一个名为Phi-1的模型，它完全是在一本定制的教科书上进行训练的。研究人员发现，对于某些任务，这种方法和使用大量数据进行训练的规模更大的模型一样有效。\n标题\u0026quot;Textbooks Are All You Need\u0026quot;巧妙地引用了人工智能领域中众所周知的概念“Attention is All You Need”。但在这里，他们颠覆了这个想法——与其专注于模型体系结构本身，不如展示像在教科书中找到的高质量策划训练数据的价值。\n论文的关键思路：一个经过深思熟虑、设计良好的数据集对于教授人工智能模型可以和庞大而缺乏焦点的数据堆一样有用。因此，研究人员制作了一本合成教科书，精心为模型提供所需的知识。\n这基于教科书的方法是一个引人入胜的新方向，可以有效地训练人工智能模型以在特定任务上表现卓越。它强调了对培训数据的策划和质量的重要性，而不仅仅是数据规模的强大。\n主要观点 尽管Phi-1模型比GPT-3等模型要小得多，但在Python编码任务中表现出色。这表明在人工智能模型方面，规模并非一切。 研究人员使用合成教科书进行训练，强调了高质量、经过精心策划的数据的重要性。这种方法可能会改变我们对于培训人工智能模型的看法。 通过使用合成的练习和解决方案对Phi-1模型进行微调，其性能显著提高，表明有针对性的微调可以增强模型在特定任务之外的能力。 讨论 Phi-1模型具有13亿个参数，相对于拥有1750亿参数的GPT-3等模型来说，规模较小。尽管如此，Phi-1在Python编码任务中表现出色，突显了培训数据的质量对于模型的重要性，甚至可能比模型规模更为关键。\n研究人员使用合成教科书来训练Phi-1模型，该教科书是使用GPT-3.5生成的，包含了Python文本和练习。使用合成教科书强调了在培训人工智能模型时高质量、精心策划数据的重要性。这一方法有可能将人工智能培训的焦点从创建更大模型转向策划更好的培训数据。\n有趣的是，通过使用合成的练习和解决方案对Phi-1模型进行微调，其性能显著提高。这种改进并不仅限于其特定训练任务。例如，模型使用外部库（如pygame）的能力得到改善，尽管这些库并未包含在训练数据中。这表明微调可以增强模型在特定训练任务之外的能力。\n","permalink":"https://coriva.eu.org/textbooks-are-all-you-need-summary/","summary":"\u003cp\u003e微软最近提出了一个有趣的方法，即使用合成教科书来教授模型，而不是通常使用的大规模数据集。\u003c/p\u003e\n\u003cp\u003e论文原文：\u003ca href=\"https://arxiv.org/abs/2306.11644\"\u003ehttps://arxiv.org/abs/2306.11644\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e这篇论文介绍了一个名为Phi-1的模型，它完全是在一本定制的教科书上进行训练的。研究人员发现，对于某些任务，这种方法和使用大量数据进行训练的规模更大的模型一样有效。\u003c/p\u003e\n\u003cp\u003e标题\u0026quot;Textbooks Are All You Need\u0026quot;巧妙地引用了人工智能领域中众所周知的概念“Attention is All You Need”。但在这里，他们颠覆了这个想法——与其专注于模型体系结构本身，不如展示像在教科书中找到的高质量策划训练数据的价值。\u003c/p\u003e\n\u003cp\u003e论文的关键思路：一个经过深思熟虑、设计良好的数据集对于教授人工智能模型可以和庞大而缺乏焦点的数据堆一样有用。因此，研究人员制作了一本合成教科书，精心为模型提供所需的知识。\u003c/p\u003e\n\u003cp\u003e这基于教科书的方法是一个引人入胜的新方向，可以有效地训练人工智能模型以在特定任务上表现卓越。它强调了对培训数据的策划和质量的重要性，而不仅仅是数据规模的强大。\u003c/p\u003e\n\u003ch2 id=\"主要观点\"\u003e\u003cstrong\u003e主要观点\u003c/strong\u003e\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e尽管Phi-1模型比GPT-3等模型要小得多，但在Python编码任务中表现出色。这表明在人工智能模型方面，规模并非一切。\u003c/li\u003e\n\u003cli\u003e研究人员使用合成教科书进行训练，强调了高质量、经过精心策划的数据的重要性。这种方法可能会改变我们对于培训人工智能模型的看法。\u003c/li\u003e\n\u003cli\u003e通过使用合成的练习和解决方案对Phi-1模型进行微调，其性能显著提高，表明有针对性的微调可以增强模型在特定任务之外的能力。\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"讨论\"\u003e\u003cstrong\u003e讨论\u003c/strong\u003e\u003c/h2\u003e\n\u003cp\u003ePhi-1模型具有13亿个参数，相对于拥有1750亿参数的GPT-3等模型来说，规模较小。尽管如此，Phi-1在Python编码任务中表现出色，突显了培训数据的质量对于模型的重要性，甚至可能比模型规模更为关键。\u003c/p\u003e\n\u003cp\u003e研究人员使用合成教科书来训练Phi-1模型，该教科书是使用GPT-3.5生成的，包含了Python文本和练习。使用合成教科书强调了在培训人工智能模型时高质量、精心策划数据的重要性。这一方法有可能将人工智能培训的焦点从创建更大模型转向策划更好的培训数据。\u003c/p\u003e\n\u003cp\u003e有趣的是，通过使用合成的练习和解决方案对Phi-1模型进行微调，其性能显著提高。这种改进并不仅限于其特定训练任务。例如，模型使用外部库（如pygame）的能力得到改善，尽管这些库并未包含在训练数据中。这表明微调可以增强模型在特定训练任务之外的能力。\u003c/p\u003e","title":"Textbooks Are All You Need 精要"},{"content":"在软件开发领域，有一个广受开发者共鸣的词汇——“屎山代码”（Spaghetti Code），这个术语形象地描述了一种混乱、难以理解和难以维护的代码结构。本文将深入解析什么是“屎山代码”以及它为何成为软件开发中的一大陷阱。\n1. 屎山代码的定义 屎山代码是指那些结构混乱、缺乏清晰逻辑、难以理解的代码。让我们通过一个简单的示例来了解：\ndef process_data(data): for item in data: if \u0026#39;value\u0026#39; in item: item_value = item[\u0026#39;value\u0026#39;] if item_value: if item_value \u0026gt; 0: result = calculate_result(item_value) print(f\u0026#34;The result is: {result}\u0026#34;) 这段代码看似简单，但实际上存在多层嵌套和冗余条件，使得代码逻辑难以理解。这就是屎山代码的一个典型例子。\n2. 屎山代码的成因 2.1 缺乏规划与设计 想象一个场景，开发者在项目中加入了一些紧急需求，导致代码出现了冗余和混乱：\n# 紧急需求1 def process_data(data): # ... # 紧急需求2 def process_data_updated(data): # ... # ... 在没有良好规划的情况下，紧急需求的堆积使得代码结构变得混乱，成为屎山代码的一部分。\n2.2 缺乏文档与注释 代码缺乏注释和文档通常导致理解困难，例如：\n// 这是一个处理数据的函数 function processData(data) { // 循环数据 for (let i = 0; i 0) { // 计算结果 let result = calculateResult(value); // 打印结果 console.log(\u0026#39;The result is: \u0026#39; + result); } } } } 这段代码存在注释，但注释过于庞大，实际上没有解释清楚函数的整体作用，导致代码难以理解。\n2.3 单一职责原则的疏忽 一个函数承担过多责任的情况：\npublic class UserManager { public void processUserData(User user) { // 处理用户数据 // ... // 发送邮件通知 // ... // 记录日志 // ... // 更新用户状态 // ... } } 这个类违反了单一职责原则，将处理用户数据、发送邮件、记录日志和更新用户状态等多个任务都堆砌在一个函数中，导致代码变得杂乱不堪。\n3. 屎山代码的危害 3.1 维护成本高昂 在屎山代码的例子中，由于混乱的结构和逻辑，修改任何部分都可能导致意外的后果，增加了维护成本。\n3.2 难以扩展和重用 屎山代码的复杂性使得很难在不引发其他问题的情况下添加新功能或重用现有代码。\n3.3 团队协作问题 团队成员难以理解和协作，因为代码缺乏清晰的结构和文档，项目进度受到严重阻碍。\n4. 如何避免屎山代码 4.1 充分规划与设计 通过充分规划和设计确保项目有清晰的结构，避免因急功近利而产生的屎山代码。\n4.2 注重文档和注释 为代码添加清晰的注释和文档，使得其他开发者能够轻松理解代码的用途和逻辑。\n4.3 遵循设计原则 遵循设计原则，确保每个组件和函数都遵循单一职责原则，有助于构建清晰、可维护的代码结构。\n","permalink":"https://coriva.eu.org/how-to-prevent-spaghetti-code/","summary":"\u003cp\u003e在软件开发领域，有一个广受开发者共鸣的词汇——“屎山代码”（Spaghetti Code），这个术语形象地描述了一种混乱、难以理解和难以维护的代码结构。本文将深入解析什么是“屎山代码”以及它为何成为软件开发中的一大陷阱。\u003c/p\u003e\n\u003ch3 id=\"1-屎山代码的定义\"\u003e1. 屎山代码的定义\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003e屎山代码\u003c/strong\u003e是指那些结构混乱、缺乏清晰逻辑、难以理解的代码。让我们通过一个简单的示例来了解：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edef process_data(data):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    for item in data:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        if \u0026#39;value\u0026#39; in item:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            item_value = item[\u0026#39;value\u0026#39;]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            if item_value:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                if item_value \u0026gt; 0:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                    result = calculate_result(item_value)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                    print(f\u0026#34;The result is: {result}\u0026#34;)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e这段代码看似简单，但实际上存在多层嵌套和冗余条件，使得代码逻辑难以理解。这就是屎山代码的一个典型例子。\u003c/p\u003e\n\u003ch3 id=\"2-屎山代码的成因\"\u003e2. 屎山代码的成因\u003c/h3\u003e\n\u003ch4 id=\"21-缺乏规划与设计\"\u003e2.1 缺乏规划与设计\u003c/h4\u003e\n\u003cp\u003e想象一个场景，开发者在项目中加入了一些紧急需求，导致代码出现了冗余和混乱：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e# 紧急需求1\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edef process_data(data):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    # ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e# 紧急需求2\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edef process_data_updated(data):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    # ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e# ...\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e在没有良好规划的情况下，紧急需求的堆积使得代码结构变得混乱，成为屎山代码的一部分。\u003c/p\u003e\n\u003ch4 id=\"22-缺乏文档与注释\"\u003e2.2 缺乏文档与注释\u003c/h4\u003e\n\u003cp\u003e代码缺乏注释和文档通常导致理解困难，例如：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e// 这是一个处理数据的函数\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003efunction processData(data) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  // 循环数据\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  for (let i = 0; i  0) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        // 计算结果\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        let result = calculateResult(value);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        // 打印结果\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        console.log(\u0026#39;The result is: \u0026#39; + result);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e这段代码存在注释，但注释过于庞大，实际上没有解释清楚函数的整体作用，导致代码难以理解。\u003c/p\u003e","title":"“屎山代码”：开发中的陷阱与教训"},{"content":"《The Lessons of History》是由威尔·杜兰特（Will Durant）和阿里尔·杜兰特（Ariel Durant）夫妇合作编写的一本书，它于1968年首次出版。这本书是一部关于历史哲学的作品，从历史的角度探讨了人类社会的发展和演变，并试图从历史中汲取宝贵的教训。\n地理对文明产生了巨大影响，但随着技术的进步，其影响正在逐渐减弱。 想象一下你的家乡。它是在河流、海洋还是湖泊附近？它有良好的铁路连接吗？对这些简单问题的回答可以揭示一个地方的很多信息。这是因为我们建造城市的地理条件实际上对它们的发展有巨大影响。这在整个人类历史中一直如此；人们总是在河流、湖泊、绿洲和海洋附近定居。这不仅仅是因为它们提供水和食物：水体还能促进交通和贸易。考虑下美索不达米亚。这个古老的城市被普遍认为是人类文明的发源地，它建立在幼发拉底和底格里斯两大河流之间的定居点上。位于这两条河流之间的土地使苏美尔人和巴比伦人等文化得以繁荣和建立他们的帝国。许多其他帝国也是在河流旁边建立的：古埃及被称为尼罗河的馈赠，古罗马因其接近台伯河、阿诺河和波河而增长。然而，地理条件是可以改变的。气候的极端变化一直是驱使无数文明迁徙的原因，也是许多文明衰落的原因。如果雨水变得稀缺，就会导致像中亚部分地区那样的文明衰落。相反，如果雨水太多，就像在中美洲某些地区那样，丛林可能会过度生长，以至于淹没整个城市。然而，在近年来，技术已经改变了我们与地理的关系。通过文明技术的演变，如运输货物的技术，地理对文明本身的影响正在减小。关键机器的发明，如飞机、火车和汽车，使运输货物变得更加容易。我们不再受限于沿河流和海洋进行贸易，因为飞机可以直接在我们头上运输货物。这实际上解释了为什么英国和法国在汽车、火车和飞机成为主流后开始失去它们曾经拥有的商业优势。英国和法国不再拥有它们的海岸线曾经给予它们的巨大优势，而俄罗斯、中国和巴西等国也不再受到它们庞大陆地的阻碍。\n生活是竞争的，人类并非生来平等。 你小时候是否曾经在体育课上挑选过队员？如果是的话，你可能会尽量选择尽可能多的运动员。历史，就像体育课一样，本质上是竞争性的，而不是每个人都能够平等匹配。我们天生具有竞争性的本性，而我们的祖先是这种天性的原因。我们的祖先的生存取决于战斗和杀戮，我们从他们那里继承了这种暴力倾向。人们往往相互合作，然而这种社会合作存在的唯一目的是为了给予我们竞争优势。我们主要以群体的形式运作，从家庭到社区再到国家，因为这种群体取向使我们能够与其他群体竞争。我们组建国家是为了保护自己免受其他国家的侵害。只有当它们联合起来，成为一个更大的保护群体的成员时，国家才能停止战斗，从而使它们的生存得到好处。我们对竞争的倾向涉及到一些不同的因素。首先，有必要认识到不平等是自然而然的——减少不平等实际上是以自由为代价的。遗传是人们独特的身体和精神优势——以及劣势——的原因。虽然我们能够随着时间的推移改善自己，但我们的基因无法改变。这意味着人们从出生时就天生不平等。通过社会的不断复杂化，我们的自然不平等变得更加严重。现代社会对于那些专业化技能的人有更大的需求，因此创造更多平等的唯一途径就是限制自由。让我们稍微考虑一下。随着时间的推移，人们变得越来越自由，他们之间的不平等就会越来越大，因为自由使某些人能够获得不公平的经济权力。例如，在19世纪，英格兰和美国采取了一种叫做自由放任的经济政策，即政府尽可能少地干预经济。在这个时期，不平等急剧增加。\n文明的进步与种族无关。 是什么让欧洲能够孕育出如此先进的技术社会？历史教导许多白人相信他们的种族使他们天生更聪明。但文明不是种族的产物，而是地理的产物。被广泛认为是现代种族思想之父的法国贵族和小说家约瑟夫·亚瑟·戈宾奥（Joseph Arthur, Comte de Gobineau）认为，不同种族的人天生具有不同的身体和智力能力。他认为雅利安种族是最优越的，是文明的创造者。戈宾奥主张，仅仅通过环境的优势无法解释文明的兴起，因为北美的印第安人拥有与古埃及相同的有利条件。他还写道，单单政治制度不能创造文明，因为古希腊是基于民主的，而埃及则是君主制的。这意味着，根据戈宾奥的观点，文明完全是由种族决定的，只有白人才能创造它。他还坚信，白人文明在与其他种族混合时表现不佳。这意味着他认为当时美国的白人由于与土著人没有混血，因此更为优越，与在拉丁美洲的欧洲移民混血的情况形成鲜明对比。戈宾奥的论点很容易被证伪。世界上存在着远离彼此发展的先进文化。中国在古埃及或罗马崛起之前就有了高度发达的文明，而中南美洲的印加、玛雅和印第安文明也有着充分的记载。实际上，古希腊和罗马文明的许多特征都源于更远东的地方。在公元前第二个千年，古希腊实际上从小亚细亚（今天的土耳其）吸取了许多影响。这意味着这一文化的特征然后传承给了我们从历史书中了解到的罗马人。\n我们的个性、道德和社会习俗是我们成长的时代和文化的产物。 很难想象与生活在古代的人们建立起某种联系；他们似乎根本就是不同的。然而，贯穿历史，人类本性在很大程度上并没有发生太大变化。人类的本性直接来自我们成长的文化。人类的本性可能在我们在地球上繁衍的几千年里发生了变化，这可以通过进化来看到，但我们进食、睡眠和繁殖的基本本能仍然保持不变。随着时间的推移，唯一发生了根本变化的是我们的技术。如果一个古希腊公民穿越时空来到现代世界，他们在身体上可能与我们非常相似，但他们对文化的理解将会截然不同。人类的进化是社会的，而非生物的。随着时间的推移，我们的物种经历了巨大的变化：从经济、政治、智力，甚至到道德。但请记住：文化环境决定社会行为。因此，如果一个婴儿可以从古希腊被领养到现代法国，他们将在现代法国成长为一名公民。那么文化创新是如何发生的呢？嗯，这都是试错的结果。创新的个体向社会引入新的思想，如果大多数人喜欢，社会就会追随他们。如果不喜欢，这些思想就会被抛弃。先知穆罕默德的启发让他创建的宗教成为世界上最大的宗教。拿破仑、马克思和列宁等人是改变社会历史进程的其他例子。一些思想，如穆罕默德的思想，深深植根于社会，而另一些，如拿破仑的思想，最终留给了历史。\n伦理价值观是历史条件的产物，随着时间的推移而变化。 中世纪的人肯定不会有与我们今天相同的道德价值观。例如，他们可能认为焚烧被指控为巫术的人是完全可以接受的。为什么会这样呢？道德标准随着时间的推移而演变；它们并非一成不变。我们作为一个物种的道德随着我们的历史和环境条件的变化而变化。在人类历史的三个主要经济阶段——狩猎、农业和工业——期间，我们的道德准则发生了一些重大变化。在狩猎阶段，男性负责为生存而狩猎，这意味着男性的死亡率实际上更高。这意味着男性要少得多，导致人们期望男性与多个女性繁衍后代。在这个时期，贪婪、野蛮和性侵是生存所需的特征。在农业时代，新的美德变得更为重要。男性必须勤劳、合作和和平，而不是勇敢、攻击性和暴力。孩子实际上是家庭的经济资产，这意味着一夫多妻和堕胎是不被鼓励的。家庭被视为农场的生产单位，这意味着父母的权威至关重要，因为孩子与父母一起工作，必须听从他们的命令。工业革命再次改变了人类的道德观念。在工业时期，随着孩子们长大，鼓励他们离开家庭独自找工作。个体主义优先于团结。孩子不再是经济上的优势，因此婚姻变得不那么重要。城市实际上反对婚姻，而开始鼓励自由恋爱。现代的道德观念仍然会发生变化，就像它们在历史上一样。在100年后，人们可能对什么是对的和错的有完全不同的观点。\n尽管天主教会失去了很多道德权威，但由于给予绝望者希望，其存在得以延续。 在现代世界，将天主教会视为一个过时的机构很容易，但尽管如此，它仍然拥有数千名信徒，这有几个原因。教会最初的目标是促进道德和慈善，但在中世纪变得腐败。在中世纪早期，教会与奴隶制、家族纷争和其他形式的国家冲突和暴力进行斗争，但逐渐地，他们在这些问题上改变了立场。很快，腐败的领导者与天主教会结盟，将其作为获取权力的政治工具。随着时间的推移，教会更加注重通过审判推动正统和宗教教义，而不是注重促进道德和善意的价值观。这就是为什么教会没有参与当今世界上最重要的道德问题之一——废除奴隶制。其他一些团体和机构——通常是由哲学家带头——取得了领导地位。尽管天主教会失去了很多权力，但由于给予人们希望，它在今天仍然强大。在我们现代世界中，人们比以往任何时候都更加世俗化，教会对他们的日常生活影响甚微。法律不再来自上帝；它们是由政治家制定的。接替牧师的是受过专业培训的教师，教会每天都在失去更多的信徒。尽管这是当前的模式，但教会仍然为人们提供了一定程度的安慰，给予他们对未来的希望。即使社会发生了巨大的变化，人们仍然会在其中找到慰藉。天主教会不太可能在短期内完全消失。\n财富的集中是自然的，只能通过强制性的再分配来阻止。 众所周知，税收存在是为了让社会能够重新分配财富。让我们看看历史能给我们带来什么教训。在社会中，财富在人们发挥必要的技能和能力的地方不同程度地集中。竞争是生活的根本，你拥有的技能和能力越多，在这种终身竞赛中表现得越好。这自然导致少数人掌握大多数财富。问题在于，一个社会的财富分配取决于其道德价值观和经济自由。由于民主是一种允许公民最大自由的政府形式，它也将大部分财富置于少数人手中。这就是为什么在1968年的美国，富人和穷人之间存在着一个只有在帝国罗马的精英城市才超过的贫富差距。然而，当一个社会的财富集中达到一个临界点时，就需要进行再分配。历史告诉我们，当贫困人口的实力以数量上的优势使其能够与富人的权力媲美时，无论是通过法律改革还是通过武力，都会发生再分配。这个临界点意味着统治集团的领导有时需要推动改革，自己重新分配财富。这发生在公元前594年的雅典，当时下层阶级考虑发动起义。富人准备用武力捍卫自己，但当时选举产生了雅典贵族政治家索伦，他负责改革体制。他通过减少货币价值解决了这个问题，这减少了债务，使经济更容易生存，并避免了一场彻底的革命。然而，当富人拒绝分享他们的财富时，情况往往会发生变化。当罗马元老院拒绝在类似于希腊的临界点进行财富再分配时，结果导致罗马在公元前133年至公元前30年间发生了阶级之间的内战。\n尽管社会主义实验在历史上失败过多次，但如果与资本主义结合，它们实际上可能会奏效。 社会主义曾被许多社会尝试作为重新分配财富的一种方式，但它总是失败了。社会主义本身并不完全有效，但如果与其他概念结合使用，它可以奏效。为什么会这样呢？在整个历史上，所有的社会主义实验都以失败告终。今天，我们知道现代社会主义，虽然过去曾存在类似的制度，但实际上没有成功过。例如，南美的印加人建立了他们的社会，认为他们的君主是太阳神的代表。印加人认为自己是国家的全部雇员，以换取安全和食物，这意味着国家控制和追踪所有的农业、劳动和贸易。这种社会主义与君主制持续到1533年皮萨罗征服秘鲁。1917年的俄国革命是最经典的社会主义实验，它之所以成功，是因为该国正处于围困之中，那时国家安全比个人自由更重要。这场革命之所以成功，主要是因为人们对战争的持续恐惧。和平的一代削弱了政府，1989年苏联解体。然而，事实证明，如果社会主义理念与资本主义结合起来实施，它们可能会奏效。将这两个概念合并可能实际上会创造出一个更可持续的社会制度。今天的社会主义使人们在物质和智力上拥有更多的自由，从而刺激了他们的总体生产。另一方面，资本主义社会通过福利国家限制了一些绝对的经济自由，并通过再分配财富鼓励。资本主义的威胁促使社会主义思想家扩大自由，而社会主义的威胁则促使资本主义思想家增加平等。然而，在未来，我们可能会看到这两种系统的融合。\n尽管民主是最自然的政体形式，但它相当脆弱，需要受过教育的公民群体。 如今，西方大部分地区都是由民主政府管理的。然而事实是，民主实际上是人类历史上一个相对较新的概念。让我们来审视人类过去发展出的一些政府体制。随着时间的推移，政府大多由精英少数人组成，如寡头政治和君主制。这些人中的大多数从出生就拥有权力（贵族和君主制运作方式），其他一些人则从宗教机构获得权力，如神权政治。历史上大多数所谓的“民主”实际上并非真正的民主，因为直到20世纪，普选权才得以确立。在古希腊的阿提卡地区，即民主的概念诞生之地，只有43,000名315,000名公民被允许投票。妇女、奴隶和几乎所有的劳动人口都被排除在外。尽管如此，在这些被剥夺了投票权的民主国家中，民主仍然被证明是更有益的。民主为科学和企业的发展提供了自由，因为它提供了进行科学和学术研究所需的自由。民主使人们更容易在社会层次中上升，这意味着更聪明的人有机会发展和分享他们的思想。尽管民主很重要，但它也极为脆弱。由于它容易崩溃，因此需要进行维护。即使是最稳定的民主国家也时刻面临被独裁者推翻的威胁。如果一个国家受到战争或经济危机的威胁，一个个体在民主国家更容易利用这一点并上台执政。对于这一点，一个民主社会唯一的防御手段就是教育。只有通过受过教育的人才能抵制这样的腐败领导，理解发生了什么。\n战争在历史上一直存在，和平实际上相当不自然。 在有记录的人类历史中，地球上只有10％的时间没有发生战争。战争似乎是人类的自然状态。但为什么呢？国家和个体实际上表现出类似的方式，但缺乏更大社会的制约。个体不断地为资源（如食物、土地和住所）而互相竞争，然而，在当今世界，由于国家在基本层面上为人们提供了保护，我们对暴力的需求并不像过去那样迫切。作为交换，个体接受了他们社会的行为准则，如道德和法律。国家具有相同的生存需求，但却没有相同的基本保护。没有超级国家、国际法或道德准则可以保护国家，阻止它们相互争斗。因为国家没有国际限制，战争实际上是它们追求所需的自然方式。然而，战争不仅仅是为了确保国家的资源。有些冲突太复杂，不能仅通过谈判解决，这意味着国家转向战争来解决这些问题。例如，在732年，查尔斯·马特尔在图尔之战中击败了穆阿瓦尼军队，从而阻止了伊斯兰对法国和西欧的入侵。如果他没有诉诸战争，今天的欧洲可能会看起来截然不同。战争是我们世界的基本组成部分，实际上是和平是不自然的。国家要想联合起来，在彼此之间保持和平，唯一的方法就是面临共同的威胁。事实上，如果所有国家都以某种方式和平团结起来，竞争将逐渐消失，最终，全球联盟将被内部破坏。当然，世界和平是一个崇高的目标，但除非世界上的每个国家突然被迫团结起来对抗一些外部威胁，否则它可能永远不会真正实现。\n文明不断面临挑战，它们如何应对决定了它们是繁荣还是衰败。 地球上遍布着历史的废墟，从巴比伦到迦太基，从马丘比丘到庞贝。一些社会繁荣昌盛，而另一些则衰败。历史会重演，但只是在其整体故事的框架中。历史告诉我们，所有文明都经历相同的基本循环：开始、繁荣、衰退和消失。未来当然会孕育新的国家，就像旧的国家一样灭亡。新的理论将被制定、传播和废弃；总会有新的发明，以及反叛这些发明的新一代人，创造出新的东西。如今，文明比以往任何时候都更加复杂。当然，不能保证未来一定会完全按照过去的模式发展。地球上的每个文明都在不断面临新的挑战，有机会以新的方式克服它们。事实上，当文明面临困境时，它们实际上会变得更加强大。这可能意味着从物理环境的变化到气候的变化，再到来自外部世界的入侵，或者像统治者与被统治者之间的冲突等内部挑战。国家能够克服挑战，但前提是它们的领导者能够有效地应对这些挑战。这发生在1941年，当时美国受到纳粹的威胁。当他们对纳粹发动进攻时，整个国家变得更加准备好面对未来的其他挑战。问题在于，如果一个文明及其领导者无法妥善应对挑战，可能导致社会的衰败。一个例子是1492年在美洲发现之后，比萨和威尼斯这两个伟大的贸易国家衰落。这两个国家的领导者简单地无法适应全球贸易发生巨变的情况：能够通过海洋贸易，而不仅仅局限于河流和海洋。当一个文明衰落时，它的记忆可能会延续下来。尽管古希腊早已不存在，但柏拉图在现代被阅读的程度超过了他自己时代。\n文明可能会衰落，但其中取得的成就将延续下去，为新文明奠定基础。 想象一下每100年都必须重新发明轮子或印刷机。如果是这样的话，民主和社会也将每次回到原点。幸运的是，情况并非如此：我们能够记录历史和知识，并在其基础上建设。尽管文明可能会衰落，但它们的一些成就将幸存下来。我们不再有伟大的古代文明，但其中许多发明仍然存在于现代社会中。我们仍然使用火、轮子和书写系统。农业、道德和慈善并不是现代概念——它们也来自古代世界。此外，我们今天拥有的知识基础来自于数千年的人类创新。这意味着虽然我们在生物学上并没有发生太大的变化，但今天出生的人类从过去取得的一切成就中受益匪浅。这些成就包括人权和平等、透明的司法体系以及宗教和思想自由。当然，许多这些成就随着时间的推移而不断改进。例如，现代英国的民主制度要比古希腊的民主制度先进得多。而如今，欧洲的人们通常可以在不担心生命安全的情况下自由表达他们的政治观点——这对黑暗时代的人们来说是一种奢侈。此外，教育曾经只为富人和有影响力的人提供，而今天，它是向公众开放的。这意味着如今的知识水平比历史上任何时期都要更高。当这本书出版时，大多数国家都实行了义务教育。尽管如此，面向广大公众的免费教育的理念仍然相对较新。如果它继续取得成功，将来每个人可能都能轻松获得教育。虽然我们并没有在过去的文明中天生具有优势，但我们天生拥有更丰富的文化遗产。这一遗产实际上代表了文明的进步。这意味着随着每一代人的过去，我们的文化遗产会变得更加丰富。\n尽管历史确实在某种程度上重演，但这只是以非常一般的方式进行。文明兴衰，然而我们有能力将知识传递给未来的几代人，这促使人类知识和技术逐渐丰富。每一代新人都面临着新的挑战，倚仗着之前每个人留下的文化遗产。随着教育逐渐向大众开放，未来的几代人将更多地受益。\n","permalink":"https://coriva.eu.org/the-lessons-of-history-summary/","summary":"\u003cp\u003e《The Lessons of History》是由威尔·杜兰特（Will Durant）和阿里尔·杜兰特（Ariel Durant）夫妇合作编写的一本书，它于1968年首次出版。这本书是一部关于历史哲学的作品，从历史的角度探讨了人类社会的发展和演变，并试图从历史中汲取宝贵的教训。\u003c/p\u003e\n\u003ch3 id=\"地理对文明产生了巨大影响但随着技术的进步其影响正在逐渐减弱\"\u003e地理对文明产生了巨大影响，但随着技术的进步，其影响正在逐渐减弱。\u003c/h3\u003e\n\u003cp\u003e想象一下你的家乡。它是在河流、海洋还是湖泊附近？它有良好的铁路连接吗？对这些简单问题的回答可以揭示一个地方的很多信息。这是因为我们建造城市的地理条件实际上对它们的发展有巨大影响。这在整个人类历史中一直如此；人们总是在河流、湖泊、绿洲和海洋附近定居。这不仅仅是因为它们提供水和食物：水体还能促进交通和贸易。考虑下美索不达米亚。这个古老的城市被普遍认为是人类文明的发源地，它建立在幼发拉底和底格里斯两大河流之间的定居点上。位于这两条河流之间的土地使苏美尔人和巴比伦人等文化得以繁荣和建立他们的帝国。许多其他帝国也是在河流旁边建立的：古埃及被称为尼罗河的馈赠，古罗马因其接近台伯河、阿诺河和波河而增长。然而，地理条件是可以改变的。气候的极端变化一直是驱使无数文明迁徙的原因，也是许多文明衰落的原因。如果雨水变得稀缺，就会导致像中亚部分地区那样的文明衰落。相反，如果雨水太多，就像在中美洲某些地区那样，丛林可能会过度生长，以至于淹没整个城市。然而，在近年来，技术已经改变了我们与地理的关系。通过文明技术的演变，如运输货物的技术，地理对文明本身的影响正在减小。关键机器的发明，如飞机、火车和汽车，使运输货物变得更加容易。我们不再受限于沿河流和海洋进行贸易，因为飞机可以直接在我们头上运输货物。这实际上解释了为什么英国和法国在汽车、火车和飞机成为主流后开始失去它们曾经拥有的商业优势。英国和法国不再拥有它们的海岸线曾经给予它们的巨大优势，而俄罗斯、中国和巴西等国也不再受到它们庞大陆地的阻碍。\u003c/p\u003e\n\u003cp\u003e \u003c/p\u003e\n\u003ch3 id=\"生活是竞争的人类并非生来平等\"\u003e生活是竞争的，人类并非生来平等。\u003c/h3\u003e\n\u003cp\u003e你小时候是否曾经在体育课上挑选过队员？如果是的话，你可能会尽量选择尽可能多的运动员。历史，就像体育课一样，本质上是竞争性的，而不是每个人都能够平等匹配。我们天生具有竞争性的本性，而我们的祖先是这种天性的原因。我们的祖先的生存取决于战斗和杀戮，我们从他们那里继承了这种暴力倾向。人们往往相互合作，然而这种社会合作存在的唯一目的是为了给予我们竞争优势。我们主要以群体的形式运作，从家庭到社区再到国家，因为这种群体取向使我们能够与其他群体竞争。我们组建国家是为了保护自己免受其他国家的侵害。只有当它们联合起来，成为一个更大的保护群体的成员时，国家才能停止战斗，从而使它们的生存得到好处。我们对竞争的倾向涉及到一些不同的因素。首先，有必要认识到不平等是自然而然的——减少不平等实际上是以自由为代价的。遗传是人们独特的身体和精神优势——以及劣势——的原因。虽然我们能够随着时间的推移改善自己，但我们的基因无法改变。这意味着人们从出生时就天生不平等。通过社会的不断复杂化，我们的自然不平等变得更加严重。现代社会对于那些专业化技能的人有更大的需求，因此创造更多平等的唯一途径就是限制自由。让我们稍微考虑一下。随着时间的推移，人们变得越来越自由，他们之间的不平等就会越来越大，因为自由使某些人能够获得不公平的经济权力。例如，在19世纪，英格兰和美国采取了一种叫做自由放任的经济政策，即政府尽可能少地干预经济。在这个时期，不平等急剧增加。\u003c/p\u003e\n\u003ch3 id=\"文明的进步与种族无关\"\u003e文明的进步与种族无关。\u003c/h3\u003e\n\u003cp\u003e是什么让欧洲能够孕育出如此先进的技术社会？历史教导许多白人相信他们的种族使他们天生更聪明。但文明不是种族的产物，而是地理的产物。被广泛认为是现代种族思想之父的法国贵族和小说家约瑟夫·亚瑟·戈宾奥（Joseph Arthur, Comte de Gobineau）认为，不同种族的人天生具有不同的身体和智力能力。他认为雅利安种族是最优越的，是文明的创造者。戈宾奥主张，仅仅通过环境的优势无法解释文明的兴起，因为北美的印第安人拥有与古埃及相同的有利条件。他还写道，单单政治制度不能创造文明，因为古希腊是基于民主的，而埃及则是君主制的。这意味着，根据戈宾奥的观点，文明完全是由种族决定的，只有白人才能创造它。他还坚信，白人文明在与其他种族混合时表现不佳。这意味着他认为当时美国的白人由于与土著人没有混血，因此更为优越，与在拉丁美洲的欧洲移民混血的情况形成鲜明对比。戈宾奥的论点很容易被证伪。世界上存在着远离彼此发展的先进文化。中国在古埃及或罗马崛起之前就有了高度发达的文明，而中南美洲的印加、玛雅和印第安文明也有着充分的记载。实际上，古希腊和罗马文明的许多特征都源于更远东的地方。在公元前第二个千年，古希腊实际上从小亚细亚（今天的土耳其）吸取了许多影响。这意味着这一文化的特征然后传承给了我们从历史书中了解到的罗马人。\u003c/p\u003e\n\u003ch3 id=\"我们的个性道德和社会习俗是我们成长的时代和文化的产物\"\u003e我们的个性、道德和社会习俗是我们成长的时代和文化的产物。\u003c/h3\u003e\n\u003cp\u003e很难想象与生活在古代的人们建立起某种联系；他们似乎根本就是不同的。然而，贯穿历史，人类本性在很大程度上并没有发生太大变化。人类的本性直接来自我们成长的文化。人类的本性可能在我们在地球上繁衍的几千年里发生了变化，这可以通过进化来看到，但我们进食、睡眠和繁殖的基本本能仍然保持不变。随着时间的推移，唯一发生了根本变化的是我们的技术。如果一个古希腊公民穿越时空来到现代世界，他们在身体上可能与我们非常相似，但他们对文化的理解将会截然不同。人类的进化是社会的，而非生物的。随着时间的推移，我们的物种经历了巨大的变化：从经济、政治、智力，甚至到道德。但请记住：文化环境决定社会行为。因此，如果一个婴儿可以从古希腊被领养到现代法国，他们将在现代法国成长为一名公民。那么文化创新是如何发生的呢？嗯，这都是试错的结果。创新的个体向社会引入新的思想，如果大多数人喜欢，社会就会追随他们。如果不喜欢，这些思想就会被抛弃。先知穆罕默德的启发让他创建的宗教成为世界上最大的宗教。拿破仑、马克思和列宁等人是改变社会历史进程的其他例子。一些思想，如穆罕默德的思想，深深植根于社会，而另一些，如拿破仑的思想，最终留给了历史。\u003c/p\u003e\n\u003ch3 id=\"伦理价值观是历史条件的产物随着时间的推移而变化\"\u003e伦理价值观是历史条件的产物，随着时间的推移而变化。\u003c/h3\u003e\n\u003cp\u003e中世纪的人肯定不会有与我们今天相同的道德价值观。例如，他们可能认为焚烧被指控为巫术的人是完全可以接受的。为什么会这样呢？道德标准随着时间的推移而演变；它们并非一成不变。我们作为一个物种的道德随着我们的历史和环境条件的变化而变化。在人类历史的三个主要经济阶段——狩猎、农业和工业——期间，我们的道德准则发生了一些重大变化。在狩猎阶段，男性负责为生存而狩猎，这意味着男性的死亡率实际上更高。这意味着男性要少得多，导致人们期望男性与多个女性繁衍后代。在这个时期，贪婪、野蛮和性侵是生存所需的特征。在农业时代，新的美德变得更为重要。男性必须勤劳、合作和和平，而不是勇敢、攻击性和暴力。孩子实际上是家庭的经济资产，这意味着一夫多妻和堕胎是不被鼓励的。家庭被视为农场的生产单位，这意味着父母的权威至关重要，因为孩子与父母一起工作，必须听从他们的命令。工业革命再次改变了人类的道德观念。在工业时期，随着孩子们长大，鼓励他们离开家庭独自找工作。个体主义优先于团结。孩子不再是经济上的优势，因此婚姻变得不那么重要。城市实际上反对婚姻，而开始鼓励自由恋爱。现代的道德观念仍然会发生变化，就像它们在历史上一样。在100年后，人们可能对什么是对的和错的有完全不同的观点。\u003c/p\u003e\n\u003ch3 id=\"尽管天主教会失去了很多道德权威但由于给予绝望者希望其存在得以延续\"\u003e尽管天主教会失去了很多道德权威，但由于给予绝望者希望，其存在得以延续。\u003c/h3\u003e\n\u003cp\u003e在现代世界，将天主教会视为一个过时的机构很容易，但尽管如此，它仍然拥有数千名信徒，这有几个原因。教会最初的目标是促进道德和慈善，但在中世纪变得腐败。在中世纪早期，教会与奴隶制、家族纷争和其他形式的国家冲突和暴力进行斗争，但逐渐地，他们在这些问题上改变了立场。很快，腐败的领导者与天主教会结盟，将其作为获取权力的政治工具。随着时间的推移，教会更加注重通过审判推动正统和宗教教义，而不是注重促进道德和善意的价值观。这就是为什么教会没有参与当今世界上最重要的道德问题之一——废除奴隶制。其他一些团体和机构——通常是由哲学家带头——取得了领导地位。尽管天主教会失去了很多权力，但由于给予人们希望，它在今天仍然强大。在我们现代世界中，人们比以往任何时候都更加世俗化，教会对他们的日常生活影响甚微。法律不再来自上帝；它们是由政治家制定的。接替牧师的是受过专业培训的教师，教会每天都在失去更多的信徒。尽管这是当前的模式，但教会仍然为人们提供了一定程度的安慰，给予他们对未来的希望。即使社会发生了巨大的变化，人们仍然会在其中找到慰藉。天主教会不太可能在短期内完全消失。\u003c/p\u003e\n\u003ch3 id=\"财富的集中是自然的只能通过强制性的再分配来阻止\"\u003e财富的集中是自然的，只能通过强制性的再分配来阻止。\u003c/h3\u003e\n\u003cp\u003e众所周知，税收存在是为了让社会能够重新分配财富。让我们看看历史能给我们带来什么教训。在社会中，财富在人们发挥必要的技能和能力的地方不同程度地集中。竞争是生活的根本，你拥有的技能和能力越多，在这种终身竞赛中表现得越好。这自然导致少数人掌握大多数财富。问题在于，一个社会的财富分配取决于其道德价值观和经济自由。由于民主是一种允许公民最大自由的政府形式，它也将大部分财富置于少数人手中。这就是为什么在1968年的美国，富人和穷人之间存在着一个只有在帝国罗马的精英城市才超过的贫富差距。然而，当一个社会的财富集中达到一个临界点时，就需要进行再分配。历史告诉我们，当贫困人口的实力以数量上的优势使其能够与富人的权力媲美时，无论是通过法律改革还是通过武力，都会发生再分配。这个临界点意味着统治集团的领导有时需要推动改革，自己重新分配财富。这发生在公元前594年的雅典，当时下层阶级考虑发动起义。富人准备用武力捍卫自己，但当时选举产生了雅典贵族政治家索伦，他负责改革体制。他通过减少货币价值解决了这个问题，这减少了债务，使经济更容易生存，并避免了一场彻底的革命。然而，当富人拒绝分享他们的财富时，情况往往会发生变化。当罗马元老院拒绝在类似于希腊的临界点进行财富再分配时，结果导致罗马在公元前133年至公元前30年间发生了阶级之间的内战。\u003c/p\u003e\n\u003ch3 id=\"尽管社会主义实验在历史上失败过多次但如果与资本主义结合它们实际上可能会奏效\"\u003e尽管社会主义实验在历史上失败过多次，但如果与资本主义结合，它们实际上可能会奏效。\u003c/h3\u003e\n\u003cp\u003e社会主义曾被许多社会尝试作为重新分配财富的一种方式，但它总是失败了。社会主义本身并不完全有效，但如果与其他概念结合使用，它可以奏效。为什么会这样呢？在整个历史上，所有的社会主义实验都以失败告终。今天，我们知道现代社会主义，虽然过去曾存在类似的制度，但实际上没有成功过。例如，南美的印加人建立了他们的社会，认为他们的君主是太阳神的代表。印加人认为自己是国家的全部雇员，以换取安全和食物，这意味着国家控制和追踪所有的农业、劳动和贸易。这种社会主义与君主制持续到1533年皮萨罗征服秘鲁。1917年的俄国革命是最经典的社会主义实验，它之所以成功，是因为该国正处于围困之中，那时国家安全比个人自由更重要。这场革命之所以成功，主要是因为人们对战争的持续恐惧。和平的一代削弱了政府，1989年苏联解体。然而，事实证明，如果社会主义理念与资本主义结合起来实施，它们可能会奏效。将这两个概念合并可能实际上会创造出一个更可持续的社会制度。今天的社会主义使人们在物质和智力上拥有更多的自由，从而刺激了他们的总体生产。另一方面，资本主义社会通过福利国家限制了一些绝对的经济自由，并通过再分配财富鼓励。资本主义的威胁促使社会主义思想家扩大自由，而社会主义的威胁则促使资本主义思想家增加平等。然而，在未来，我们可能会看到这两种系统的融合。\u003c/p\u003e\n\u003ch3 id=\"尽管民主是最自然的政体形式但它相当脆弱需要受过教育的公民群体\"\u003e尽管民主是最自然的政体形式，但它相当脆弱，需要受过教育的公民群体。\u003c/h3\u003e\n\u003cp\u003e如今，西方大部分地区都是由民主政府管理的。然而事实是，民主实际上是人类历史上一个相对较新的概念。让我们来审视人类过去发展出的一些政府体制。随着时间的推移，政府大多由精英少数人组成，如寡头政治和君主制。这些人中的大多数从出生就拥有权力（贵族和君主制运作方式），其他一些人则从宗教机构获得权力，如神权政治。历史上大多数所谓的“民主”实际上并非真正的民主，因为直到20世纪，普选权才得以确立。在古希腊的阿提卡地区，即民主的概念诞生之地，只有43,000名315,000名公民被允许投票。妇女、奴隶和几乎所有的劳动人口都被排除在外。尽管如此，在这些被剥夺了投票权的民主国家中，民主仍然被证明是更有益的。民主为科学和企业的发展提供了自由，因为它提供了进行科学和学术研究所需的自由。民主使人们更容易在社会层次中上升，这意味着更聪明的人有机会发展和分享他们的思想。尽管民主很重要，但它也极为脆弱。由于它容易崩溃，因此需要进行维护。即使是最稳定的民主国家也时刻面临被独裁者推翻的威胁。如果一个国家受到战争或经济危机的威胁，一个个体在民主国家更容易利用这一点并上台执政。对于这一点，一个民主社会唯一的防御手段就是教育。只有通过受过教育的人才能抵制这样的腐败领导，理解发生了什么。\u003c/p\u003e\n\u003ch3 id=\"战争在历史上一直存在和平实际上相当不自然\"\u003e战争在历史上一直存在，和平实际上相当不自然。\u003c/h3\u003e\n\u003cp\u003e在有记录的人类历史中，地球上只有10％的时间没有发生战争。战争似乎是人类的自然状态。但为什么呢？国家和个体实际上表现出类似的方式，但缺乏更大社会的制约。个体不断地为资源（如食物、土地和住所）而互相竞争，然而，在当今世界，由于国家在基本层面上为人们提供了保护，我们对暴力的需求并不像过去那样迫切。作为交换，个体接受了他们社会的行为准则，如道德和法律。国家具有相同的生存需求，但却没有相同的基本保护。没有超级国家、国际法或道德准则可以保护国家，阻止它们相互争斗。因为国家没有国际限制，战争实际上是它们追求所需的自然方式。然而，战争不仅仅是为了确保国家的资源。有些冲突太复杂，不能仅通过谈判解决，这意味着国家转向战争来解决这些问题。例如，在732年，查尔斯·马特尔在图尔之战中击败了穆阿瓦尼军队，从而阻止了伊斯兰对法国和西欧的入侵。如果他没有诉诸战争，今天的欧洲可能会看起来截然不同。战争是我们世界的基本组成部分，实际上是和平是不自然的。国家要想联合起来，在彼此之间保持和平，唯一的方法就是面临共同的威胁。事实上，如果所有国家都以某种方式和平团结起来，竞争将逐渐消失，最终，全球联盟将被内部破坏。当然，世界和平是一个崇高的目标，但除非世界上的每个国家突然被迫团结起来对抗一些外部威胁，否则它可能永远不会真正实现。\u003c/p\u003e\n\u003ch3 id=\"文明不断面临挑战它们如何应对决定了它们是繁荣还是衰败\"\u003e文明不断面临挑战，它们如何应对决定了它们是繁荣还是衰败。\u003c/h3\u003e\n\u003cp\u003e地球上遍布着历史的废墟，从巴比伦到迦太基，从马丘比丘到庞贝。一些社会繁荣昌盛，而另一些则衰败。历史会重演，但只是在其整体故事的框架中。历史告诉我们，所有文明都经历相同的基本循环：开始、繁荣、衰退和消失。未来当然会孕育新的国家，就像旧的国家一样灭亡。新的理论将被制定、传播和废弃；总会有新的发明，以及反叛这些发明的新一代人，创造出新的东西。如今，文明比以往任何时候都更加复杂。当然，不能保证未来一定会完全按照过去的模式发展。地球上的每个文明都在不断面临新的挑战，有机会以新的方式克服它们。事实上，当文明面临困境时，它们实际上会变得更加强大。这可能意味着从物理环境的变化到气候的变化，再到来自外部世界的入侵，或者像统治者与被统治者之间的冲突等内部挑战。国家能够克服挑战，但前提是它们的领导者能够有效地应对这些挑战。这发生在1941年，当时美国受到纳粹的威胁。当他们对纳粹发动进攻时，整个国家变得更加准备好面对未来的其他挑战。问题在于，如果一个文明及其领导者无法妥善应对挑战，可能导致社会的衰败。一个例子是1492年在美洲发现之后，比萨和威尼斯这两个伟大的贸易国家衰落。这两个国家的领导者简单地无法适应全球贸易发生巨变的情况：能够通过海洋贸易，而不仅仅局限于河流和海洋。当一个文明衰落时，它的记忆可能会延续下来。尽管古希腊早已不存在，但柏拉图在现代被阅读的程度超过了他自己时代。\u003c/p\u003e\n\u003ch3 id=\"文明可能会衰落但其中取得的成就将延续下去为新文明奠定基础\"\u003e文明可能会衰落，但其中取得的成就将延续下去，为新文明奠定基础。\u003c/h3\u003e\n\u003cp\u003e想象一下每100年都必须重新发明轮子或印刷机。如果是这样的话，民主和社会也将每次回到原点。幸运的是，情况并非如此：我们能够记录历史和知识，并在其基础上建设。尽管文明可能会衰落，但它们的一些成就将幸存下来。我们不再有伟大的古代文明，但其中许多发明仍然存在于现代社会中。我们仍然使用火、轮子和书写系统。农业、道德和慈善并不是现代概念——它们也来自古代世界。此外，我们今天拥有的知识基础来自于数千年的人类创新。这意味着虽然我们在生物学上并没有发生太大的变化，但今天出生的人类从过去取得的一切成就中受益匪浅。这些成就包括人权和平等、透明的司法体系以及宗教和思想自由。当然，许多这些成就随着时间的推移而不断改进。例如，现代英国的民主制度要比古希腊的民主制度先进得多。而如今，欧洲的人们通常可以在不担心生命安全的情况下自由表达他们的政治观点——这对黑暗时代的人们来说是一种奢侈。此外，教育曾经只为富人和有影响力的人提供，而今天，它是向公众开放的。这意味着如今的知识水平比历史上任何时期都要更高。当这本书出版时，大多数国家都实行了义务教育。尽管如此，面向广大公众的免费教育的理念仍然相对较新。如果它继续取得成功，将来每个人可能都能轻松获得教育。虽然我们并没有在过去的文明中天生具有优势，但我们天生拥有更丰富的文化遗产。这一遗产实际上代表了文明的进步。这意味着随着每一代人的过去，我们的文化遗产会变得更加丰富。\u003c/p\u003e\n\u003cp\u003e \u003c/p\u003e\n\u003cp\u003e尽管历史确实在某种程度上重演，但这只是以非常一般的方式进行。文明兴衰，然而我们有能力将知识传递给未来的几代人，这促使人类知识和技术逐渐丰富。每一代新人都面临着新的挑战，倚仗着之前每个人留下的文化遗产。随着教育逐渐向大众开放，未来的几代人将更多地受益。\u003c/p\u003e","title":"《历史的教训》精要"},{"content":"When I click a link in Outlook, it opens in Edge even though Chrome is the default web application. I\u0026rsquo;ve verified that in Apps \u0026gt; Default Apps that Google Chrome is the default web browser.\nHere is the solution:\nChange the default browser for Outlook:\nOpen Outlook\nFile\nOptions\nAdvanced\nFile and browser preferences\nOpen hyperlinks from Outlook in: Choose Default Browser\nRestart Outlook\nChange the default browser for Windows 11:\nGo to Settings \u0026raquo; Apps \u0026raquo; Default Apps\nFind your preferred browser in the list and click on it.\nClick the button \u0026lsquo;Set default\u0026rsquo;\n","permalink":"https://coriva.eu.org/open-hyperlinks-from-outlook-in-chrome/","summary":"\u003cp\u003eWhen I click a link in Outlook, it opens in Edge even though Chrome is the default web application. I\u0026rsquo;ve verified that in Apps \u0026gt; Default Apps that Google Chrome is the default web browser.\u003c/p\u003e\n\u003cp\u003eHere is the solution:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eChange the default browser for Outlook:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003eOpen Outlook\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFile\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eOptions\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAdvanced\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFile and browser preferences\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eOpen hyperlinks from Outlook in: Choose \u003cstrong\u003eDefault Browser\u003c/strong\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eRestart Outlook\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003eChange the default browser for Windows 11:\u003c/strong\u003e\u003c/p\u003e","title":"Open Hyperlinks from Outlook in Chrome"},{"content":"北大口腔挂号有多难大家都很清楚，今天就让ChatGPT写一个挂号程序，可惜挂号部分写得太潦草，跟没写一样：\nimport datetime class PekingUniversityStomatologyHospital: def __init__(self): self.departments = [\u0026#34;口腔科\u0026#34;, \u0026#34;牙周病科\u0026#34;, \u0026#34;口腔颌面外科\u0026#34;] self.doctors = { \u0026#34;口腔科\u0026#34;: [\u0026#34;张医生\u0026#34;, \u0026#34;王医生\u0026#34;], \u0026#34;牙周病科\u0026#34;: [\u0026#34;李医生\u0026#34;, \u0026#34;赵医生\u0026#34;], \u0026#34;口腔颌面外科\u0026#34;: [\u0026#34;陈医生\u0026#34;, \u0026#34;刘医生\u0026#34;] } self.appointment_records = [] def get_departments(self): return self.departments def get_doctors(self, department): return self.doctors.get(department, []) def make_appointment(self, department, doctor, date, time): appointment_info = { \u0026#34;Department\u0026#34;: department, \u0026#34;Doctor\u0026#34;: doctor, \u0026#34;DateTime\u0026#34;: datetime.datetime.strptime(f\u0026#34;{date} {time}\u0026#34;, \u0026#34;%Y-%m-%d %H:%M\u0026#34;), \u0026#34;Status\u0026#34;: \u0026#34;Scheduled\u0026#34; # 预约状态，可根据实际情况添加更多状态 } self.appointment_records.append(appointment_info) return appointment_info # 使用示例 hospital = PekingUniversityStomatologyHospital() # 获取科室列表 departments_list = hospital.get_departments() print(\u0026#34;科室列表:\u0026#34;, departments_list) # 获取口腔科医生列表 dentistry_doctors_list = hospital.get_doctors(\u0026#34;口腔科\u0026#34;) print(\u0026#34;口腔科医生列表:\u0026#34;, dentistry_doctors_list) # 挂号 appointment_info = hospital.make_appointment(\u0026#34;口腔科\u0026#34;, \u0026#34;张医生\u0026#34;, \u0026#34;2023-01-01\u0026#34;, \u0026#34;09:00\u0026#34;) print(\u0026#34;挂号成功:\u0026#34;, appointment_info) # 查看挂号记录 print(\u0026#34;挂号记录:\u0026#34;, hospital.appointment_records) ","permalink":"https://coriva.eu.org/bjmu-appointment-code/","summary":"\u003cp\u003e北大口腔挂号有多难大家都很清楚，今天就让ChatGPT写一个挂号程序，可惜挂号部分写得太潦草，跟没写一样：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eimport datetime\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eclass PekingUniversityStomatologyHospital:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    def __init__(self):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        self.departments = [\u0026#34;口腔科\u0026#34;, \u0026#34;牙周病科\u0026#34;, \u0026#34;口腔颌面外科\u0026#34;]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        self.doctors = {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u0026#34;口腔科\u0026#34;: [\u0026#34;张医生\u0026#34;, \u0026#34;王医生\u0026#34;],\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u0026#34;牙周病科\u0026#34;: [\u0026#34;李医生\u0026#34;, \u0026#34;赵医生\u0026#34;],\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u0026#34;口腔颌面外科\u0026#34;: [\u0026#34;陈医生\u0026#34;, \u0026#34;刘医生\u0026#34;]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        self.appointment_records = []\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    def get_departments(self):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        return self.departments\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    def get_doctors(self, department):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        return self.doctors.get(department, [])\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    def make_appointment(self, department, doctor, date, time):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        appointment_info = {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u0026#34;Department\u0026#34;: department,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u0026#34;Doctor\u0026#34;: doctor,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u0026#34;DateTime\u0026#34;: datetime.datetime.strptime(f\u0026#34;{date} {time}\u0026#34;, \u0026#34;%Y-%m-%d %H:%M\u0026#34;),\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u0026#34;Status\u0026#34;: \u0026#34;Scheduled\u0026#34;  # 预约状态，可根据实际情况添加更多状态\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        self.appointment_records.append(appointment_info)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        return appointment_info\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e# 使用示例\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ehospital = PekingUniversityStomatologyHospital()\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e# 获取科室列表\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edepartments_list = hospital.get_departments()\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u0026#34;科室列表:\u0026#34;, departments_list)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e# 获取口腔科医生列表\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edentistry_doctors_list = hospital.get_doctors(\u0026#34;口腔科\u0026#34;)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u0026#34;口腔科医生列表:\u0026#34;, dentistry_doctors_list)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e# 挂号\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eappointment_info = hospital.make_appointment(\u0026#34;口腔科\u0026#34;, \u0026#34;张医生\u0026#34;, \u0026#34;2023-01-01\u0026#34;, \u0026#34;09:00\u0026#34;)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u0026#34;挂号成功:\u0026#34;, appointment_info)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e# 查看挂号记录\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u0026#34;挂号记录:\u0026#34;, hospital.appointment_records)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"ChatGPT写的北大口腔挂号程序"},{"content":"检索增强生成（Retrieval-Augmented Generation，简称RAG）是一种新的自然语言处理（NLP）方法，它将预训练的参数化和非参数化记忆相结合，旨在提高知识密集型NLP任务的性能。本文将探讨RAG框架及其在NLP领域的潜在应用。\n大型预训练语言模型（如BERT和GPT-3）在许多NLP任务上取得了令人瞩目的成果。然而，当涉及到访问和操作外部知识时，这些模型存在局限性。虽然它们可以编码和解码自然语言文本，但它们缺乏推理世界和利用外部知识源的能力。\n这对于知识密集型NLP任务是一个重要的限制，例如问答和对话生成，这些任务需要访问大量的外部知识。这些任务的现有方法通常涉及基于检索的方法，这些方法依赖于外部知识源来检索相关信息，或者生成方法，这些方法使用预训练的语言模型来生成响应。\nRAG框架将这两种方法结合起来，通过将预训练的seq2seq transformer模型与Wikipedia的密集向量索引相结合，使用预训练的神经检索器来访问外部知识源。检索器提供与输入条件相关的潜在文档，seq2seq模型则在这些潜在文档和输入的条件下生成输出。\nRAG的关键创新在于预训练参数化和非参数化记忆的结合。参数化记忆是预训练的seq2seq模型，它提供了闭书方法的生成灵活性。非参数化记忆是Wikipedia的密集向量索引，它提供了开书检索方法的性能。\nRAG模型可以在任何seq2seq任务上进行微调，生成器和检索器都可以同时学习。RAG模型可以训练生成答案，即使可以提取答案。包含有关答案线索但不包含答案的文档仍然可以对生成正确答案做出贡献，这是标准提取方法所不可能的。\nRAG模型在NLP领域有重要的潜在应用。其中一个潜在应用是在聊天机器人和虚拟助手中，RAG模型可以用于提供更复杂和有效的人机交流。RAG模型还可以用于信息检索系统，可以用于提供更准确和相关的搜索结果。\nRAG模型的另一个潜在应用是在教育领域。RAG模型可以用于提供个性化的学习体验，学生可以提出问题并获得适合其个人需求的答案。RAG模型还可以用于提供书面作业的自动反馈，为学生提供比目前可能的更详细和有用的反馈。\n总之，检索增强生成是一种有前途的自然语言处理方法，它将闭书方法的生成灵活性与开书检索方法的性能相结合。RAG模型在许多领域具有重要的潜在应用，包括聊天机器人、虚拟助手、信息检索和教育。随着NLP领域的不断发展，RAG模型在实现人机交流方面将发挥越来越重要的作用。\n","permalink":"https://coriva.eu.org/intro-to-rag/","summary":"\u003cp\u003e检索增强生成（Retrieval-Augmented Generation，简称RAG）是一种新的自然语言处理（NLP）方法，它将预训练的参数化和非参数化记忆相结合，旨在提高知识密集型NLP任务的性能。本文将探讨RAG框架及其在NLP领域的潜在应用。\u003c/p\u003e\n\u003cp\u003e大型预训练语言模型（如BERT和GPT-3）在许多NLP任务上取得了令人瞩目的成果。然而，当涉及到访问和操作外部知识时，这些模型存在局限性。虽然它们可以编码和解码自然语言文本，但它们缺乏推理世界和利用外部知识源的能力。\u003c/p\u003e\n\u003cp\u003e这对于知识密集型NLP任务是一个重要的限制，例如问答和对话生成，这些任务需要访问大量的外部知识。这些任务的现有方法通常涉及基于检索的方法，这些方法依赖于外部知识源来检索相关信息，或者生成方法，这些方法使用预训练的语言模型来生成响应。\u003c/p\u003e\n\u003cp\u003eRAG框架将这两种方法结合起来，通过将预训练的seq2seq transformer模型与Wikipedia的密集向量索引相结合，使用预训练的神经检索器来访问外部知识源。检索器提供与输入条件相关的潜在文档，seq2seq模型则在这些潜在文档和输入的条件下生成输出。\u003c/p\u003e\n\u003cp\u003eRAG的关键创新在于预训练参数化和非参数化记忆的结合。参数化记忆是预训练的seq2seq模型，它提供了闭书方法的生成灵活性。非参数化记忆是Wikipedia的密集向量索引，它提供了开书检索方法的性能。\u003c/p\u003e\n\u003cp\u003eRAG模型可以在任何seq2seq任务上进行微调，生成器和检索器都可以同时学习。RAG模型可以训练生成答案，即使可以提取答案。包含有关答案线索但不包含答案的文档仍然可以对生成正确答案做出贡献，这是标准提取方法所不可能的。\u003c/p\u003e\n\u003cp\u003eRAG模型在NLP领域有重要的潜在应用。其中一个潜在应用是在聊天机器人和虚拟助手中，RAG模型可以用于提供更复杂和有效的人机交流。RAG模型还可以用于信息检索系统，可以用于提供更准确和相关的搜索结果。\u003c/p\u003e\n\u003cp\u003eRAG模型的另一个潜在应用是在教育领域。RAG模型可以用于提供个性化的学习体验，学生可以提出问题并获得适合其个人需求的答案。RAG模型还可以用于提供书面作业的自动反馈，为学生提供比目前可能的更详细和有用的反馈。\u003c/p\u003e\n\u003cp\u003e总之，检索增强生成是一种有前途的自然语言处理方法，它将闭书方法的生成灵活性与开书检索方法的性能相结合。RAG模型在许多领域具有重要的潜在应用，包括聊天机器人、虚拟助手、信息检索和教育。随着NLP领域的不断发展，RAG模型在实现人机交流方面将发挥越来越重要的作用。\u003c/p\u003e","title":"检索增强生成（RAG）简介"},{"content":"纽约时间比加州时间早三个小时， New York is 3 hours ahead of California,\n但加州时间并没有变慢。 but it does not make California slow.\n有人22岁就毕业了， Someone graduated at the age of 22,\n但等了五年才找到好的工作！ but waited 5 years before securing a good job!\n有人25岁就当上CEO， Someone became a CEO at 25,\n却在50岁去世。 and died at 50.\n也有人迟到50岁才当上CEO， While another became a CEO at 50,\n然后活到90岁。 and lived to 90 years.\n有人依然单身， Someone is still single,\n同时也有人已婚。 while someone else got married.\n奥巴马55岁就退休， Obama retires at 55,\n川普70岁才开始当总统。 but Trump starts at 70.\n世上每个人本来就有自己的时区。 Absolutely everyone in this world works based on their Time Zone.\n身边有些人看似走在你前面， People around you might seem to go ahead of you,\n也有人看似走在你后面。 some might seem to be behind you.\n但其实每个人在自己的时区有自己的步程。 But everyone is running their own RACE, in their own TIME.\n不用嫉妒或嘲笑他们。 Don’t envy them or mock them.\n他们都在自己的时区里，你也是！ They are in their TIME ZONE, and you are in yours!\n生命就是等待正确的行动时机。 Life is about waiting for the right moment to act.\n所以，放轻松。 So, RELAX.\n你没有落后。 You’re not LATE.\n你没有领先。 You’re not EARLY.\n在命运为你安排的属于自己的时区里，一切都准时。 You are very much ON TIME, and in your TIME ZONE Destiny set up for you.\n","permalink":"https://coriva.eu.org/everyone-works-based-on-their-timezone/","summary":"\u003cp\u003e纽约时间比加州时间早三个小时，\nNew York is 3 hours ahead of California,\u003c/p\u003e\n\u003cp\u003e但加州时间并没有变慢。\nbut it does not make California slow.\u003c/p\u003e\n\u003cp\u003e有人22岁就毕业了，\nSomeone graduated at the age of 22,\u003c/p\u003e\n\u003cp\u003e但等了五年才找到好的工作！\nbut waited 5 years before securing a good job!\u003c/p\u003e\n\u003cp\u003e有人25岁就当上CEO，\nSomeone became a CEO at 25,\u003c/p\u003e\n\u003cp\u003e却在50岁去世。\nand died at 50.\u003c/p\u003e\n\u003cp\u003e也有人迟到50岁才当上CEO，\nWhile another became a CEO at 50,\u003c/p\u003e\n\u003cp\u003e然后活到90岁。\nand lived to 90 years.\u003c/p\u003e\n\u003cp\u003e有人依然单身，\nSomeone is still single,\u003c/p\u003e\n\u003cp\u003e同时也有人已婚。\nwhile someone else got married.\u003c/p\u003e","title":"每个人都有自己的时区"},{"content":"The issue:\nCannot change Permalink structure to any one except Plain. Otherwise, the post will return 404.\nUpdate any post will fail with message: \u0026ldquo;Updating Failed. The Response is Not a Valid JSON Response\u0026rdquo;\nThe initial nginx config:\nserver { server_name example.com; ... root /var/www/wordpress; index index.php index.html; location / { try_files $uri $uri/ $uri.html =404; } ... } Finally I found that the root cause is that nginx cannot redirect subpath to wordpress.\nSince the Plain permalink has no subpath but with query string only: https://52.175.32.36/?p=123, the above nginx config works fine. When we change the permalink structure, the above rule cannot handle the subpath routing.\nSo we should modify the above rule like this and restart nginx:\nserver { server_name example.com; ... root /var/www/wordpress; index index.php index.html; location / { # file ($uri) or directory ($uri/)? if not, redirect to /index.php + query string try_files $uri $uri/ /index.php?$args; index index.html index.htm index.php; } ... } ","permalink":"https://coriva.eu.org/wordpress-permalinks-404-issue-solution/","summary":"\u003cp\u003eThe issue:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eCannot change Permalink structure to any one except Plain. Otherwise, the post will return 404.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUpdate any post will fail with message: \u0026ldquo;Updating Failed. The Response is Not a Valid JSON Response\u0026rdquo;\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThe initial nginx config:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eserver {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    server_name example\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003ecom;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#f92672\"\u003e...\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    root \u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003e\u003cspan style=\"color:#66d9ef\"\u003evar\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003ewww\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003ewordpress;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    index index\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003ephp index\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003ehtml;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    location \u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        try_files \u003cspan style=\"color:#f92672\"\u003e$\u003c/span\u003euri \u003cspan style=\"color:#f92672\"\u003e$\u003c/span\u003euri\u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e$\u003c/span\u003euri\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003ehtml \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#ae81ff\"\u003e404\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#f92672\"\u003e...\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eFinally I found that the root cause is that \u003cstrong\u003enginx cannot redirect subpath to wordpress\u003c/strong\u003e.\u003c/p\u003e","title":"WordPress Permalinks 404 Issue Solution"},{"content":"《俞军产品方法论》是一部深刻而实用的产品管理经典，作者俞军以其丰富的经验和独到的见解，系统总结了产品经理在推动产品发展过程中所需掌握的方法和技能。通过阅读这本书，读者不仅能够深感受益匪浅，而且能够对产品经理这个职业有更为清晰的认识，明白了他们在公司中的战略地位。\n首先，书中强调了产品经理的核心职责和使命。俞军认为，产品经理应该是一位全面发展的专业经理人，而非只关注技术或市场的专家。他强调了产品经理在整个产品生命周期中的重要性，从产品的构思、规划、设计，到上线后的运营和改进，产品经理都需要有全局的视野和深入的理解。这一观点使读者对产品经理这个职业有了更为清晰的认识。\n其次，俞军在书中提出了一系列实用的产品方法论。他系统地介绍了产品经理在不同阶段的工作重点和方法，涵盖了市场调研、用户需求分析、竞品分析、产品设计、团队协作等方面。特别是在产品设计和迭代的过程中，作者提出了“快速迭代”、“用户反馈迭代”等策略，强调了敏捷开发和用户导向的理念。这些方法论的提出，为产品经理提供了具体的工作指导，使其更好地应对复杂多变的市场环境。\n在书中，俞军还分享了自己在创业和产品管理方面的心得体会，通过案例分析和个人经历，为读者提供了丰富的实战经验。他讲述了成功的产品背后的故事，以及在团队协作、决策制定等方面的经验教训。这些实例不仅生动有趣，而且极大地增强了读者对方法论的理解和信心，使之更具实际操作性。\n总的来说，读完《俞军产品方法论》，启发良多。这本书不仅提供了系统全面的产品管理知识体系，而且结合作者丰富的实战经验，为产品经理提供了实用的方法论和策略。通过深入理解和应用这些理念，相信产品经理能够更好地在复杂多变的市场中推动产品的成功发展。这是一本值得反复阅读和深入思考的产品管理经典。\n","permalink":"https://coriva.eu.org/yujunproduct/","summary":"\u003cp\u003e《俞军产品方法论》是一部深刻而实用的产品管理经典，作者俞军以其丰富的经验和独到的见解，系统总结了产品经理在推动产品发展过程中所需掌握的方法和技能。通过阅读这本书，读者不仅能够深感受益匪浅，而且能够对产品经理这个职业有更为清晰的认识，明白了他们在公司中的战略地位。\u003c/p\u003e\n\u003cp\u003e首先，书中强调了产品经理的核心职责和使命。俞军认为，产品经理应该是一位全面发展的专业经理人，而非只关注技术或市场的专家。他强调了产品经理在整个产品生命周期中的重要性，从产品的构思、规划、设计，到上线后的运营和改进，产品经理都需要有全局的视野和深入的理解。这一观点使读者对产品经理这个职业有了更为清晰的认识。\u003c/p\u003e\n\u003cp\u003e其次，俞军在书中提出了一系列实用的产品方法论。他系统地介绍了产品经理在不同阶段的工作重点和方法，涵盖了市场调研、用户需求分析、竞品分析、产品设计、团队协作等方面。特别是在产品设计和迭代的过程中，作者提出了“快速迭代”、“用户反馈迭代”等策略，强调了敏捷开发和用户导向的理念。这些方法论的提出，为产品经理提供了具体的工作指导，使其更好地应对复杂多变的市场环境。\u003c/p\u003e\n\u003cp\u003e在书中，俞军还分享了自己在创业和产品管理方面的心得体会，通过案例分析和个人经历，为读者提供了丰富的实战经验。他讲述了成功的产品背后的故事，以及在团队协作、决策制定等方面的经验教训。这些实例不仅生动有趣，而且极大地增强了读者对方法论的理解和信心，使之更具实际操作性。\u003c/p\u003e\n\u003cp\u003e总的来说，读完《俞军产品方法论》，启发良多。这本书不仅提供了系统全面的产品管理知识体系，而且结合作者丰富的实战经验，为产品经理提供了实用的方法论和策略。通过深入理解和应用这些理念，相信产品经理能够更好地在复杂多变的市场中推动产品的成功发展。这是一本值得反复阅读和深入思考的产品管理经典。\u003c/p\u003e","title":"《俞军产品方法论》书评"}]